stm32bt6702.lss 2.5 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742367433674436745367463674736748367493675036751367523675336754367553675636757367583675936760367613676236763367643676536766367673676836769367703677136772367733677436775367763677736778367793678036781367823678336784367853678636787367883678936790367913679236793367943679536796367973679836799368003680136802368033680436805368063680736808368093681036811368123681336814368153681636817368183681936820368213682236823368243682536826368273682836829368303683136832368333683436835368363683736838368393684036841368423684336844368453684636847368483684936850368513685236853368543685536856368573685836859368603686136862368633686436865368663686736868368693687036871368723687336874368753687636877368783687936880368813688236883368843688536886368873688836889368903689136892368933689436895368963689736898368993690036901369023690336904369053690636907369083690936910369113691236913369143691536916369173691836919369203692136922369233692436925369263692736928369293693036931369323693336934369353693636937369383693936940369413694236943369443694536946369473694836949369503695136952369533695436955369563695736958369593696036961369623696336964369653696636967369683696936970369713697236973369743697536976369773697836979369803698136982369833698436985369863698736988369893699036991369923699336994369953699636997369983699937000370013700237003370043700537006370073700837009370103701137012370133701437015370163701737018370193702037021370223702337024370253702637027370283702937030370313703237033370343703537036370373703837039370403704137042370433704437045370463704737048370493705037051370523705337054370553705637057370583705937060370613706237063370643706537066370673706837069370703707137072370733707437075370763707737078370793708037081370823708337084370853708637087370883708937090370913709237093370943709537096370973709837099371003710137102371033710437105371063710737108371093711037111371123711337114371153711637117371183711937120371213712237123371243712537126371273712837129371303713137132371333713437135371363713737138371393714037141371423714337144371453714637147371483714937150371513715237153371543715537156371573715837159371603716137162371633716437165371663716737168371693717037171371723717337174371753717637177371783717937180371813718237183371843718537186371873718837189371903719137192371933719437195371963719737198371993720037201372023720337204372053720637207372083720937210372113721237213372143721537216372173721837219372203722137222372233722437225372263722737228372293723037231372323723337234372353723637237372383723937240372413724237243372443724537246372473724837249372503725137252372533725437255372563725737258372593726037261372623726337264372653726637267372683726937270372713727237273372743727537276372773727837279372803728137282372833728437285372863728737288372893729037291372923729337294372953729637297372983729937300373013730237303373043730537306373073730837309373103731137312373133731437315373163731737318373193732037321373223732337324373253732637327373283732937330373313733237333373343733537336373373733837339373403734137342373433734437345373463734737348373493735037351373523735337354373553735637357373583735937360373613736237363373643736537366373673736837369373703737137372373733737437375373763737737378373793738037381373823738337384373853738637387373883738937390373913739237393373943739537396373973739837399374003740137402374033740437405374063740737408374093741037411374123741337414374153741637417374183741937420374213742237423374243742537426374273742837429374303743137432374333743437435374363743737438374393744037441374423744337444374453744637447374483744937450374513745237453374543745537456374573745837459374603746137462374633746437465374663746737468374693747037471374723747337474374753747637477374783747937480374813748237483374843748537486374873748837489374903749137492374933749437495374963749737498374993750037501375023750337504375053750637507375083750937510375113751237513375143751537516375173751837519375203752137522375233752437525375263752737528375293753037531375323753337534375353753637537375383753937540375413754237543375443754537546375473754837549375503755137552375533755437555375563755737558375593756037561375623756337564375653756637567375683756937570375713757237573375743757537576375773757837579375803758137582375833758437585375863758737588375893759037591375923759337594375953759637597375983759937600376013760237603376043760537606376073760837609376103761137612376133761437615376163761737618376193762037621376223762337624376253762637627376283762937630376313763237633376343763537636376373763837639376403764137642376433764437645376463764737648376493765037651376523765337654376553765637657376583765937660376613766237663376643766537666376673766837669376703767137672376733767437675376763767737678376793768037681376823768337684376853768637687376883768937690376913769237693376943769537696376973769837699377003770137702377033770437705377063770737708377093771037711377123771337714377153771637717377183771937720377213772237723377243772537726377273772837729377303773137732377333773437735377363773737738377393774037741377423774337744377453774637747377483774937750377513775237753377543775537756377573775837759377603776137762377633776437765377663776737768377693777037771377723777337774377753777637777377783777937780377813778237783377843778537786377873778837789377903779137792377933779437795377963779737798377993780037801378023780337804378053780637807378083780937810378113781237813378143781537816378173781837819378203782137822378233782437825378263782737828378293783037831378323783337834378353783637837378383783937840378413784237843378443784537846378473784837849378503785137852378533785437855378563785737858378593786037861378623786337864378653786637867378683786937870378713787237873378743787537876378773787837879378803788137882378833788437885378863788737888378893789037891378923789337894378953789637897378983789937900379013790237903379043790537906379073790837909379103791137912379133791437915379163791737918379193792037921379223792337924379253792637927379283792937930379313793237933379343793537936379373793837939379403794137942379433794437945379463794737948379493795037951379523795337954379553795637957379583795937960379613796237963379643796537966379673796837969379703797137972379733797437975379763797737978379793798037981379823798337984379853798637987379883798937990379913799237993379943799537996379973799837999380003800138002380033800438005380063800738008380093801038011380123801338014380153801638017380183801938020380213802238023380243802538026380273802838029380303803138032380333803438035380363803738038380393804038041380423804338044380453804638047380483804938050380513805238053380543805538056380573805838059380603806138062380633806438065380663806738068380693807038071380723807338074380753807638077380783807938080380813808238083380843808538086380873808838089380903809138092380933809438095380963809738098380993810038101381023810338104381053810638107381083810938110381113811238113381143811538116381173811838119381203812138122381233812438125381263812738128381293813038131381323813338134381353813638137381383813938140381413814238143381443814538146381473814838149381503815138152381533815438155381563815738158381593816038161381623816338164381653816638167381683816938170381713817238173381743817538176381773817838179381803818138182381833818438185381863818738188381893819038191381923819338194381953819638197381983819938200382013820238203382043820538206382073820838209382103821138212382133821438215382163821738218382193822038221382223822338224382253822638227382283822938230382313823238233382343823538236382373823838239382403824138242382433824438245382463824738248382493825038251382523825338254382553825638257382583825938260382613826238263382643826538266382673826838269382703827138272382733827438275382763827738278382793828038281382823828338284382853828638287382883828938290382913829238293382943829538296382973829838299383003830138302383033830438305383063830738308383093831038311383123831338314383153831638317383183831938320383213832238323383243832538326383273832838329383303833138332383333833438335383363833738338383393834038341383423834338344383453834638347383483834938350383513835238353383543835538356383573835838359383603836138362383633836438365383663836738368383693837038371383723837338374383753837638377383783837938380383813838238383383843838538386383873838838389383903839138392383933839438395383963839738398383993840038401384023840338404384053840638407384083840938410384113841238413384143841538416384173841838419384203842138422384233842438425384263842738428384293843038431384323843338434384353843638437384383843938440384413844238443384443844538446384473844838449384503845138452384533845438455384563845738458384593846038461384623846338464384653846638467384683846938470384713847238473384743847538476384773847838479384803848138482384833848438485384863848738488384893849038491384923849338494384953849638497384983849938500385013850238503385043850538506385073850838509385103851138512385133851438515385163851738518385193852038521385223852338524385253852638527385283852938530385313853238533385343853538536385373853838539385403854138542385433854438545385463854738548385493855038551385523855338554385553855638557385583855938560385613856238563385643856538566385673856838569385703857138572385733857438575385763857738578385793858038581385823858338584385853858638587385883858938590385913859238593385943859538596385973859838599386003860138602386033860438605386063860738608386093861038611386123861338614386153861638617386183861938620386213862238623386243862538626386273862838629386303863138632386333863438635386363863738638386393864038641386423864338644386453864638647386483864938650386513865238653386543865538656386573865838659386603866138662386633866438665386663866738668386693867038671386723867338674386753867638677386783867938680386813868238683386843868538686386873868838689386903869138692386933869438695386963869738698386993870038701387023870338704387053870638707387083870938710387113871238713387143871538716387173871838719387203872138722387233872438725387263872738728387293873038731387323873338734387353873638737387383873938740387413874238743387443874538746387473874838749387503875138752387533875438755387563875738758387593876038761387623876338764387653876638767387683876938770387713877238773387743877538776387773877838779387803878138782387833878438785387863878738788387893879038791387923879338794387953879638797387983879938800388013880238803388043880538806388073880838809388103881138812388133881438815388163881738818388193882038821388223882338824388253882638827388283882938830388313883238833388343883538836388373883838839388403884138842388433884438845388463884738848388493885038851388523885338854388553885638857388583885938860388613886238863388643886538866388673886838869388703887138872388733887438875388763887738878388793888038881388823888338884388853888638887388883888938890388913889238893388943889538896388973889838899389003890138902389033890438905389063890738908389093891038911389123891338914389153891638917389183891938920389213892238923389243892538926389273892838929389303893138932389333893438935389363893738938389393894038941389423894338944389453894638947389483894938950389513895238953389543895538956389573895838959389603896138962389633896438965389663896738968389693897038971389723897338974389753897638977389783897938980389813898238983389843898538986389873898838989389903899138992389933899438995389963899738998389993900039001390023900339004390053900639007390083900939010390113901239013390143901539016390173901839019390203902139022390233902439025390263902739028390293903039031390323903339034390353903639037390383903939040390413904239043390443904539046390473904839049390503905139052390533905439055390563905739058390593906039061390623906339064390653906639067390683906939070390713907239073390743907539076390773907839079390803908139082390833908439085390863908739088390893909039091390923909339094390953909639097390983909939100391013910239103391043910539106391073910839109391103911139112391133911439115391163911739118391193912039121391223912339124391253912639127391283912939130391313913239133391343913539136391373913839139391403914139142391433914439145391463914739148391493915039151391523915339154391553915639157391583915939160391613916239163391643916539166391673916839169391703917139172391733917439175391763917739178391793918039181391823918339184391853918639187391883918939190391913919239193391943919539196391973919839199392003920139202392033920439205392063920739208392093921039211392123921339214392153921639217392183921939220392213922239223392243922539226392273922839229392303923139232392333923439235392363923739238392393924039241392423924339244392453924639247392483924939250392513925239253392543925539256392573925839259392603926139262392633926439265392663926739268392693927039271392723927339274392753927639277392783927939280392813928239283392843928539286392873928839289392903929139292392933929439295392963929739298392993930039301393023930339304393053930639307393083930939310393113931239313393143931539316393173931839319393203932139322393233932439325393263932739328393293933039331393323933339334393353933639337393383933939340393413934239343393443934539346393473934839349393503935139352393533935439355393563935739358393593936039361393623936339364393653936639367393683936939370393713937239373393743937539376393773937839379393803938139382393833938439385393863938739388393893939039391393923939339394393953939639397393983939939400394013940239403394043940539406394073940839409394103941139412394133941439415394163941739418394193942039421394223942339424394253942639427394283942939430394313943239433394343943539436394373943839439394403944139442394433944439445394463944739448394493945039451394523945339454394553945639457394583945939460394613946239463394643946539466394673946839469394703947139472394733947439475394763947739478394793948039481394823948339484394853948639487394883948939490394913949239493394943949539496394973949839499395003950139502395033950439505395063950739508395093951039511395123951339514395153951639517395183951939520395213952239523395243952539526395273952839529395303953139532395333953439535395363953739538395393954039541395423954339544395453954639547395483954939550395513955239553395543955539556395573955839559395603956139562395633956439565395663956739568395693957039571395723957339574395753957639577395783957939580395813958239583395843958539586395873958839589395903959139592395933959439595395963959739598395993960039601396023960339604396053960639607396083960939610396113961239613396143961539616396173961839619396203962139622396233962439625396263962739628396293963039631396323963339634396353963639637396383963939640396413964239643396443964539646396473964839649396503965139652396533965439655396563965739658396593966039661396623966339664396653966639667396683966939670396713967239673396743967539676396773967839679396803968139682396833968439685396863968739688396893969039691396923969339694396953969639697396983969939700397013970239703397043970539706397073970839709397103971139712397133971439715397163971739718397193972039721397223972339724397253972639727397283972939730397313973239733397343973539736397373973839739397403974139742397433974439745397463974739748397493975039751397523975339754397553975639757397583975939760397613976239763397643976539766397673976839769397703977139772397733977439775397763977739778397793978039781397823978339784397853978639787397883978939790397913979239793397943979539796397973979839799398003980139802398033980439805398063980739808398093981039811398123981339814398153981639817398183981939820398213982239823398243982539826398273982839829398303983139832398333983439835398363983739838398393984039841398423984339844398453984639847398483984939850398513985239853398543985539856398573985839859398603986139862398633986439865398663986739868398693987039871398723987339874398753987639877398783987939880398813988239883398843988539886398873988839889398903989139892398933989439895398963989739898398993990039901399023990339904399053990639907399083990939910399113991239913399143991539916399173991839919399203992139922399233992439925399263992739928399293993039931399323993339934399353993639937399383993939940399413994239943399443994539946399473994839949399503995139952399533995439955399563995739958399593996039961399623996339964399653996639967399683996939970399713997239973399743997539976399773997839979399803998139982399833998439985399863998739988399893999039991399923999339994399953999639997399983999940000400014000240003400044000540006400074000840009400104001140012400134001440015400164001740018400194002040021400224002340024400254002640027400284002940030400314003240033400344003540036400374003840039400404004140042400434004440045400464004740048400494005040051400524005340054400554005640057400584005940060400614006240063400644006540066400674006840069400704007140072400734007440075400764007740078400794008040081400824008340084400854008640087400884008940090400914009240093400944009540096400974009840099401004010140102401034010440105401064010740108401094011040111401124011340114401154011640117401184011940120401214012240123401244012540126401274012840129401304013140132401334013440135401364013740138401394014040141401424014340144401454014640147401484014940150401514015240153401544015540156401574015840159401604016140162401634016440165401664016740168401694017040171401724017340174401754017640177401784017940180401814018240183401844018540186401874018840189401904019140192401934019440195401964019740198401994020040201402024020340204402054020640207402084020940210402114021240213402144021540216402174021840219402204022140222402234022440225402264022740228402294023040231402324023340234402354023640237402384023940240402414024240243402444024540246402474024840249402504025140252402534025440255402564025740258402594026040261402624026340264402654026640267402684026940270402714027240273402744027540276402774027840279402804028140282402834028440285402864028740288402894029040291402924029340294402954029640297402984029940300403014030240303403044030540306403074030840309403104031140312403134031440315403164031740318403194032040321403224032340324403254032640327403284032940330403314033240333403344033540336403374033840339403404034140342403434034440345403464034740348403494035040351403524035340354403554035640357403584035940360403614036240363403644036540366403674036840369403704037140372403734037440375403764037740378403794038040381403824038340384403854038640387403884038940390403914039240393403944039540396403974039840399404004040140402404034040440405404064040740408404094041040411404124041340414404154041640417404184041940420404214042240423404244042540426404274042840429404304043140432404334043440435404364043740438404394044040441404424044340444404454044640447404484044940450404514045240453404544045540456404574045840459404604046140462404634046440465404664046740468404694047040471404724047340474404754047640477404784047940480404814048240483404844048540486404874048840489404904049140492404934049440495404964049740498404994050040501405024050340504405054050640507405084050940510405114051240513405144051540516405174051840519405204052140522405234052440525405264052740528405294053040531405324053340534405354053640537405384053940540405414054240543405444054540546405474054840549405504055140552405534055440555405564055740558405594056040561405624056340564405654056640567405684056940570405714057240573405744057540576405774057840579405804058140582405834058440585405864058740588405894059040591405924059340594405954059640597405984059940600406014060240603406044060540606406074060840609406104061140612406134061440615406164061740618406194062040621406224062340624406254062640627406284062940630406314063240633406344063540636406374063840639406404064140642406434064440645406464064740648406494065040651406524065340654406554065640657406584065940660406614066240663406644066540666406674066840669406704067140672406734067440675406764067740678406794068040681406824068340684406854068640687406884068940690406914069240693406944069540696406974069840699407004070140702407034070440705407064070740708407094071040711407124071340714407154071640717407184071940720407214072240723407244072540726407274072840729407304073140732407334073440735407364073740738407394074040741407424074340744407454074640747407484074940750407514075240753407544075540756407574075840759407604076140762407634076440765407664076740768407694077040771407724077340774407754077640777407784077940780407814078240783407844078540786407874078840789407904079140792407934079440795407964079740798407994080040801408024080340804408054080640807408084080940810408114081240813408144081540816408174081840819408204082140822408234082440825408264082740828408294083040831408324083340834408354083640837408384083940840408414084240843408444084540846408474084840849408504085140852408534085440855408564085740858408594086040861408624086340864408654086640867408684086940870408714087240873408744087540876408774087840879408804088140882408834088440885408864088740888408894089040891408924089340894408954089640897408984089940900409014090240903409044090540906409074090840909409104091140912409134091440915409164091740918409194092040921409224092340924409254092640927409284092940930409314093240933409344093540936409374093840939409404094140942409434094440945409464094740948409494095040951409524095340954409554095640957409584095940960409614096240963409644096540966409674096840969409704097140972409734097440975409764097740978409794098040981409824098340984409854098640987409884098940990409914099240993409944099540996409974099840999410004100141002410034100441005410064100741008410094101041011410124101341014410154101641017410184101941020410214102241023410244102541026410274102841029410304103141032410334103441035410364103741038410394104041041410424104341044410454104641047410484104941050410514105241053410544105541056410574105841059410604106141062410634106441065410664106741068410694107041071410724107341074410754107641077410784107941080410814108241083410844108541086410874108841089410904109141092410934109441095410964109741098410994110041101411024110341104411054110641107411084110941110411114111241113411144111541116411174111841119411204112141122411234112441125411264112741128411294113041131411324113341134411354113641137411384113941140411414114241143411444114541146411474114841149411504115141152411534115441155411564115741158411594116041161411624116341164411654116641167411684116941170411714117241173411744117541176411774117841179411804118141182411834118441185411864118741188411894119041191411924119341194411954119641197411984119941200412014120241203412044120541206412074120841209412104121141212412134121441215412164121741218412194122041221412224122341224412254122641227412284122941230412314123241233412344123541236412374123841239412404124141242412434124441245412464124741248412494125041251412524125341254412554125641257412584125941260412614126241263412644126541266412674126841269412704127141272412734127441275412764127741278412794128041281412824128341284412854128641287412884128941290412914129241293412944129541296412974129841299413004130141302413034130441305413064130741308413094131041311413124131341314413154131641317413184131941320413214132241323413244132541326413274132841329413304133141332413334133441335413364133741338413394134041341413424134341344413454134641347413484134941350413514135241353413544135541356413574135841359413604136141362413634136441365413664136741368413694137041371413724137341374413754137641377413784137941380413814138241383413844138541386413874138841389413904139141392413934139441395413964139741398413994140041401414024140341404414054140641407414084140941410414114141241413414144141541416414174141841419414204142141422414234142441425414264142741428414294143041431414324143341434414354143641437414384143941440414414144241443414444144541446414474144841449414504145141452414534145441455414564145741458414594146041461414624146341464414654146641467414684146941470414714147241473414744147541476414774147841479414804148141482414834148441485414864148741488414894149041491414924149341494414954149641497414984149941500415014150241503415044150541506415074150841509415104151141512415134151441515415164151741518415194152041521415224152341524415254152641527415284152941530415314153241533415344153541536415374153841539415404154141542415434154441545415464154741548415494155041551415524155341554415554155641557415584155941560415614156241563415644156541566415674156841569415704157141572415734157441575415764157741578415794158041581415824158341584415854158641587415884158941590415914159241593415944159541596415974159841599416004160141602416034160441605416064160741608416094161041611416124161341614416154161641617416184161941620416214162241623416244162541626416274162841629416304163141632416334163441635416364163741638416394164041641416424164341644416454164641647416484164941650416514165241653416544165541656416574165841659416604166141662416634166441665416664166741668416694167041671416724167341674416754167641677416784167941680416814168241683416844168541686416874168841689416904169141692416934169441695416964169741698416994170041701417024170341704417054170641707417084170941710417114171241713417144171541716417174171841719417204172141722417234172441725417264172741728417294173041731417324173341734417354173641737417384173941740417414174241743417444174541746417474174841749417504175141752417534175441755417564175741758417594176041761417624176341764417654176641767417684176941770417714177241773417744177541776417774177841779417804178141782417834178441785417864178741788417894179041791417924179341794417954179641797417984179941800418014180241803418044180541806418074180841809418104181141812418134181441815418164181741818418194182041821418224182341824418254182641827418284182941830418314183241833418344183541836418374183841839418404184141842418434184441845418464184741848418494185041851418524185341854418554185641857418584185941860418614186241863418644186541866418674186841869418704187141872418734187441875418764187741878418794188041881418824188341884418854188641887418884188941890418914189241893418944189541896418974189841899419004190141902419034190441905419064190741908419094191041911419124191341914419154191641917419184191941920419214192241923419244192541926419274192841929419304193141932419334193441935419364193741938419394194041941419424194341944419454194641947419484194941950419514195241953419544195541956419574195841959419604196141962419634196441965419664196741968419694197041971419724197341974419754197641977419784197941980419814198241983419844198541986419874198841989419904199141992419934199441995419964199741998419994200042001420024200342004420054200642007420084200942010420114201242013420144201542016420174201842019420204202142022420234202442025420264202742028420294203042031420324203342034420354203642037420384203942040420414204242043420444204542046420474204842049420504205142052420534205442055420564205742058420594206042061420624206342064420654206642067420684206942070420714207242073420744207542076420774207842079420804208142082420834208442085420864208742088420894209042091420924209342094420954209642097420984209942100421014210242103421044210542106421074210842109421104211142112421134211442115421164211742118421194212042121421224212342124421254212642127421284212942130421314213242133421344213542136421374213842139421404214142142421434214442145421464214742148421494215042151421524215342154421554215642157421584215942160421614216242163421644216542166421674216842169421704217142172421734217442175421764217742178421794218042181421824218342184421854218642187421884218942190421914219242193421944219542196421974219842199422004220142202422034220442205422064220742208422094221042211422124221342214422154221642217422184221942220422214222242223422244222542226422274222842229422304223142232422334223442235422364223742238422394224042241422424224342244422454224642247422484224942250422514225242253422544225542256422574225842259422604226142262422634226442265422664226742268422694227042271422724227342274422754227642277422784227942280422814228242283422844228542286422874228842289422904229142292422934229442295422964229742298422994230042301423024230342304423054230642307423084230942310423114231242313423144231542316423174231842319423204232142322423234232442325423264232742328423294233042331423324233342334423354233642337423384233942340423414234242343423444234542346423474234842349423504235142352423534235442355423564235742358423594236042361423624236342364423654236642367423684236942370423714237242373423744237542376423774237842379423804238142382423834238442385423864238742388423894239042391423924239342394423954239642397423984239942400424014240242403424044240542406424074240842409424104241142412424134241442415424164241742418424194242042421424224242342424424254242642427424284242942430424314243242433424344243542436424374243842439424404244142442424434244442445424464244742448424494245042451424524245342454424554245642457424584245942460424614246242463424644246542466424674246842469424704247142472424734247442475424764247742478424794248042481424824248342484424854248642487424884248942490424914249242493424944249542496424974249842499425004250142502425034250442505425064250742508425094251042511425124251342514425154251642517425184251942520425214252242523425244252542526425274252842529425304253142532425334253442535425364253742538425394254042541425424254342544425454254642547425484254942550425514255242553425544255542556425574255842559425604256142562425634256442565425664256742568425694257042571425724257342574425754257642577425784257942580425814258242583425844258542586425874258842589425904259142592425934259442595425964259742598425994260042601426024260342604426054260642607426084260942610426114261242613426144261542616426174261842619426204262142622426234262442625426264262742628426294263042631426324263342634426354263642637426384263942640426414264242643426444264542646426474264842649426504265142652426534265442655426564265742658426594266042661426624266342664426654266642667426684266942670426714267242673426744267542676426774267842679426804268142682426834268442685426864268742688426894269042691426924269342694426954269642697426984269942700427014270242703427044270542706427074270842709427104271142712427134271442715427164271742718427194272042721427224272342724427254272642727427284272942730427314273242733427344273542736427374273842739427404274142742427434274442745427464274742748427494275042751427524275342754427554275642757427584275942760427614276242763427644276542766427674276842769427704277142772427734277442775427764277742778427794278042781427824278342784427854278642787427884278942790427914279242793427944279542796427974279842799428004280142802428034280442805428064280742808428094281042811428124281342814428154281642817428184281942820428214282242823428244282542826428274282842829428304283142832428334283442835428364283742838428394284042841428424284342844428454284642847428484284942850428514285242853428544285542856428574285842859428604286142862428634286442865428664286742868428694287042871428724287342874428754287642877428784287942880428814288242883428844288542886428874288842889428904289142892428934289442895428964289742898428994290042901429024290342904429054290642907429084290942910429114291242913429144291542916429174291842919429204292142922429234292442925429264292742928429294293042931429324293342934429354293642937429384293942940429414294242943429444294542946429474294842949429504295142952429534295442955429564295742958429594296042961429624296342964429654296642967429684296942970429714297242973429744297542976429774297842979429804298142982429834298442985429864298742988429894299042991429924299342994429954299642997429984299943000430014300243003430044300543006430074300843009430104301143012430134301443015430164301743018430194302043021430224302343024430254302643027430284302943030430314303243033430344303543036430374303843039430404304143042430434304443045430464304743048430494305043051430524305343054430554305643057430584305943060430614306243063430644306543066430674306843069430704307143072430734307443075430764307743078430794308043081430824308343084430854308643087430884308943090430914309243093430944309543096430974309843099431004310143102431034310443105431064310743108431094311043111431124311343114431154311643117431184311943120431214312243123431244312543126431274312843129431304313143132431334313443135431364313743138431394314043141431424314343144431454314643147431484314943150431514315243153431544315543156431574315843159431604316143162431634316443165431664316743168431694317043171431724317343174431754317643177431784317943180431814318243183431844318543186431874318843189431904319143192431934319443195431964319743198431994320043201432024320343204432054320643207432084320943210432114321243213432144321543216432174321843219432204322143222432234322443225432264322743228432294323043231432324323343234432354323643237432384323943240432414324243243432444324543246432474324843249432504325143252432534325443255432564325743258432594326043261432624326343264432654326643267432684326943270432714327243273432744327543276432774327843279432804328143282432834328443285432864328743288432894329043291432924329343294432954329643297432984329943300433014330243303433044330543306433074330843309433104331143312433134331443315433164331743318433194332043321433224332343324433254332643327433284332943330433314333243333433344333543336433374333843339433404334143342433434334443345433464334743348433494335043351433524335343354433554335643357433584335943360433614336243363433644336543366433674336843369433704337143372433734337443375433764337743378433794338043381433824338343384433854338643387433884338943390433914339243393433944339543396433974339843399434004340143402434034340443405434064340743408434094341043411434124341343414434154341643417434184341943420434214342243423434244342543426434274342843429434304343143432434334343443435434364343743438434394344043441434424344343444434454344643447434484344943450434514345243453434544345543456434574345843459434604346143462434634346443465434664346743468434694347043471434724347343474434754347643477434784347943480434814348243483434844348543486434874348843489434904349143492434934349443495434964349743498434994350043501435024350343504435054350643507435084350943510435114351243513435144351543516435174351843519435204352143522435234352443525435264352743528435294353043531435324353343534435354353643537435384353943540435414354243543435444354543546435474354843549435504355143552435534355443555435564355743558435594356043561435624356343564435654356643567435684356943570435714357243573435744357543576435774357843579435804358143582435834358443585435864358743588435894359043591435924359343594435954359643597435984359943600436014360243603436044360543606436074360843609436104361143612436134361443615436164361743618436194362043621436224362343624436254362643627436284362943630436314363243633436344363543636436374363843639436404364143642436434364443645436464364743648436494365043651436524365343654436554365643657436584365943660436614366243663436644366543666436674366843669436704367143672436734367443675436764367743678436794368043681436824368343684436854368643687436884368943690436914369243693436944369543696436974369843699437004370143702437034370443705437064370743708437094371043711437124371343714437154371643717437184371943720437214372243723437244372543726437274372843729437304373143732437334373443735437364373743738437394374043741437424374343744437454374643747437484374943750437514375243753437544375543756437574375843759437604376143762437634376443765437664376743768437694377043771437724377343774437754377643777437784377943780437814378243783437844378543786437874378843789437904379143792437934379443795437964379743798437994380043801438024380343804438054380643807438084380943810438114381243813438144381543816438174381843819438204382143822438234382443825438264382743828438294383043831438324383343834438354383643837438384383943840438414384243843438444384543846438474384843849438504385143852438534385443855438564385743858438594386043861438624386343864438654386643867438684386943870438714387243873438744387543876438774387843879438804388143882438834388443885438864388743888438894389043891438924389343894438954389643897438984389943900439014390243903439044390543906439074390843909439104391143912439134391443915439164391743918439194392043921439224392343924439254392643927439284392943930439314393243933439344393543936439374393843939439404394143942439434394443945439464394743948439494395043951439524395343954439554395643957439584395943960439614396243963439644396543966439674396843969439704397143972439734397443975439764397743978439794398043981439824398343984439854398643987439884398943990439914399243993439944399543996439974399843999440004400144002440034400444005440064400744008440094401044011440124401344014440154401644017440184401944020440214402244023440244402544026440274402844029440304403144032440334403444035440364403744038440394404044041440424404344044440454404644047440484404944050440514405244053440544405544056440574405844059440604406144062440634406444065440664406744068440694407044071440724407344074440754407644077440784407944080440814408244083440844408544086440874408844089440904409144092440934409444095440964409744098440994410044101441024410344104441054410644107441084410944110441114411244113441144411544116441174411844119441204412144122441234412444125441264412744128441294413044131441324413344134441354413644137441384413944140441414414244143441444414544146441474414844149441504415144152441534415444155441564415744158441594416044161441624416344164441654416644167441684416944170441714417244173441744417544176441774417844179441804418144182441834418444185441864418744188441894419044191441924419344194441954419644197441984419944200442014420244203442044420544206442074420844209442104421144212442134421444215442164421744218442194422044221442224422344224442254422644227442284422944230442314423244233442344423544236442374423844239442404424144242442434424444245442464424744248442494425044251442524425344254442554425644257442584425944260442614426244263442644426544266442674426844269442704427144272442734427444275442764427744278442794428044281442824428344284442854428644287442884428944290442914429244293442944429544296442974429844299443004430144302443034430444305443064430744308443094431044311443124431344314443154431644317443184431944320443214432244323443244432544326443274432844329443304433144332443334433444335443364433744338443394434044341443424434344344443454434644347443484434944350443514435244353443544435544356443574435844359443604436144362443634436444365443664436744368443694437044371443724437344374443754437644377443784437944380443814438244383443844438544386443874438844389443904439144392443934439444395443964439744398443994440044401444024440344404444054440644407444084440944410444114441244413444144441544416444174441844419444204442144422444234442444425444264442744428444294443044431444324443344434444354443644437444384443944440444414444244443444444444544446444474444844449444504445144452444534445444455444564445744458444594446044461444624446344464444654446644467444684446944470444714447244473444744447544476444774447844479444804448144482444834448444485444864448744488444894449044491444924449344494444954449644497444984449944500445014450244503445044450544506445074450844509445104451144512445134451444515445164451744518445194452044521445224452344524445254452644527445284452944530445314453244533445344453544536445374453844539445404454144542445434454444545445464454744548445494455044551445524455344554445554455644557445584455944560445614456244563445644456544566445674456844569445704457144572445734457444575445764457744578445794458044581445824458344584445854458644587445884458944590445914459244593445944459544596445974459844599446004460144602446034460444605446064460744608446094461044611446124461344614446154461644617446184461944620446214462244623446244462544626446274462844629446304463144632446334463444635446364463744638446394464044641446424464344644446454464644647446484464944650446514465244653446544465544656446574465844659446604466144662446634466444665446664466744668446694467044671446724467344674446754467644677446784467944680446814468244683446844468544686446874468844689446904469144692446934469444695446964469744698446994470044701447024470344704447054470644707447084470944710447114471244713447144471544716447174471844719447204472144722447234472444725447264472744728447294473044731447324473344734447354473644737447384473944740447414474244743447444474544746447474474844749447504475144752447534475444755447564475744758447594476044761447624476344764447654476644767447684476944770447714477244773447744477544776447774477844779447804478144782447834478444785447864478744788447894479044791447924479344794447954479644797447984479944800448014480244803448044480544806448074480844809448104481144812448134481444815448164481744818448194482044821448224482344824448254482644827448284482944830448314483244833448344483544836448374483844839448404484144842448434484444845448464484744848448494485044851448524485344854448554485644857448584485944860448614486244863448644486544866448674486844869448704487144872448734487444875448764487744878448794488044881448824488344884448854488644887448884488944890448914489244893448944489544896448974489844899449004490144902449034490444905449064490744908449094491044911449124491344914449154491644917449184491944920449214492244923449244492544926449274492844929449304493144932449334493444935449364493744938449394494044941449424494344944449454494644947449484494944950449514495244953449544495544956449574495844959449604496144962449634496444965449664496744968449694497044971449724497344974449754497644977449784497944980449814498244983449844498544986449874498844989449904499144992449934499444995449964499744998449994500045001450024500345004450054500645007450084500945010450114501245013450144501545016450174501845019450204502145022450234502445025450264502745028450294503045031450324503345034450354503645037450384503945040450414504245043450444504545046450474504845049450504505145052450534505445055450564505745058450594506045061450624506345064450654506645067450684506945070450714507245073450744507545076450774507845079450804508145082450834508445085450864508745088450894509045091450924509345094450954509645097450984509945100451014510245103451044510545106451074510845109451104511145112451134511445115451164511745118451194512045121451224512345124451254512645127451284512945130451314513245133451344513545136451374513845139451404514145142451434514445145451464514745148451494515045151451524515345154451554515645157451584515945160451614516245163451644516545166451674516845169451704517145172451734517445175451764517745178451794518045181451824518345184451854518645187451884518945190451914519245193451944519545196451974519845199452004520145202452034520445205452064520745208452094521045211452124521345214452154521645217452184521945220452214522245223452244522545226452274522845229452304523145232452334523445235452364523745238452394524045241452424524345244452454524645247452484524945250452514525245253452544525545256452574525845259452604526145262452634526445265452664526745268452694527045271452724527345274452754527645277452784527945280452814528245283452844528545286452874528845289452904529145292452934529445295452964529745298452994530045301453024530345304453054530645307453084530945310453114531245313453144531545316453174531845319453204532145322453234532445325453264532745328453294533045331453324533345334453354533645337453384533945340453414534245343453444534545346453474534845349453504535145352453534535445355453564535745358453594536045361453624536345364453654536645367453684536945370453714537245373453744537545376453774537845379453804538145382453834538445385453864538745388453894539045391453924539345394453954539645397453984539945400454014540245403454044540545406454074540845409454104541145412454134541445415454164541745418454194542045421454224542345424454254542645427454284542945430454314543245433454344543545436454374543845439454404544145442454434544445445454464544745448454494545045451454524545345454454554545645457454584545945460454614546245463454644546545466454674546845469454704547145472454734547445475454764547745478454794548045481454824548345484454854548645487454884548945490454914549245493454944549545496454974549845499455004550145502455034550445505455064550745508455094551045511455124551345514455154551645517455184551945520455214552245523455244552545526455274552845529455304553145532455334553445535455364553745538455394554045541455424554345544455454554645547455484554945550455514555245553455544555545556455574555845559455604556145562455634556445565455664556745568455694557045571455724557345574455754557645577455784557945580455814558245583455844558545586455874558845589455904559145592455934559445595455964559745598455994560045601456024560345604456054560645607456084560945610456114561245613456144561545616456174561845619456204562145622456234562445625456264562745628456294563045631456324563345634456354563645637456384563945640456414564245643456444564545646456474564845649456504565145652456534565445655456564565745658456594566045661456624566345664456654566645667456684566945670456714567245673456744567545676456774567845679456804568145682456834568445685456864568745688456894569045691456924569345694456954569645697456984569945700457014570245703457044570545706457074570845709457104571145712457134571445715457164571745718457194572045721457224572345724457254572645727457284572945730457314573245733457344573545736457374573845739457404574145742457434574445745457464574745748457494575045751457524575345754457554575645757457584575945760457614576245763457644576545766457674576845769457704577145772457734577445775457764577745778457794578045781457824578345784457854578645787457884578945790457914579245793457944579545796457974579845799458004580145802458034580445805458064580745808458094581045811458124581345814458154581645817458184581945820458214582245823458244582545826458274582845829458304583145832458334583445835458364583745838458394584045841458424584345844458454584645847458484584945850458514585245853458544585545856458574585845859458604586145862458634586445865458664586745868458694587045871458724587345874458754587645877458784587945880458814588245883458844588545886458874588845889458904589145892458934589445895458964589745898458994590045901459024590345904459054590645907459084590945910459114591245913459144591545916459174591845919459204592145922459234592445925459264592745928459294593045931459324593345934459354593645937459384593945940459414594245943459444594545946459474594845949459504595145952459534595445955459564595745958459594596045961459624596345964459654596645967459684596945970459714597245973459744597545976459774597845979459804598145982459834598445985459864598745988459894599045991459924599345994459954599645997459984599946000460014600246003460044600546006460074600846009460104601146012460134601446015460164601746018460194602046021460224602346024460254602646027460284602946030460314603246033460344603546036460374603846039460404604146042460434604446045460464604746048460494605046051460524605346054460554605646057460584605946060460614606246063460644606546066460674606846069460704607146072460734607446075460764607746078460794608046081460824608346084460854608646087460884608946090460914609246093460944609546096460974609846099461004610146102461034610446105461064610746108461094611046111461124611346114461154611646117461184611946120461214612246123461244612546126461274612846129461304613146132461334613446135461364613746138461394614046141461424614346144461454614646147461484614946150461514615246153461544615546156461574615846159461604616146162461634616446165461664616746168461694617046171461724617346174461754617646177461784617946180461814618246183461844618546186461874618846189461904619146192461934619446195461964619746198461994620046201462024620346204462054620646207462084620946210462114621246213462144621546216462174621846219462204622146222462234622446225462264622746228462294623046231462324623346234462354623646237462384623946240462414624246243462444624546246462474624846249462504625146252462534625446255462564625746258462594626046261462624626346264462654626646267462684626946270462714627246273462744627546276462774627846279462804628146282462834628446285462864628746288462894629046291462924629346294462954629646297462984629946300463014630246303463044630546306463074630846309463104631146312463134631446315463164631746318463194632046321463224632346324463254632646327463284632946330463314633246333463344633546336463374633846339463404634146342463434634446345463464634746348463494635046351463524635346354463554635646357463584635946360463614636246363463644636546366463674636846369463704637146372463734637446375463764637746378463794638046381463824638346384463854638646387463884638946390463914639246393463944639546396463974639846399464004640146402464034640446405464064640746408464094641046411464124641346414464154641646417464184641946420464214642246423464244642546426464274642846429464304643146432464334643446435464364643746438464394644046441464424644346444464454644646447464484644946450464514645246453464544645546456464574645846459464604646146462464634646446465464664646746468464694647046471464724647346474464754647646477464784647946480464814648246483464844648546486464874648846489464904649146492464934649446495464964649746498464994650046501465024650346504465054650646507465084650946510465114651246513465144651546516465174651846519465204652146522465234652446525465264652746528465294653046531465324653346534465354653646537465384653946540465414654246543465444654546546465474654846549465504655146552465534655446555465564655746558465594656046561465624656346564465654656646567465684656946570465714657246573465744657546576465774657846579465804658146582465834658446585465864658746588465894659046591465924659346594465954659646597465984659946600466014660246603466044660546606466074660846609466104661146612466134661446615466164661746618466194662046621466224662346624466254662646627466284662946630466314663246633466344663546636466374663846639466404664146642466434664446645466464664746648466494665046651466524665346654466554665646657466584665946660466614666246663466644666546666466674666846669466704667146672466734667446675466764667746678466794668046681466824668346684466854668646687466884668946690466914669246693466944669546696466974669846699467004670146702467034670446705467064670746708467094671046711467124671346714467154671646717467184671946720467214672246723467244672546726467274672846729467304673146732467334673446735467364673746738467394674046741467424674346744467454674646747467484674946750467514675246753467544675546756467574675846759467604676146762467634676446765467664676746768467694677046771467724677346774467754677646777467784677946780467814678246783467844678546786467874678846789467904679146792467934679446795467964679746798467994680046801468024680346804468054680646807468084680946810468114681246813468144681546816468174681846819468204682146822468234682446825468264682746828468294683046831468324683346834468354683646837468384683946840468414684246843468444684546846468474684846849468504685146852468534685446855468564685746858468594686046861468624686346864468654686646867468684686946870468714687246873468744687546876468774687846879468804688146882468834688446885468864688746888468894689046891468924689346894468954689646897468984689946900469014690246903469044690546906469074690846909469104691146912469134691446915469164691746918469194692046921469224692346924469254692646927469284692946930469314693246933469344693546936469374693846939469404694146942469434694446945469464694746948469494695046951469524695346954469554695646957469584695946960469614696246963469644696546966469674696846969469704697146972469734697446975469764697746978469794698046981469824698346984469854698646987469884698946990469914699246993469944699546996469974699846999470004700147002470034700447005470064700747008470094701047011470124701347014470154701647017470184701947020470214702247023470244702547026470274702847029470304703147032470334703447035470364703747038470394704047041470424704347044470454704647047470484704947050470514705247053470544705547056470574705847059470604706147062470634706447065470664706747068470694707047071470724707347074470754707647077470784707947080470814708247083470844708547086470874708847089470904709147092470934709447095470964709747098470994710047101471024710347104471054710647107471084710947110471114711247113471144711547116471174711847119471204712147122471234712447125471264712747128471294713047131471324713347134471354713647137471384713947140471414714247143471444714547146471474714847149471504715147152471534715447155471564715747158471594716047161471624716347164471654716647167471684716947170471714717247173471744717547176471774717847179471804718147182471834718447185471864718747188471894719047191471924719347194471954719647197471984719947200472014720247203472044720547206472074720847209472104721147212472134721447215472164721747218472194722047221472224722347224472254722647227472284722947230472314723247233472344723547236472374723847239472404724147242472434724447245472464724747248472494725047251472524725347254472554725647257472584725947260472614726247263472644726547266472674726847269472704727147272472734727447275472764727747278472794728047281472824728347284472854728647287472884728947290472914729247293472944729547296472974729847299473004730147302473034730447305473064730747308473094731047311473124731347314473154731647317473184731947320473214732247323473244732547326473274732847329473304733147332473334733447335473364733747338473394734047341473424734347344473454734647347473484734947350473514735247353473544735547356473574735847359473604736147362473634736447365473664736747368473694737047371473724737347374473754737647377473784737947380473814738247383473844738547386473874738847389473904739147392473934739447395473964739747398473994740047401474024740347404474054740647407474084740947410474114741247413474144741547416474174741847419474204742147422474234742447425474264742747428474294743047431474324743347434474354743647437474384743947440474414744247443474444744547446474474744847449474504745147452474534745447455474564745747458474594746047461474624746347464474654746647467474684746947470474714747247473474744747547476474774747847479474804748147482474834748447485474864748747488474894749047491474924749347494474954749647497474984749947500475014750247503475044750547506475074750847509475104751147512475134751447515475164751747518475194752047521475224752347524475254752647527475284752947530475314753247533475344753547536475374753847539475404754147542475434754447545475464754747548475494755047551475524755347554475554755647557475584755947560475614756247563475644756547566475674756847569475704757147572475734757447575475764757747578475794758047581475824758347584475854758647587475884758947590475914759247593475944759547596475974759847599476004760147602476034760447605476064760747608476094761047611476124761347614476154761647617476184761947620476214762247623476244762547626476274762847629476304763147632476334763447635476364763747638476394764047641476424764347644476454764647647476484764947650476514765247653476544765547656476574765847659476604766147662476634766447665476664766747668476694767047671476724767347674476754767647677476784767947680476814768247683476844768547686476874768847689476904769147692476934769447695476964769747698476994770047701477024770347704477054770647707477084770947710477114771247713477144771547716477174771847719477204772147722477234772447725477264772747728477294773047731477324773347734477354773647737477384773947740477414774247743477444774547746477474774847749477504775147752477534775447755477564775747758477594776047761477624776347764477654776647767477684776947770477714777247773477744777547776477774777847779477804778147782477834778447785477864778747788477894779047791477924779347794477954779647797477984779947800478014780247803478044780547806478074780847809478104781147812478134781447815478164781747818478194782047821478224782347824478254782647827478284782947830478314783247833478344783547836478374783847839478404784147842478434784447845478464784747848478494785047851478524785347854478554785647857478584785947860478614786247863478644786547866478674786847869478704787147872478734787447875478764787747878478794788047881478824788347884478854788647887478884788947890478914789247893478944789547896478974789847899479004790147902479034790447905479064790747908479094791047911479124791347914479154791647917479184791947920479214792247923479244792547926479274792847929479304793147932479334793447935479364793747938479394794047941479424794347944479454794647947479484794947950479514795247953479544795547956479574795847959479604796147962479634796447965479664796747968479694797047971479724797347974479754797647977479784797947980479814798247983479844798547986479874798847989479904799147992479934799447995479964799747998479994800048001480024800348004480054800648007480084800948010480114801248013480144801548016480174801848019480204802148022480234802448025480264802748028480294803048031480324803348034480354803648037480384803948040480414804248043480444804548046480474804848049480504805148052480534805448055480564805748058480594806048061480624806348064480654806648067480684806948070480714807248073480744807548076480774807848079480804808148082480834808448085480864808748088480894809048091480924809348094480954809648097480984809948100481014810248103481044810548106481074810848109481104811148112481134811448115481164811748118481194812048121481224812348124481254812648127481284812948130481314813248133481344813548136481374813848139481404814148142481434814448145481464814748148481494815048151481524815348154481554815648157481584815948160481614816248163481644816548166481674816848169481704817148172481734817448175481764817748178481794818048181481824818348184481854818648187481884818948190481914819248193481944819548196481974819848199482004820148202482034820448205482064820748208482094821048211482124821348214482154821648217482184821948220482214822248223482244822548226482274822848229482304823148232482334823448235482364823748238482394824048241482424824348244482454824648247482484824948250482514825248253482544825548256482574825848259482604826148262482634826448265482664826748268482694827048271482724827348274482754827648277482784827948280482814828248283482844828548286482874828848289482904829148292482934829448295482964829748298482994830048301483024830348304483054830648307483084830948310483114831248313483144831548316483174831848319483204832148322483234832448325483264832748328483294833048331483324833348334483354833648337483384833948340483414834248343483444834548346483474834848349483504835148352483534835448355483564835748358483594836048361483624836348364483654836648367483684836948370483714837248373483744837548376483774837848379483804838148382483834838448385483864838748388483894839048391483924839348394483954839648397483984839948400484014840248403484044840548406484074840848409484104841148412484134841448415484164841748418484194842048421484224842348424484254842648427484284842948430484314843248433484344843548436484374843848439484404844148442484434844448445484464844748448484494845048451484524845348454484554845648457484584845948460484614846248463484644846548466484674846848469484704847148472484734847448475484764847748478484794848048481484824848348484484854848648487484884848948490484914849248493484944849548496484974849848499485004850148502485034850448505485064850748508485094851048511485124851348514485154851648517485184851948520485214852248523485244852548526485274852848529485304853148532485334853448535485364853748538485394854048541485424854348544485454854648547485484854948550485514855248553485544855548556485574855848559485604856148562485634856448565485664856748568485694857048571485724857348574485754857648577485784857948580485814858248583485844858548586485874858848589485904859148592485934859448595485964859748598485994860048601486024860348604486054860648607486084860948610486114861248613486144861548616486174861848619486204862148622486234862448625486264862748628486294863048631486324863348634486354863648637486384863948640486414864248643486444864548646486474864848649486504865148652486534865448655486564865748658486594866048661486624866348664486654866648667486684866948670486714867248673486744867548676486774867848679486804868148682486834868448685486864868748688486894869048691486924869348694486954869648697486984869948700487014870248703487044870548706487074870848709487104871148712487134871448715487164871748718487194872048721487224872348724487254872648727487284872948730487314873248733487344873548736487374873848739487404874148742487434874448745487464874748748487494875048751487524875348754487554875648757487584875948760487614876248763487644876548766487674876848769487704877148772487734877448775487764877748778487794878048781487824878348784487854878648787487884878948790487914879248793487944879548796487974879848799488004880148802488034880448805488064880748808488094881048811488124881348814488154881648817488184881948820488214882248823488244882548826488274882848829488304883148832488334883448835488364883748838488394884048841488424884348844488454884648847488484884948850488514885248853488544885548856488574885848859488604886148862488634886448865488664886748868488694887048871488724887348874488754887648877488784887948880488814888248883488844888548886488874888848889488904889148892488934889448895488964889748898488994890048901489024890348904489054890648907489084890948910489114891248913489144891548916489174891848919489204892148922489234892448925489264892748928489294893048931489324893348934489354893648937489384893948940489414894248943489444894548946489474894848949489504895148952489534895448955489564895748958489594896048961489624896348964489654896648967489684896948970489714897248973489744897548976489774897848979489804898148982489834898448985489864898748988489894899048991489924899348994489954899648997489984899949000490014900249003490044900549006490074900849009490104901149012490134901449015490164901749018490194902049021490224902349024490254902649027490284902949030490314903249033490344903549036490374903849039490404904149042490434904449045490464904749048490494905049051490524905349054490554905649057490584905949060490614906249063490644906549066490674906849069490704907149072490734907449075490764907749078490794908049081490824908349084490854908649087490884908949090490914909249093490944909549096490974909849099491004910149102491034910449105491064910749108491094911049111491124911349114491154911649117491184911949120491214912249123491244912549126491274912849129491304913149132491334913449135491364913749138491394914049141491424914349144491454914649147491484914949150491514915249153491544915549156491574915849159491604916149162491634916449165491664916749168491694917049171491724917349174491754917649177491784917949180491814918249183491844918549186491874918849189491904919149192491934919449195491964919749198491994920049201492024920349204492054920649207492084920949210492114921249213492144921549216492174921849219492204922149222492234922449225492264922749228492294923049231492324923349234492354923649237492384923949240492414924249243492444924549246492474924849249492504925149252492534925449255492564925749258492594926049261492624926349264492654926649267492684926949270492714927249273492744927549276492774927849279492804928149282492834928449285492864928749288492894929049291492924929349294492954929649297492984929949300493014930249303493044930549306493074930849309493104931149312493134931449315493164931749318493194932049321493224932349324493254932649327493284932949330493314933249333493344933549336493374933849339493404934149342493434934449345493464934749348493494935049351493524935349354493554935649357493584935949360493614936249363493644936549366493674936849369493704937149372493734937449375493764937749378493794938049381493824938349384493854938649387493884938949390493914939249393493944939549396493974939849399494004940149402494034940449405494064940749408494094941049411494124941349414494154941649417494184941949420494214942249423494244942549426494274942849429494304943149432494334943449435494364943749438494394944049441494424944349444494454944649447494484944949450494514945249453494544945549456494574945849459494604946149462494634946449465494664946749468494694947049471494724947349474494754947649477494784947949480494814948249483494844948549486494874948849489494904949149492494934949449495494964949749498494994950049501495024950349504495054950649507495084950949510495114951249513495144951549516495174951849519495204952149522495234952449525495264952749528495294953049531495324953349534495354953649537495384953949540495414954249543495444954549546495474954849549495504955149552495534955449555495564955749558495594956049561495624956349564495654956649567495684956949570495714957249573495744957549576495774957849579495804958149582495834958449585495864958749588495894959049591495924959349594495954959649597495984959949600496014960249603496044960549606496074960849609496104961149612496134961449615496164961749618496194962049621496224962349624496254962649627496284962949630496314963249633496344963549636496374963849639496404964149642496434964449645496464964749648496494965049651496524965349654496554965649657496584965949660496614966249663496644966549666496674966849669496704967149672496734967449675496764967749678496794968049681496824968349684496854968649687496884968949690496914969249693496944969549696496974969849699497004970149702497034970449705497064970749708497094971049711497124971349714497154971649717497184971949720497214972249723497244972549726497274972849729497304973149732497334973449735497364973749738497394974049741497424974349744497454974649747497484974949750497514975249753497544975549756497574975849759497604976149762497634976449765497664976749768497694977049771497724977349774497754977649777497784977949780497814978249783497844978549786497874978849789497904979149792497934979449795497964979749798497994980049801498024980349804498054980649807498084980949810498114981249813498144981549816498174981849819498204982149822498234982449825498264982749828498294983049831498324983349834498354983649837498384983949840498414984249843498444984549846498474984849849498504985149852498534985449855498564985749858498594986049861498624986349864498654986649867498684986949870498714987249873498744987549876498774987849879498804988149882498834988449885498864988749888498894989049891498924989349894498954989649897498984989949900499014990249903499044990549906499074990849909499104991149912499134991449915499164991749918499194992049921499224992349924499254992649927499284992949930499314993249933499344993549936499374993849939499404994149942499434994449945499464994749948499494995049951499524995349954499554995649957499584995949960499614996249963499644996549966499674996849969499704997149972499734997449975499764997749978499794998049981499824998349984499854998649987499884998949990499914999249993499944999549996499974999849999500005000150002500035000450005500065000750008500095001050011500125001350014500155001650017500185001950020500215002250023500245002550026500275002850029500305003150032500335003450035500365003750038500395004050041500425004350044500455004650047500485004950050500515005250053500545005550056500575005850059500605006150062500635006450065500665006750068500695007050071500725007350074500755007650077500785007950080500815008250083500845008550086500875008850089500905009150092500935009450095500965009750098500995010050101501025010350104501055010650107501085010950110501115011250113501145011550116501175011850119501205012150122501235012450125501265012750128501295013050131501325013350134501355013650137501385013950140501415014250143501445014550146501475014850149501505015150152501535015450155501565015750158501595016050161501625016350164501655016650167501685016950170501715017250173501745017550176501775017850179501805018150182501835018450185501865018750188501895019050191501925019350194501955019650197501985019950200502015020250203502045020550206502075020850209502105021150212502135021450215502165021750218502195022050221502225022350224502255022650227502285022950230502315023250233502345023550236502375023850239502405024150242502435024450245502465024750248502495025050251502525025350254502555025650257502585025950260502615026250263502645026550266502675026850269502705027150272502735027450275502765027750278502795028050281502825028350284502855028650287502885028950290502915029250293502945029550296502975029850299503005030150302503035030450305503065030750308503095031050311503125031350314503155031650317503185031950320503215032250323503245032550326503275032850329503305033150332503335033450335503365033750338503395034050341503425034350344503455034650347503485034950350503515035250353503545035550356503575035850359503605036150362503635036450365503665036750368503695037050371503725037350374503755037650377503785037950380503815038250383503845038550386503875038850389503905039150392503935039450395503965039750398503995040050401504025040350404504055040650407504085040950410504115041250413504145041550416504175041850419504205042150422504235042450425504265042750428504295043050431504325043350434504355043650437504385043950440504415044250443504445044550446504475044850449504505045150452504535045450455504565045750458504595046050461504625046350464504655046650467504685046950470504715047250473504745047550476504775047850479504805048150482504835048450485504865048750488504895049050491504925049350494504955049650497504985049950500505015050250503505045050550506505075050850509505105051150512505135051450515505165051750518505195052050521505225052350524505255052650527505285052950530505315053250533505345053550536505375053850539505405054150542505435054450545505465054750548505495055050551505525055350554505555055650557505585055950560505615056250563505645056550566505675056850569505705057150572505735057450575505765057750578505795058050581505825058350584505855058650587505885058950590505915059250593505945059550596505975059850599506005060150602506035060450605506065060750608506095061050611506125061350614506155061650617506185061950620506215062250623506245062550626506275062850629506305063150632506335063450635506365063750638506395064050641506425064350644506455064650647506485064950650506515065250653506545065550656506575065850659506605066150662506635066450665506665066750668506695067050671506725067350674506755067650677506785067950680506815068250683506845068550686506875068850689506905069150692506935069450695506965069750698506995070050701507025070350704507055070650707507085070950710507115071250713507145071550716507175071850719507205072150722507235072450725507265072750728507295073050731507325073350734507355073650737507385073950740507415074250743507445074550746507475074850749507505075150752507535075450755507565075750758507595076050761507625076350764507655076650767507685076950770507715077250773507745077550776507775077850779507805078150782507835078450785507865078750788507895079050791507925079350794507955079650797507985079950800508015080250803508045080550806508075080850809508105081150812508135081450815508165081750818508195082050821508225082350824508255082650827508285082950830508315083250833508345083550836508375083850839508405084150842508435084450845508465084750848508495085050851508525085350854508555085650857508585085950860508615086250863508645086550866508675086850869508705087150872508735087450875508765087750878508795088050881508825088350884508855088650887508885088950890508915089250893508945089550896508975089850899509005090150902509035090450905509065090750908509095091050911509125091350914509155091650917509185091950920509215092250923509245092550926509275092850929509305093150932509335093450935509365093750938509395094050941509425094350944509455094650947509485094950950509515095250953509545095550956509575095850959509605096150962509635096450965509665096750968509695097050971509725097350974509755097650977509785097950980509815098250983509845098550986509875098850989509905099150992509935099450995509965099750998509995100051001510025100351004510055100651007510085100951010510115101251013510145101551016510175101851019510205102151022510235102451025510265102751028510295103051031510325103351034510355103651037510385103951040510415104251043510445104551046510475104851049510505105151052510535105451055510565105751058510595106051061510625106351064510655106651067510685106951070510715107251073510745107551076510775107851079510805108151082510835108451085510865108751088510895109051091510925109351094510955109651097510985109951100511015110251103511045110551106511075110851109511105111151112511135111451115511165111751118511195112051121511225112351124511255112651127511285112951130511315113251133511345113551136511375113851139511405114151142511435114451145511465114751148511495115051151511525115351154511555115651157511585115951160511615116251163511645116551166511675116851169511705117151172511735117451175511765117751178511795118051181511825118351184511855118651187511885118951190511915119251193511945119551196511975119851199512005120151202512035120451205512065120751208512095121051211512125121351214512155121651217512185121951220512215122251223512245122551226512275122851229512305123151232512335123451235512365123751238512395124051241512425124351244512455124651247512485124951250512515125251253512545125551256512575125851259512605126151262512635126451265512665126751268512695127051271512725127351274512755127651277512785127951280512815128251283512845128551286512875128851289512905129151292512935129451295512965129751298512995130051301513025130351304513055130651307513085130951310513115131251313513145131551316513175131851319513205132151322513235132451325513265132751328513295133051331513325133351334513355133651337513385133951340513415134251343513445134551346513475134851349513505135151352513535135451355513565135751358513595136051361513625136351364513655136651367513685136951370513715137251373513745137551376513775137851379513805138151382513835138451385513865138751388513895139051391513925139351394513955139651397513985139951400514015140251403514045140551406514075140851409514105141151412514135141451415514165141751418514195142051421514225142351424514255142651427514285142951430514315143251433514345143551436514375143851439514405144151442514435144451445514465144751448514495145051451514525145351454514555145651457514585145951460514615146251463514645146551466514675146851469514705147151472514735147451475514765147751478514795148051481514825148351484514855148651487514885148951490514915149251493514945149551496514975149851499515005150151502515035150451505515065150751508515095151051511515125151351514515155151651517515185151951520515215152251523515245152551526515275152851529515305153151532515335153451535515365153751538515395154051541515425154351544515455154651547515485154951550515515155251553515545155551556515575155851559515605156151562515635156451565515665156751568515695157051571515725157351574515755157651577515785157951580515815158251583515845158551586515875158851589515905159151592515935159451595515965159751598515995160051601516025160351604516055160651607516085160951610516115161251613516145161551616516175161851619516205162151622516235162451625516265162751628516295163051631516325163351634516355163651637516385163951640516415164251643516445164551646516475164851649516505165151652516535165451655516565165751658516595166051661516625166351664516655166651667516685166951670516715167251673516745167551676516775167851679516805168151682516835168451685516865168751688516895169051691516925169351694516955169651697516985169951700517015170251703517045170551706517075170851709517105171151712517135171451715517165171751718517195172051721517225172351724517255172651727517285172951730517315173251733517345173551736517375173851739517405174151742517435174451745517465174751748517495175051751517525175351754517555175651757517585175951760517615176251763517645176551766517675176851769517705177151772517735177451775517765177751778517795178051781517825178351784517855178651787517885178951790517915179251793517945179551796517975179851799518005180151802518035180451805518065180751808518095181051811518125181351814518155181651817518185181951820518215182251823518245182551826518275182851829518305183151832518335183451835518365183751838518395184051841518425184351844518455184651847518485184951850518515185251853518545185551856518575185851859518605186151862518635186451865518665186751868518695187051871518725187351874518755187651877518785187951880518815188251883518845188551886518875188851889518905189151892518935189451895518965189751898518995190051901519025190351904519055190651907519085190951910519115191251913519145191551916519175191851919519205192151922519235192451925519265192751928519295193051931519325193351934519355193651937519385193951940519415194251943519445194551946519475194851949519505195151952519535195451955519565195751958519595196051961519625196351964519655196651967519685196951970519715197251973519745197551976519775197851979519805198151982519835198451985519865198751988519895199051991519925199351994519955199651997519985199952000520015200252003520045200552006520075200852009520105201152012520135201452015520165201752018520195202052021520225202352024520255202652027520285202952030520315203252033520345203552036520375203852039520405204152042520435204452045520465204752048520495205052051520525205352054520555205652057520585205952060520615206252063520645206552066520675206852069520705207152072520735207452075520765207752078520795208052081520825208352084520855208652087520885208952090520915209252093520945209552096520975209852099521005210152102521035210452105521065210752108521095211052111521125211352114521155211652117521185211952120521215212252123521245212552126521275212852129521305213152132521335213452135521365213752138521395214052141521425214352144521455214652147521485214952150521515215252153521545215552156521575215852159521605216152162521635216452165521665216752168521695217052171521725217352174521755217652177521785217952180521815218252183521845218552186521875218852189521905219152192521935219452195521965219752198521995220052201522025220352204522055220652207522085220952210522115221252213522145221552216522175221852219522205222152222522235222452225522265222752228522295223052231522325223352234522355223652237522385223952240522415224252243522445224552246522475224852249522505225152252522535225452255522565225752258522595226052261522625226352264522655226652267522685226952270522715227252273522745227552276522775227852279522805228152282522835228452285522865228752288522895229052291522925229352294522955229652297522985229952300523015230252303523045230552306523075230852309523105231152312523135231452315523165231752318523195232052321523225232352324523255232652327523285232952330523315233252333523345233552336523375233852339523405234152342523435234452345523465234752348523495235052351523525235352354523555235652357523585235952360523615236252363523645236552366523675236852369523705237152372523735237452375523765237752378523795238052381523825238352384523855238652387523885238952390523915239252393523945239552396523975239852399524005240152402524035240452405524065240752408524095241052411524125241352414524155241652417524185241952420524215242252423524245242552426524275242852429524305243152432524335243452435524365243752438524395244052441524425244352444524455244652447524485244952450524515245252453524545245552456524575245852459524605246152462524635246452465524665246752468524695247052471524725247352474524755247652477524785247952480524815248252483524845248552486524875248852489524905249152492524935249452495524965249752498524995250052501525025250352504525055250652507525085250952510525115251252513525145251552516525175251852519525205252152522525235252452525525265252752528525295253052531525325253352534525355253652537525385253952540525415254252543525445254552546525475254852549525505255152552525535255452555525565255752558525595256052561525625256352564525655256652567525685256952570525715257252573525745257552576525775257852579525805258152582525835258452585525865258752588525895259052591525925259352594525955259652597525985259952600526015260252603526045260552606526075260852609526105261152612526135261452615526165261752618526195262052621526225262352624526255262652627526285262952630526315263252633526345263552636526375263852639526405264152642526435264452645526465264752648526495265052651526525265352654526555265652657526585265952660526615266252663526645266552666526675266852669526705267152672526735267452675526765267752678526795268052681526825268352684526855268652687526885268952690526915269252693526945269552696526975269852699527005270152702527035270452705527065270752708527095271052711527125271352714527155271652717527185271952720527215272252723527245272552726527275272852729527305273152732527335273452735527365273752738527395274052741527425274352744527455274652747527485274952750527515275252753527545275552756527575275852759527605276152762527635276452765527665276752768527695277052771527725277352774527755277652777527785277952780527815278252783527845278552786527875278852789527905279152792527935279452795527965279752798527995280052801528025280352804528055280652807528085280952810528115281252813528145281552816528175281852819528205282152822528235282452825528265282752828528295283052831528325283352834528355283652837528385283952840528415284252843528445284552846528475284852849528505285152852528535285452855528565285752858528595286052861528625286352864528655286652867528685286952870528715287252873528745287552876528775287852879528805288152882528835288452885528865288752888528895289052891528925289352894528955289652897528985289952900529015290252903529045290552906529075290852909529105291152912529135291452915529165291752918529195292052921529225292352924529255292652927529285292952930529315293252933529345293552936529375293852939529405294152942529435294452945529465294752948529495295052951529525295352954529555295652957529585295952960529615296252963529645296552966529675296852969529705297152972529735297452975529765297752978529795298052981529825298352984529855298652987529885298952990529915299252993529945299552996529975299852999530005300153002530035300453005530065300753008530095301053011530125301353014530155301653017530185301953020530215302253023530245302553026530275302853029530305303153032530335303453035530365303753038530395304053041530425304353044530455304653047530485304953050530515305253053530545305553056530575305853059530605306153062530635306453065530665306753068530695307053071530725307353074530755307653077530785307953080530815308253083530845308553086530875308853089530905309153092530935309453095530965309753098530995310053101531025310353104531055310653107531085310953110531115311253113531145311553116531175311853119531205312153122531235312453125531265312753128531295313053131531325313353134531355313653137531385313953140531415314253143531445314553146531475314853149531505315153152531535315453155531565315753158531595316053161531625316353164531655316653167531685316953170531715317253173531745317553176531775317853179531805318153182531835318453185531865318753188531895319053191531925319353194531955319653197531985319953200532015320253203532045320553206532075320853209532105321153212532135321453215532165321753218532195322053221532225322353224532255322653227532285322953230532315323253233532345323553236532375323853239532405324153242532435324453245532465324753248532495325053251532525325353254532555325653257532585325953260532615326253263532645326553266532675326853269532705327153272532735327453275532765327753278532795328053281532825328353284532855328653287532885328953290532915329253293532945329553296532975329853299533005330153302533035330453305533065330753308533095331053311533125331353314533155331653317533185331953320533215332253323533245332553326533275332853329533305333153332533335333453335533365333753338533395334053341533425334353344533455334653347533485334953350533515335253353533545335553356533575335853359533605336153362533635336453365533665336753368533695337053371533725337353374533755337653377533785337953380533815338253383533845338553386533875338853389533905339153392533935339453395533965339753398533995340053401534025340353404534055340653407534085340953410534115341253413534145341553416534175341853419534205342153422534235342453425534265342753428534295343053431534325343353434534355343653437534385343953440534415344253443534445344553446534475344853449534505345153452534535345453455534565345753458534595346053461534625346353464534655346653467534685346953470534715347253473534745347553476534775347853479534805348153482534835348453485534865348753488534895349053491534925349353494534955349653497534985349953500535015350253503535045350553506535075350853509535105351153512535135351453515535165351753518535195352053521535225352353524535255352653527535285352953530535315353253533535345353553536535375353853539535405354153542535435354453545535465354753548535495355053551535525355353554535555355653557535585355953560535615356253563535645356553566535675356853569535705357153572535735357453575535765357753578535795358053581535825358353584535855358653587535885358953590535915359253593535945359553596535975359853599536005360153602536035360453605536065360753608536095361053611536125361353614536155361653617536185361953620536215362253623536245362553626536275362853629536305363153632536335363453635536365363753638536395364053641536425364353644536455364653647536485364953650536515365253653536545365553656536575365853659536605366153662536635366453665536665366753668536695367053671536725367353674536755367653677536785367953680536815368253683536845368553686536875368853689536905369153692536935369453695536965369753698536995370053701537025370353704537055370653707537085370953710537115371253713537145371553716537175371853719537205372153722537235372453725537265372753728537295373053731537325373353734537355373653737537385373953740537415374253743537445374553746537475374853749537505375153752537535375453755537565375753758537595376053761537625376353764537655376653767537685376953770537715377253773537745377553776537775377853779537805378153782537835378453785537865378753788537895379053791537925379353794537955379653797537985379953800538015380253803538045380553806538075380853809538105381153812538135381453815538165381753818538195382053821538225382353824538255382653827538285382953830538315383253833538345383553836538375383853839538405384153842538435384453845538465384753848538495385053851538525385353854538555385653857538585385953860538615386253863538645386553866538675386853869538705387153872538735387453875538765387753878538795388053881538825388353884538855388653887538885388953890538915389253893538945389553896538975389853899539005390153902539035390453905539065390753908539095391053911539125391353914539155391653917539185391953920539215392253923539245392553926539275392853929539305393153932539335393453935539365393753938539395394053941539425394353944539455394653947539485394953950539515395253953539545395553956539575395853959539605396153962539635396453965539665396753968539695397053971539725397353974539755397653977539785397953980539815398253983539845398553986539875398853989539905399153992539935399453995539965399753998539995400054001540025400354004540055400654007540085400954010540115401254013540145401554016540175401854019540205402154022540235402454025540265402754028540295403054031540325403354034540355403654037540385403954040540415404254043540445404554046540475404854049540505405154052540535405454055540565405754058540595406054061540625406354064540655406654067540685406954070540715407254073540745407554076540775407854079540805408154082540835408454085540865408754088540895409054091540925409354094540955409654097540985409954100541015410254103541045410554106541075410854109541105411154112541135411454115541165411754118541195412054121541225412354124541255412654127541285412954130541315413254133541345413554136541375413854139541405414154142541435414454145541465414754148541495415054151541525415354154541555415654157541585415954160541615416254163541645416554166541675416854169541705417154172541735417454175541765417754178541795418054181541825418354184541855418654187541885418954190541915419254193541945419554196541975419854199542005420154202542035420454205542065420754208542095421054211542125421354214542155421654217542185421954220542215422254223542245422554226542275422854229542305423154232542335423454235542365423754238542395424054241542425424354244542455424654247542485424954250542515425254253542545425554256542575425854259542605426154262542635426454265542665426754268542695427054271542725427354274542755427654277542785427954280542815428254283542845428554286542875428854289542905429154292542935429454295542965429754298542995430054301543025430354304543055430654307543085430954310543115431254313543145431554316543175431854319543205432154322543235432454325543265432754328543295433054331543325433354334543355433654337543385433954340543415434254343543445434554346543475434854349543505435154352543535435454355543565435754358543595436054361543625436354364543655436654367543685436954370543715437254373543745437554376543775437854379543805438154382543835438454385543865438754388543895439054391543925439354394543955439654397543985439954400544015440254403544045440554406544075440854409544105441154412544135441454415544165441754418544195442054421544225442354424544255442654427544285442954430544315443254433544345443554436544375443854439544405444154442544435444454445544465444754448544495445054451544525445354454544555445654457544585445954460544615446254463544645446554466544675446854469544705447154472544735447454475544765447754478544795448054481544825448354484544855448654487544885448954490544915449254493544945449554496544975449854499545005450154502545035450454505545065450754508545095451054511545125451354514545155451654517545185451954520545215452254523545245452554526545275452854529545305453154532545335453454535545365453754538545395454054541545425454354544545455454654547545485454954550545515455254553545545455554556545575455854559545605456154562545635456454565545665456754568545695457054571545725457354574545755457654577545785457954580545815458254583545845458554586545875458854589545905459154592545935459454595545965459754598545995460054601546025460354604546055460654607546085460954610546115461254613546145461554616546175461854619546205462154622546235462454625546265462754628546295463054631546325463354634546355463654637546385463954640546415464254643546445464554646546475464854649546505465154652546535465454655546565465754658546595466054661546625466354664546655466654667546685466954670546715467254673546745467554676546775467854679546805468154682546835468454685546865468754688546895469054691546925469354694546955469654697546985469954700547015470254703547045470554706547075470854709547105471154712547135471454715547165471754718547195472054721547225472354724547255472654727547285472954730547315473254733547345473554736547375473854739547405474154742547435474454745547465474754748547495475054751547525475354754547555475654757547585475954760547615476254763547645476554766547675476854769547705477154772547735477454775547765477754778547795478054781547825478354784547855478654787547885478954790547915479254793547945479554796547975479854799548005480154802548035480454805548065480754808548095481054811548125481354814548155481654817548185481954820548215482254823548245482554826548275482854829548305483154832548335483454835548365483754838548395484054841548425484354844548455484654847548485484954850548515485254853548545485554856548575485854859548605486154862548635486454865548665486754868548695487054871548725487354874548755487654877548785487954880548815488254883548845488554886548875488854889548905489154892548935489454895548965489754898548995490054901549025490354904549055490654907549085490954910549115491254913549145491554916549175491854919549205492154922549235492454925549265492754928549295493054931549325493354934549355493654937549385493954940549415494254943549445494554946549475494854949549505495154952549535495454955549565495754958549595496054961549625496354964549655496654967549685496954970549715497254973549745497554976549775497854979549805498154982549835498454985549865498754988549895499054991549925499354994549955499654997549985499955000550015500255003550045500555006550075500855009550105501155012550135501455015550165501755018550195502055021550225502355024550255502655027550285502955030550315503255033550345503555036550375503855039550405504155042550435504455045550465504755048550495505055051550525505355054550555505655057550585505955060550615506255063550645506555066550675506855069550705507155072550735507455075550765507755078550795508055081550825508355084550855508655087550885508955090550915509255093550945509555096550975509855099551005510155102551035510455105551065510755108551095511055111551125511355114551155511655117551185511955120551215512255123551245512555126551275512855129551305513155132551335513455135551365513755138551395514055141551425514355144551455514655147551485514955150551515515255153551545515555156551575515855159551605516155162551635516455165551665516755168551695517055171551725517355174551755517655177551785517955180551815518255183551845518555186551875518855189551905519155192551935519455195551965519755198551995520055201552025520355204552055520655207552085520955210552115521255213552145521555216552175521855219552205522155222552235522455225552265522755228552295523055231552325523355234552355523655237552385523955240552415524255243552445524555246552475524855249552505525155252552535525455255552565525755258552595526055261552625526355264552655526655267552685526955270552715527255273552745527555276552775527855279552805528155282552835528455285552865528755288552895529055291552925529355294552955529655297552985529955300553015530255303553045530555306553075530855309553105531155312553135531455315553165531755318553195532055321553225532355324553255532655327553285532955330553315533255333553345533555336553375533855339553405534155342553435534455345553465534755348553495535055351553525535355354553555535655357553585535955360553615536255363553645536555366553675536855369553705537155372553735537455375553765537755378553795538055381553825538355384553855538655387553885538955390553915539255393553945539555396553975539855399554005540155402554035540455405554065540755408554095541055411554125541355414554155541655417554185541955420554215542255423554245542555426554275542855429554305543155432554335543455435554365543755438554395544055441554425544355444554455544655447554485544955450554515545255453554545545555456554575545855459554605546155462554635546455465554665546755468554695547055471554725547355474554755547655477554785547955480554815548255483554845548555486554875548855489554905549155492554935549455495554965549755498554995550055501555025550355504555055550655507555085550955510555115551255513555145551555516555175551855519555205552155522555235552455525555265552755528555295553055531555325553355534555355553655537555385553955540555415554255543555445554555546555475554855549555505555155552555535555455555555565555755558555595556055561555625556355564555655556655567555685556955570555715557255573555745557555576555775557855579555805558155582555835558455585555865558755588555895559055591555925559355594555955559655597555985559955600556015560255603556045560555606556075560855609556105561155612556135561455615556165561755618556195562055621556225562355624556255562655627556285562955630556315563255633556345563555636556375563855639556405564155642556435564455645556465564755648556495565055651556525565355654556555565655657556585565955660556615566255663556645566555666556675566855669556705567155672556735567455675556765567755678556795568055681556825568355684556855568655687556885568955690556915569255693556945569555696556975569855699557005570155702557035570455705557065570755708557095571055711557125571355714557155571655717557185571955720557215572255723557245572555726557275572855729557305573155732557335573455735557365573755738557395574055741557425574355744557455574655747557485574955750557515575255753557545575555756557575575855759557605576155762557635576455765557665576755768557695577055771557725577355774557755577655777557785577955780557815578255783557845578555786557875578855789557905579155792557935579455795557965579755798557995580055801558025580355804558055580655807558085580955810558115581255813558145581555816558175581855819558205582155822558235582455825558265582755828558295583055831558325583355834558355583655837558385583955840558415584255843558445584555846558475584855849558505585155852558535585455855558565585755858558595586055861558625586355864558655586655867558685586955870558715587255873558745587555876558775587855879558805588155882558835588455885558865588755888558895589055891558925589355894558955589655897558985589955900559015590255903559045590555906559075590855909559105591155912559135591455915559165591755918559195592055921559225592355924559255592655927559285592955930559315593255933559345593555936559375593855939559405594155942559435594455945559465594755948559495595055951559525595355954559555595655957559585595955960559615596255963559645596555966559675596855969559705597155972559735597455975559765597755978559795598055981559825598355984559855598655987559885598955990559915599255993559945599555996559975599855999560005600156002560035600456005560065600756008560095601056011560125601356014560155601656017560185601956020560215602256023560245602556026560275602856029560305603156032560335603456035560365603756038560395604056041560425604356044560455604656047560485604956050560515605256053560545605556056560575605856059560605606156062560635606456065560665606756068560695607056071560725607356074560755607656077560785607956080560815608256083560845608556086560875608856089560905609156092560935609456095560965609756098560995610056101561025610356104561055610656107561085610956110561115611256113561145611556116561175611856119561205612156122561235612456125561265612756128561295613056131561325613356134561355613656137561385613956140561415614256143561445614556146561475614856149561505615156152561535615456155561565615756158561595616056161561625616356164561655616656167561685616956170561715617256173561745617556176561775617856179561805618156182561835618456185561865618756188561895619056191561925619356194561955619656197561985619956200562015620256203562045620556206562075620856209562105621156212562135621456215562165621756218562195622056221562225622356224562255622656227562285622956230562315623256233562345623556236562375623856239562405624156242562435624456245562465624756248562495625056251562525625356254562555625656257562585625956260562615626256263562645626556266562675626856269562705627156272562735627456275562765627756278562795628056281562825628356284562855628656287562885628956290562915629256293562945629556296562975629856299563005630156302563035630456305563065630756308563095631056311563125631356314563155631656317563185631956320563215632256323563245632556326563275632856329563305633156332563335633456335563365633756338563395634056341563425634356344563455634656347563485634956350563515635256353563545635556356563575635856359563605636156362563635636456365563665636756368563695637056371563725637356374563755637656377563785637956380563815638256383563845638556386563875638856389563905639156392563935639456395563965639756398563995640056401564025640356404564055640656407564085640956410564115641256413564145641556416564175641856419564205642156422564235642456425564265642756428564295643056431564325643356434564355643656437564385643956440564415644256443564445644556446564475644856449564505645156452564535645456455564565645756458564595646056461564625646356464564655646656467564685646956470564715647256473564745647556476564775647856479564805648156482564835648456485564865648756488564895649056491564925649356494564955649656497564985649956500565015650256503565045650556506565075650856509565105651156512565135651456515565165651756518565195652056521565225652356524565255652656527565285652956530565315653256533565345653556536565375653856539565405654156542565435654456545565465654756548565495655056551565525655356554565555655656557565585655956560565615656256563565645656556566565675656856569565705657156572565735657456575565765657756578565795658056581565825658356584565855658656587565885658956590565915659256593565945659556596565975659856599566005660156602566035660456605566065660756608566095661056611566125661356614566155661656617566185661956620566215662256623566245662556626566275662856629566305663156632566335663456635566365663756638566395664056641566425664356644566455664656647566485664956650566515665256653566545665556656566575665856659566605666156662566635666456665566665666756668566695667056671566725667356674566755667656677566785667956680566815668256683566845668556686566875668856689566905669156692566935669456695566965669756698566995670056701567025670356704567055670656707567085670956710567115671256713567145671556716567175671856719567205672156722567235672456725567265672756728567295673056731567325673356734567355673656737567385673956740567415674256743567445674556746567475674856749567505675156752567535675456755567565675756758567595676056761567625676356764567655676656767567685676956770567715677256773567745677556776567775677856779567805678156782567835678456785567865678756788567895679056791567925679356794567955679656797567985679956800568015680256803568045680556806568075680856809568105681156812568135681456815568165681756818568195682056821568225682356824568255682656827568285682956830568315683256833568345683556836568375683856839568405684156842568435684456845568465684756848568495685056851568525685356854568555685656857568585685956860568615686256863568645686556866568675686856869568705687156872568735687456875568765687756878568795688056881568825688356884568855688656887568885688956890568915689256893568945689556896568975689856899569005690156902569035690456905569065690756908569095691056911569125691356914569155691656917569185691956920569215692256923569245692556926569275692856929569305693156932569335693456935569365693756938569395694056941569425694356944569455694656947569485694956950569515695256953569545695556956569575695856959569605696156962569635696456965569665696756968569695697056971569725697356974569755697656977569785697956980569815698256983569845698556986569875698856989569905699156992569935699456995569965699756998569995700057001570025700357004570055700657007570085700957010570115701257013570145701557016570175701857019570205702157022570235702457025570265702757028570295703057031570325703357034570355703657037570385703957040570415704257043570445704557046570475704857049570505705157052570535705457055570565705757058570595706057061570625706357064570655706657067570685706957070570715707257073570745707557076570775707857079570805708157082570835708457085570865708757088570895709057091570925709357094570955709657097570985709957100571015710257103571045710557106571075710857109571105711157112571135711457115571165711757118571195712057121571225712357124571255712657127571285712957130571315713257133571345713557136571375713857139571405714157142571435714457145571465714757148571495715057151571525715357154571555715657157571585715957160571615716257163571645716557166571675716857169571705717157172571735717457175571765717757178571795718057181571825718357184571855718657187571885718957190571915719257193571945719557196571975719857199572005720157202572035720457205572065720757208572095721057211572125721357214572155721657217572185721957220572215722257223572245722557226572275722857229572305723157232572335723457235572365723757238572395724057241572425724357244572455724657247572485724957250572515725257253572545725557256572575725857259572605726157262572635726457265572665726757268572695727057271572725727357274572755727657277572785727957280572815728257283572845728557286572875728857289572905729157292572935729457295572965729757298572995730057301573025730357304573055730657307573085730957310573115731257313573145731557316573175731857319573205732157322573235732457325573265732757328573295733057331573325733357334573355733657337573385733957340573415734257343573445734557346573475734857349573505735157352573535735457355573565735757358573595736057361573625736357364573655736657367573685736957370573715737257373573745737557376573775737857379573805738157382573835738457385573865738757388573895739057391573925739357394573955739657397573985739957400574015740257403574045740557406574075740857409574105741157412574135741457415574165741757418574195742057421574225742357424574255742657427574285742957430574315743257433574345743557436574375743857439574405744157442574435744457445574465744757448574495745057451574525745357454574555745657457574585745957460574615746257463574645746557466574675746857469574705747157472574735747457475574765747757478574795748057481574825748357484574855748657487574885748957490574915749257493574945749557496574975749857499575005750157502575035750457505575065750757508575095751057511575125751357514575155751657517575185751957520575215752257523575245752557526575275752857529575305753157532575335753457535575365753757538575395754057541575425754357544575455754657547575485754957550575515755257553575545755557556575575755857559575605756157562575635756457565575665756757568575695757057571575725757357574575755757657577575785757957580575815758257583575845758557586575875758857589575905759157592575935759457595575965759757598575995760057601576025760357604576055760657607576085760957610576115761257613576145761557616576175761857619576205762157622576235762457625576265762757628576295763057631576325763357634576355763657637576385763957640576415764257643576445764557646576475764857649576505765157652576535765457655576565765757658576595766057661576625766357664576655766657667576685766957670576715767257673576745767557676576775767857679576805768157682576835768457685576865768757688576895769057691576925769357694576955769657697576985769957700577015770257703577045770557706577075770857709577105771157712577135771457715577165771757718577195772057721577225772357724577255772657727577285772957730577315773257733577345773557736577375773857739577405774157742577435774457745577465774757748577495775057751577525775357754577555775657757577585775957760577615776257763577645776557766577675776857769577705777157772577735777457775577765777757778577795778057781577825778357784577855778657787577885778957790577915779257793577945779557796577975779857799578005780157802578035780457805578065780757808578095781057811578125781357814578155781657817578185781957820578215782257823578245782557826578275782857829578305783157832578335783457835578365783757838578395784057841578425784357844578455784657847578485784957850578515785257853578545785557856578575785857859578605786157862578635786457865578665786757868578695787057871578725787357874578755787657877578785787957880578815788257883578845788557886578875788857889578905789157892578935789457895578965789757898578995790057901579025790357904579055790657907579085790957910579115791257913579145791557916579175791857919579205792157922579235792457925579265792757928579295793057931579325793357934579355793657937579385793957940579415794257943579445794557946579475794857949579505795157952579535795457955579565795757958579595796057961579625796357964579655796657967579685796957970579715797257973579745797557976579775797857979579805798157982579835798457985579865798757988579895799057991579925799357994579955799657997579985799958000580015800258003580045800558006580075800858009580105801158012580135801458015580165801758018580195802058021580225802358024580255802658027580285802958030580315803258033580345803558036580375803858039580405804158042580435804458045580465804758048580495805058051580525805358054580555805658057580585805958060580615806258063580645806558066580675806858069580705807158072580735807458075580765807758078580795808058081580825808358084580855808658087580885808958090580915809258093580945809558096580975809858099581005810158102581035810458105581065810758108581095811058111581125811358114581155811658117581185811958120581215812258123581245812558126581275812858129581305813158132581335813458135581365813758138581395814058141581425814358144581455814658147581485814958150581515815258153581545815558156581575815858159581605816158162581635816458165581665816758168581695817058171581725817358174581755817658177581785817958180581815818258183581845818558186581875818858189581905819158192581935819458195581965819758198581995820058201582025820358204582055820658207582085820958210582115821258213582145821558216582175821858219582205822158222582235822458225582265822758228582295823058231582325823358234582355823658237582385823958240582415824258243582445824558246582475824858249582505825158252582535825458255582565825758258582595826058261582625826358264582655826658267582685826958270582715827258273582745827558276582775827858279582805828158282582835828458285582865828758288582895829058291582925829358294582955829658297582985829958300583015830258303583045830558306583075830858309583105831158312583135831458315583165831758318583195832058321583225832358324583255832658327583285832958330583315833258333583345833558336583375833858339583405834158342583435834458345583465834758348583495835058351583525835358354583555835658357583585835958360583615836258363583645836558366583675836858369583705837158372583735837458375583765837758378583795838058381583825838358384583855838658387583885838958390583915839258393583945839558396583975839858399584005840158402584035840458405584065840758408584095841058411584125841358414584155841658417584185841958420584215842258423584245842558426584275842858429584305843158432584335843458435584365843758438584395844058441584425844358444584455844658447584485844958450584515845258453584545845558456584575845858459584605846158462584635846458465584665846758468584695847058471584725847358474584755847658477584785847958480584815848258483584845848558486584875848858489584905849158492584935849458495584965849758498584995850058501585025850358504585055850658507585085850958510585115851258513585145851558516585175851858519585205852158522585235852458525585265852758528585295853058531585325853358534585355853658537585385853958540585415854258543585445854558546585475854858549585505855158552585535855458555585565855758558585595856058561585625856358564585655856658567585685856958570585715857258573585745857558576585775857858579585805858158582585835858458585585865858758588585895859058591585925859358594585955859658597585985859958600586015860258603586045860558606586075860858609586105861158612586135861458615586165861758618586195862058621586225862358624586255862658627586285862958630586315863258633586345863558636586375863858639586405864158642586435864458645586465864758648586495865058651586525865358654586555865658657586585865958660586615866258663586645866558666586675866858669586705867158672586735867458675586765867758678586795868058681586825868358684586855868658687586885868958690586915869258693586945869558696586975869858699587005870158702587035870458705587065870758708587095871058711587125871358714587155871658717587185871958720587215872258723587245872558726587275872858729587305873158732587335873458735587365873758738587395874058741587425874358744587455874658747587485874958750587515875258753587545875558756587575875858759587605876158762587635876458765587665876758768587695877058771587725877358774587755877658777587785877958780587815878258783587845878558786587875878858789587905879158792587935879458795587965879758798587995880058801588025880358804588055880658807588085880958810588115881258813588145881558816588175881858819588205882158822588235882458825588265882758828588295883058831588325883358834588355883658837588385883958840588415884258843588445884558846588475884858849588505885158852588535885458855588565885758858588595886058861588625886358864588655886658867588685886958870588715887258873588745887558876588775887858879588805888158882588835888458885588865888758888588895889058891588925889358894588955889658897588985889958900589015890258903589045890558906589075890858909589105891158912589135891458915589165891758918589195892058921589225892358924589255892658927589285892958930589315893258933589345893558936589375893858939589405894158942589435894458945589465894758948589495895058951589525895358954589555895658957589585895958960589615896258963589645896558966589675896858969589705897158972589735897458975589765897758978589795898058981589825898358984589855898658987589885898958990589915899258993589945899558996589975899858999590005900159002590035900459005590065900759008590095901059011590125901359014590155901659017590185901959020590215902259023590245902559026590275902859029590305903159032590335903459035590365903759038590395904059041590425904359044590455904659047590485904959050590515905259053590545905559056590575905859059590605906159062590635906459065590665906759068590695907059071590725907359074590755907659077590785907959080590815908259083590845908559086590875908859089590905909159092590935909459095590965909759098590995910059101591025910359104591055910659107591085910959110591115911259113591145911559116591175911859119591205912159122591235912459125591265912759128591295913059131591325913359134591355913659137591385913959140591415914259143591445914559146591475914859149591505915159152591535915459155591565915759158591595916059161591625916359164591655916659167591685916959170591715917259173591745917559176591775917859179591805918159182591835918459185591865918759188591895919059191591925919359194591955919659197591985919959200592015920259203592045920559206592075920859209592105921159212592135921459215592165921759218592195922059221592225922359224592255922659227592285922959230592315923259233592345923559236592375923859239592405924159242592435924459245592465924759248592495925059251592525925359254592555925659257592585925959260592615926259263592645926559266592675926859269592705927159272592735927459275592765927759278592795928059281592825928359284592855928659287592885928959290592915929259293592945929559296592975929859299593005930159302593035930459305593065930759308593095931059311593125931359314593155931659317593185931959320593215932259323593245932559326593275932859329593305933159332593335933459335593365933759338593395934059341593425934359344593455934659347593485934959350593515935259353593545935559356593575935859359593605936159362593635936459365593665936759368593695937059371593725937359374593755937659377593785937959380593815938259383593845938559386593875938859389593905939159392593935939459395593965939759398593995940059401594025940359404594055940659407594085940959410594115941259413594145941559416594175941859419594205942159422594235942459425594265942759428594295943059431594325943359434594355943659437594385943959440594415944259443594445944559446594475944859449594505945159452594535945459455594565945759458594595946059461594625946359464594655946659467594685946959470594715947259473594745947559476594775947859479594805948159482594835948459485594865948759488594895949059491594925949359494594955949659497594985949959500595015950259503595045950559506595075950859509595105951159512595135951459515595165951759518595195952059521595225952359524595255952659527595285952959530595315953259533595345953559536595375953859539595405954159542595435954459545595465954759548595495955059551595525955359554595555955659557595585955959560595615956259563595645956559566595675956859569595705957159572595735957459575595765957759578595795958059581595825958359584595855958659587595885958959590595915959259593595945959559596595975959859599596005960159602596035960459605596065960759608596095961059611596125961359614596155961659617596185961959620596215962259623596245962559626596275962859629596305963159632596335963459635596365963759638596395964059641596425964359644596455964659647596485964959650596515965259653596545965559656596575965859659596605966159662596635966459665596665966759668596695967059671596725967359674596755967659677596785967959680596815968259683596845968559686596875968859689596905969159692596935969459695596965969759698596995970059701597025970359704597055970659707597085970959710597115971259713597145971559716597175971859719597205972159722597235972459725597265972759728597295973059731597325973359734597355973659737597385973959740597415974259743597445974559746597475974859749597505975159752597535975459755597565975759758597595976059761597625976359764597655976659767597685976959770597715977259773597745977559776597775977859779597805978159782597835978459785597865978759788597895979059791597925979359794597955979659797597985979959800598015980259803598045980559806598075980859809598105981159812598135981459815598165981759818598195982059821598225982359824598255982659827598285982959830598315983259833598345983559836598375983859839598405984159842598435984459845598465984759848598495985059851598525985359854598555985659857598585985959860598615986259863598645986559866598675986859869598705987159872598735987459875598765987759878598795988059881598825988359884598855988659887598885988959890598915989259893598945989559896598975989859899599005990159902599035990459905599065990759908599095991059911599125991359914599155991659917599185991959920599215992259923599245992559926599275992859929599305993159932599335993459935599365993759938599395994059941599425994359944599455994659947599485994959950599515995259953599545995559956599575995859959599605996159962599635996459965599665996759968599695997059971599725997359974599755997659977599785997959980599815998259983599845998559986599875998859989599905999159992599935999459995599965999759998599996000060001600026000360004600056000660007600086000960010600116001260013600146001560016600176001860019600206002160022600236002460025600266002760028600296003060031600326003360034600356003660037600386003960040600416004260043600446004560046600476004860049600506005160052600536005460055600566005760058600596006060061600626006360064600656006660067600686006960070600716007260073600746007560076600776007860079600806008160082600836008460085600866008760088600896009060091600926009360094600956009660097600986009960100601016010260103601046010560106601076010860109601106011160112601136011460115601166011760118601196012060121601226012360124601256012660127601286012960130601316013260133601346013560136601376013860139601406014160142601436014460145601466014760148601496015060151601526015360154601556015660157601586015960160601616016260163601646016560166601676016860169601706017160172601736017460175601766017760178601796018060181601826018360184601856018660187601886018960190601916019260193601946019560196601976019860199602006020160202602036020460205602066020760208602096021060211602126021360214602156021660217602186021960220602216022260223602246022560226602276022860229602306023160232602336023460235602366023760238602396024060241602426024360244602456024660247602486024960250602516025260253602546025560256602576025860259602606026160262602636026460265602666026760268602696027060271602726027360274602756027660277602786027960280602816028260283602846028560286602876028860289602906029160292602936029460295602966029760298602996030060301603026030360304603056030660307603086030960310603116031260313603146031560316603176031860319603206032160322603236032460325603266032760328603296033060331603326033360334603356033660337603386033960340603416034260343603446034560346603476034860349603506035160352603536035460355603566035760358603596036060361603626036360364603656036660367603686036960370603716037260373603746037560376603776037860379603806038160382603836038460385603866038760388603896039060391603926039360394603956039660397603986039960400604016040260403604046040560406604076040860409604106041160412604136041460415604166041760418604196042060421604226042360424604256042660427604286042960430604316043260433604346043560436604376043860439604406044160442604436044460445604466044760448604496045060451604526045360454604556045660457604586045960460604616046260463604646046560466604676046860469604706047160472604736047460475604766047760478604796048060481604826048360484604856048660487604886048960490604916049260493604946049560496604976049860499605006050160502605036050460505605066050760508605096051060511605126051360514605156051660517605186051960520605216052260523605246052560526605276052860529605306053160532605336053460535605366053760538605396054060541605426054360544605456054660547605486054960550605516055260553605546055560556605576055860559605606056160562605636056460565605666056760568605696057060571605726057360574605756057660577605786057960580605816058260583605846058560586605876058860589605906059160592605936059460595605966059760598605996060060601606026060360604606056060660607606086060960610606116061260613606146061560616606176061860619606206062160622606236062460625606266062760628606296063060631606326063360634606356063660637606386063960640606416064260643606446064560646606476064860649606506065160652606536065460655606566065760658606596066060661606626066360664606656066660667606686066960670606716067260673606746067560676606776067860679606806068160682606836068460685606866068760688606896069060691606926069360694606956069660697606986069960700607016070260703607046070560706607076070860709607106071160712607136071460715607166071760718607196072060721607226072360724607256072660727607286072960730607316073260733607346073560736607376073860739607406074160742607436074460745607466074760748607496075060751607526075360754607556075660757607586075960760607616076260763607646076560766607676076860769607706077160772607736077460775607766077760778607796078060781607826078360784607856078660787607886078960790607916079260793607946079560796607976079860799608006080160802608036080460805608066080760808608096081060811608126081360814608156081660817608186081960820608216082260823608246082560826608276082860829608306083160832608336083460835608366083760838608396084060841608426084360844608456084660847608486084960850608516085260853608546085560856608576085860859608606086160862608636086460865608666086760868608696087060871608726087360874608756087660877608786087960880608816088260883608846088560886608876088860889608906089160892608936089460895608966089760898608996090060901609026090360904609056090660907609086090960910609116091260913609146091560916609176091860919609206092160922609236092460925609266092760928609296093060931609326093360934609356093660937609386093960940609416094260943609446094560946609476094860949609506095160952609536095460955609566095760958609596096060961609626096360964609656096660967609686096960970609716097260973609746097560976609776097860979609806098160982609836098460985609866098760988609896099060991609926099360994609956099660997609986099961000610016100261003610046100561006610076100861009610106101161012610136101461015610166101761018610196102061021610226102361024610256102661027610286102961030610316103261033610346103561036610376103861039610406104161042610436104461045610466104761048610496105061051610526105361054610556105661057610586105961060610616106261063610646106561066610676106861069610706107161072610736107461075610766107761078610796108061081610826108361084610856108661087610886108961090610916109261093610946109561096610976109861099611006110161102611036110461105611066110761108611096111061111611126111361114611156111661117611186111961120611216112261123611246112561126611276112861129611306113161132611336113461135611366113761138611396114061141611426114361144611456114661147611486114961150611516115261153611546115561156611576115861159611606116161162611636116461165611666116761168611696117061171611726117361174611756117661177611786117961180611816118261183611846118561186611876118861189611906119161192611936119461195611966119761198611996120061201612026120361204612056120661207612086120961210612116121261213612146121561216612176121861219612206122161222612236122461225612266122761228612296123061231612326123361234612356123661237612386123961240612416124261243612446124561246612476124861249612506125161252612536125461255612566125761258612596126061261612626126361264612656126661267612686126961270612716127261273612746127561276612776127861279612806128161282612836128461285612866128761288612896129061291612926129361294612956129661297612986129961300613016130261303613046130561306613076130861309613106131161312613136131461315613166131761318613196132061321613226132361324613256132661327613286132961330613316133261333613346133561336613376133861339613406134161342613436134461345613466134761348613496135061351613526135361354613556135661357613586135961360613616136261363613646136561366613676136861369613706137161372613736137461375613766137761378613796138061381613826138361384613856138661387613886138961390613916139261393613946139561396613976139861399614006140161402614036140461405614066140761408614096141061411614126141361414614156141661417614186141961420614216142261423614246142561426614276142861429614306143161432614336143461435614366143761438614396144061441614426144361444614456144661447614486144961450614516145261453614546145561456614576145861459614606146161462614636146461465614666146761468614696147061471614726147361474614756147661477614786147961480614816148261483614846148561486614876148861489614906149161492614936149461495614966149761498614996150061501615026150361504615056150661507615086150961510615116151261513615146151561516615176151861519615206152161522615236152461525615266152761528615296153061531615326153361534615356153661537615386153961540615416154261543615446154561546615476154861549615506155161552615536155461555615566155761558615596156061561615626156361564615656156661567615686156961570615716157261573615746157561576615776157861579615806158161582615836158461585615866158761588615896159061591615926159361594615956159661597615986159961600616016160261603616046160561606616076160861609616106161161612616136161461615616166161761618616196162061621616226162361624616256162661627616286162961630616316163261633616346163561636616376163861639616406164161642616436164461645616466164761648616496165061651616526165361654616556165661657616586165961660616616166261663616646166561666616676166861669616706167161672616736167461675616766167761678616796168061681616826168361684616856168661687616886168961690616916169261693616946169561696616976169861699617006170161702617036170461705617066170761708617096171061711617126171361714617156171661717617186171961720617216172261723617246172561726617276172861729617306173161732617336173461735617366173761738617396174061741617426174361744617456174661747617486174961750617516175261753617546175561756617576175861759617606176161762617636176461765617666176761768617696177061771617726177361774617756177661777617786177961780617816178261783617846178561786617876178861789617906179161792617936179461795617966179761798617996180061801618026180361804618056180661807618086180961810618116181261813618146181561816618176181861819618206182161822618236182461825618266182761828618296183061831618326183361834618356183661837618386183961840618416184261843618446184561846618476184861849618506185161852618536185461855618566185761858618596186061861618626186361864618656186661867618686186961870618716187261873618746187561876618776187861879618806188161882618836188461885618866188761888618896189061891618926189361894618956189661897618986189961900619016190261903619046190561906619076190861909619106191161912619136191461915619166191761918619196192061921619226192361924619256192661927619286192961930619316193261933619346193561936619376193861939619406194161942619436194461945619466194761948619496195061951619526195361954619556195661957619586195961960619616196261963619646196561966619676196861969619706197161972619736197461975619766197761978619796198061981619826198361984619856198661987619886198961990619916199261993619946199561996619976199861999620006200162002620036200462005620066200762008620096201062011620126201362014620156201662017620186201962020620216202262023620246202562026620276202862029620306203162032620336203462035620366203762038620396204062041620426204362044620456204662047620486204962050620516205262053620546205562056620576205862059620606206162062620636206462065620666206762068620696207062071620726207362074620756207662077620786207962080620816208262083620846208562086620876208862089620906209162092620936209462095620966209762098620996210062101621026210362104621056210662107621086210962110621116211262113621146211562116621176211862119621206212162122621236212462125621266212762128621296213062131621326213362134621356213662137621386213962140621416214262143621446214562146621476214862149621506215162152621536215462155621566215762158621596216062161621626216362164621656216662167621686216962170621716217262173621746217562176621776217862179621806218162182621836218462185621866218762188621896219062191621926219362194621956219662197621986219962200622016220262203622046220562206622076220862209622106221162212622136221462215622166221762218622196222062221622226222362224622256222662227622286222962230622316223262233622346223562236622376223862239622406224162242622436224462245622466224762248622496225062251622526225362254622556225662257622586225962260622616226262263622646226562266622676226862269622706227162272622736227462275622766227762278622796228062281622826228362284622856228662287622886228962290622916229262293622946229562296622976229862299623006230162302623036230462305623066230762308623096231062311623126231362314623156231662317623186231962320623216232262323623246232562326623276232862329623306233162332623336233462335623366233762338623396234062341623426234362344623456234662347623486234962350623516235262353623546235562356623576235862359623606236162362623636236462365623666236762368623696237062371623726237362374623756237662377623786237962380623816238262383623846238562386623876238862389623906239162392623936239462395623966239762398623996240062401624026240362404624056240662407624086240962410624116241262413624146241562416624176241862419624206242162422624236242462425624266242762428624296243062431624326243362434624356243662437624386243962440624416244262443624446244562446624476244862449624506245162452624536245462455624566245762458624596246062461624626246362464624656246662467624686246962470624716247262473624746247562476624776247862479624806248162482624836248462485624866248762488624896249062491624926249362494624956249662497624986249962500625016250262503625046250562506625076250862509625106251162512625136251462515625166251762518625196252062521625226252362524625256252662527625286252962530625316253262533625346253562536625376253862539625406254162542625436254462545625466254762548625496255062551625526255362554625556255662557625586255962560625616256262563625646256562566625676256862569625706257162572625736257462575625766257762578625796258062581625826258362584625856258662587625886258962590625916259262593625946259562596625976259862599626006260162602626036260462605626066260762608626096261062611626126261362614626156261662617626186261962620626216262262623626246262562626626276262862629626306263162632626336263462635626366263762638626396264062641626426264362644626456264662647626486264962650626516265262653626546265562656626576265862659626606266162662626636266462665626666266762668626696267062671626726267362674626756267662677626786267962680626816268262683626846268562686626876268862689626906269162692626936269462695626966269762698626996270062701627026270362704627056270662707627086270962710627116271262713627146271562716627176271862719627206272162722627236272462725627266272762728627296273062731627326273362734627356273662737627386273962740627416274262743627446274562746627476274862749627506275162752627536275462755627566275762758627596276062761627626276362764627656276662767627686276962770627716277262773627746277562776627776277862779627806278162782627836278462785627866278762788627896279062791627926279362794627956279662797627986279962800628016280262803628046280562806628076280862809628106281162812628136281462815628166281762818628196282062821628226282362824628256282662827628286282962830628316283262833628346283562836628376283862839628406284162842628436284462845628466284762848628496285062851628526285362854628556285662857628586285962860628616286262863628646286562866628676286862869628706287162872628736287462875628766287762878628796288062881628826288362884628856288662887628886288962890628916289262893628946289562896628976289862899629006290162902629036290462905629066290762908629096291062911629126291362914629156291662917629186291962920629216292262923629246292562926629276292862929629306293162932629336293462935629366293762938629396294062941629426294362944629456294662947629486294962950629516295262953629546295562956629576295862959629606296162962629636296462965629666296762968629696297062971629726297362974629756297662977629786297962980629816298262983629846298562986629876298862989629906299162992629936299462995629966299762998629996300063001630026300363004630056300663007630086300963010630116301263013630146301563016630176301863019630206302163022630236302463025630266302763028630296303063031630326303363034630356303663037630386303963040630416304263043630446304563046630476304863049630506305163052630536305463055630566305763058630596306063061630626306363064630656306663067630686306963070630716307263073630746307563076630776307863079630806308163082630836308463085630866308763088630896309063091630926309363094630956309663097630986309963100631016310263103631046310563106631076310863109631106311163112631136311463115631166311763118631196312063121631226312363124631256312663127631286312963130631316313263133631346313563136631376313863139631406314163142631436314463145631466314763148631496315063151631526315363154631556315663157631586315963160631616316263163631646316563166631676316863169631706317163172631736317463175631766317763178631796318063181631826318363184631856318663187631886318963190631916319263193631946319563196631976319863199632006320163202632036320463205632066320763208632096321063211632126321363214632156321663217632186321963220632216322263223632246322563226632276322863229632306323163232632336323463235632366323763238632396324063241632426324363244632456324663247632486324963250632516325263253632546325563256632576325863259632606326163262632636326463265632666326763268632696327063271632726327363274632756327663277632786327963280632816328263283632846328563286632876328863289632906329163292632936329463295632966329763298632996330063301633026330363304633056330663307633086330963310633116331263313633146331563316633176331863319633206332163322633236332463325633266332763328633296333063331633326333363334633356333663337633386333963340633416334263343633446334563346633476334863349633506335163352633536335463355633566335763358633596336063361633626336363364633656336663367633686336963370633716337263373633746337563376633776337863379633806338163382633836338463385633866338763388633896339063391633926339363394633956339663397633986339963400634016340263403634046340563406634076340863409634106341163412634136341463415634166341763418634196342063421634226342363424634256342663427634286342963430634316343263433634346343563436634376343863439634406344163442634436344463445634466344763448634496345063451634526345363454634556345663457634586345963460634616346263463634646346563466634676346863469634706347163472634736347463475634766347763478634796348063481634826348363484634856348663487634886348963490634916349263493634946349563496634976349863499635006350163502635036350463505635066350763508635096351063511635126351363514635156351663517635186351963520635216352263523635246352563526635276352863529635306353163532635336353463535635366353763538635396354063541635426354363544635456354663547635486354963550635516355263553635546355563556635576355863559635606356163562635636356463565635666356763568635696357063571635726357363574635756357663577635786357963580635816358263583635846358563586635876358863589635906359163592635936359463595635966359763598635996360063601636026360363604636056360663607636086360963610636116361263613636146361563616636176361863619636206362163622636236362463625636266362763628636296363063631636326363363634636356363663637636386363963640636416364263643636446364563646636476364863649636506365163652636536365463655636566365763658636596366063661636626366363664636656366663667636686366963670636716367263673636746367563676636776367863679636806368163682636836368463685636866368763688636896369063691636926369363694636956369663697636986369963700637016370263703637046370563706637076370863709637106371163712637136371463715637166371763718637196372063721637226372363724637256372663727637286372963730637316373263733637346373563736637376373863739637406374163742637436374463745637466374763748637496375063751637526375363754637556375663757637586375963760637616376263763637646376563766637676376863769637706377163772637736377463775637766377763778637796378063781637826378363784637856378663787637886378963790637916379263793637946379563796637976379863799638006380163802638036380463805638066380763808638096381063811638126381363814638156381663817638186381963820638216382263823638246382563826638276382863829638306383163832638336383463835638366383763838638396384063841638426384363844638456384663847638486384963850638516385263853638546385563856638576385863859638606386163862638636386463865638666386763868638696387063871638726387363874638756387663877638786387963880638816388263883638846388563886638876388863889638906389163892638936389463895638966389763898638996390063901639026390363904639056390663907639086390963910639116391263913639146391563916639176391863919639206392163922639236392463925639266392763928639296393063931639326393363934639356393663937639386393963940639416394263943639446394563946639476394863949639506395163952639536395463955639566395763958639596396063961639626396363964639656396663967639686396963970639716397263973639746397563976639776397863979639806398163982639836398463985639866398763988639896399063991639926399363994639956399663997639986399964000640016400264003640046400564006640076400864009640106401164012640136401464015640166401764018640196402064021640226402364024640256402664027640286402964030640316403264033640346403564036640376403864039640406404164042640436404464045640466404764048640496405064051640526405364054640556405664057640586405964060640616406264063640646406564066640676406864069640706407164072640736407464075640766407764078640796408064081640826408364084640856408664087640886408964090640916409264093640946409564096640976409864099641006410164102641036410464105641066410764108641096411064111641126411364114641156411664117641186411964120641216412264123641246412564126641276412864129641306413164132641336413464135641366413764138641396414064141641426414364144641456414664147641486414964150641516415264153641546415564156641576415864159641606416164162641636416464165641666416764168641696417064171641726417364174641756417664177641786417964180641816418264183641846418564186641876418864189641906419164192641936419464195641966419764198641996420064201642026420364204642056420664207642086420964210642116421264213642146421564216642176421864219642206422164222642236422464225642266422764228642296423064231642326423364234642356423664237642386423964240642416424264243642446424564246642476424864249642506425164252642536425464255642566425764258642596426064261642626426364264642656426664267642686426964270642716427264273642746427564276642776427864279642806428164282642836428464285642866428764288642896429064291642926429364294642956429664297642986429964300643016430264303643046430564306643076430864309643106431164312643136431464315643166431764318643196432064321643226432364324643256432664327643286432964330643316433264333643346433564336643376433864339643406434164342643436434464345643466434764348643496435064351643526435364354643556435664357643586435964360643616436264363643646436564366643676436864369643706437164372643736437464375643766437764378643796438064381643826438364384643856438664387643886438964390643916439264393643946439564396643976439864399644006440164402644036440464405644066440764408644096441064411644126441364414644156441664417644186441964420644216442264423644246442564426644276442864429644306443164432644336443464435644366443764438644396444064441644426444364444644456444664447644486444964450644516445264453644546445564456644576445864459644606446164462644636446464465644666446764468644696447064471644726447364474644756447664477644786447964480644816448264483644846448564486644876448864489644906449164492644936449464495644966449764498644996450064501645026450364504645056450664507645086450964510645116451264513645146451564516645176451864519645206452164522645236452464525645266452764528645296453064531645326453364534645356453664537645386453964540645416454264543645446454564546645476454864549645506455164552645536455464555645566455764558645596456064561645626456364564645656456664567645686456964570645716457264573645746457564576645776457864579645806458164582645836458464585645866458764588645896459064591645926459364594645956459664597645986459964600646016460264603646046460564606646076460864609646106461164612646136461464615646166461764618646196462064621646226462364624646256462664627646286462964630646316463264633646346463564636646376463864639646406464164642646436464464645646466464764648646496465064651646526465364654646556465664657646586465964660646616466264663646646466564666646676466864669646706467164672646736467464675646766467764678646796468064681646826468364684646856468664687646886468964690646916469264693646946469564696646976469864699647006470164702647036470464705647066470764708647096471064711647126471364714647156471664717647186471964720647216472264723647246472564726647276472864729647306473164732647336473464735647366473764738647396474064741647426474364744647456474664747647486474964750647516475264753647546475564756647576475864759647606476164762647636476464765647666476764768647696477064771647726477364774647756477664777647786477964780647816478264783647846478564786647876478864789647906479164792647936479464795647966479764798647996480064801648026480364804648056480664807648086480964810648116481264813648146481564816648176481864819648206482164822648236482464825648266482764828648296483064831648326483364834648356483664837648386483964840648416484264843648446484564846648476484864849648506485164852648536485464855648566485764858648596486064861648626486364864648656486664867648686486964870648716487264873648746487564876648776487864879648806488164882648836488464885648866488764888648896489064891648926489364894648956489664897648986489964900649016490264903649046490564906649076490864909649106491164912649136491464915649166491764918649196492064921649226492364924649256492664927649286492964930649316493264933649346493564936649376493864939649406494164942649436494464945649466494764948649496495064951649526495364954649556495664957649586495964960649616496264963649646496564966649676496864969649706497164972649736497464975649766497764978649796498064981649826498364984649856498664987649886498964990649916499264993649946499564996649976499864999650006500165002650036500465005650066500765008650096501065011650126501365014650156501665017650186501965020650216502265023650246502565026650276502865029650306503165032650336503465035650366503765038650396504065041650426504365044650456504665047650486504965050650516505265053650546505565056650576505865059650606506165062650636506465065650666506765068650696507065071650726507365074650756507665077650786507965080650816508265083650846508565086650876508865089650906509165092650936509465095650966509765098650996510065101651026510365104651056510665107651086510965110651116511265113651146511565116651176511865119651206512165122651236512465125651266512765128651296513065131651326513365134651356513665137651386513965140651416514265143651446514565146651476514865149651506515165152651536515465155651566515765158651596516065161651626516365164651656516665167651686516965170651716517265173651746517565176651776517865179651806518165182651836518465185651866518765188651896519065191651926519365194651956519665197651986519965200652016520265203652046520565206652076520865209652106521165212652136521465215652166521765218652196522065221652226522365224652256522665227652286522965230652316523265233652346523565236652376523865239652406524165242652436524465245652466524765248652496525065251652526525365254652556525665257652586525965260652616526265263652646526565266652676526865269652706527165272652736527465275652766527765278652796528065281652826528365284652856528665287652886528965290652916529265293652946529565296652976529865299653006530165302653036530465305653066530765308653096531065311653126531365314653156531665317653186531965320653216532265323653246532565326653276532865329653306533165332653336533465335653366533765338653396534065341653426534365344653456534665347653486534965350653516535265353653546535565356653576535865359653606536165362653636536465365653666536765368653696537065371653726537365374653756537665377653786537965380653816538265383653846538565386653876538865389653906539165392653936539465395653966539765398653996540065401654026540365404654056540665407654086540965410654116541265413654146541565416654176541865419654206542165422654236542465425654266542765428654296543065431654326543365434654356543665437654386543965440654416544265443654446544565446654476544865449654506545165452654536545465455654566545765458654596546065461654626546365464654656546665467654686546965470654716547265473654746547565476654776547865479654806548165482654836548465485654866548765488654896549065491654926549365494654956549665497654986549965500655016550265503655046550565506655076550865509655106551165512655136551465515655166551765518655196552065521655226552365524655256552665527655286552965530655316553265533655346553565536655376553865539655406554165542655436554465545655466554765548655496555065551655526555365554655556555665557655586555965560655616556265563655646556565566655676556865569655706557165572655736557465575655766557765578655796558065581655826558365584655856558665587655886558965590655916559265593655946559565596655976559865599656006560165602656036560465605656066560765608656096561065611656126561365614656156561665617656186561965620656216562265623656246562565626656276562865629656306563165632656336563465635656366563765638656396564065641656426564365644656456564665647656486564965650656516565265653656546565565656656576565865659656606566165662656636566465665656666566765668656696567065671656726567365674656756567665677656786567965680656816568265683656846568565686656876568865689656906569165692656936569465695656966569765698656996570065701657026570365704657056570665707657086570965710657116571265713657146571565716657176571865719657206572165722657236572465725657266572765728657296573065731657326573365734657356573665737657386573965740657416574265743657446574565746657476574865749657506575165752657536575465755657566575765758657596576065761657626576365764657656576665767657686576965770657716577265773657746577565776657776577865779657806578165782657836578465785657866578765788657896579065791657926579365794657956579665797657986579965800658016580265803658046580565806658076580865809658106581165812658136581465815658166581765818658196582065821658226582365824658256582665827658286582965830658316583265833658346583565836658376583865839658406584165842658436584465845658466584765848658496585065851658526585365854658556585665857658586585965860658616586265863658646586565866658676586865869658706587165872658736587465875658766587765878658796588065881658826588365884658856588665887658886588965890658916589265893658946589565896658976589865899659006590165902659036590465905659066590765908659096591065911659126591365914659156591665917659186591965920659216592265923659246592565926659276592865929659306593165932659336593465935659366593765938659396594065941659426594365944659456594665947659486594965950659516595265953659546595565956659576595865959659606596165962659636596465965659666596765968659696597065971659726597365974659756597665977659786597965980659816598265983659846598565986659876598865989659906599165992659936599465995659966599765998659996600066001660026600366004660056600666007660086600966010660116601266013660146601566016660176601866019660206602166022660236602466025660266602766028660296603066031660326603366034660356603666037660386603966040660416604266043660446604566046660476604866049660506605166052660536605466055660566605766058660596606066061660626606366064660656606666067660686606966070660716607266073660746607566076660776607866079660806608166082660836608466085660866608766088660896609066091660926609366094660956609666097660986609966100661016610266103661046610566106661076610866109661106611166112661136611466115661166611766118661196612066121661226612366124661256612666127661286612966130661316613266133661346613566136661376613866139661406614166142661436614466145661466614766148661496615066151661526615366154661556615666157661586615966160661616616266163661646616566166661676616866169661706617166172661736617466175661766617766178661796618066181661826618366184661856618666187661886618966190661916619266193661946619566196661976619866199662006620166202662036620466205662066620766208662096621066211662126621366214662156621666217662186621966220662216622266223662246622566226662276622866229662306623166232662336623466235662366623766238662396624066241662426624366244662456624666247662486624966250662516625266253662546625566256662576625866259662606626166262662636626466265662666626766268662696627066271662726627366274662756627666277662786627966280662816628266283662846628566286662876628866289662906629166292662936629466295662966629766298662996630066301663026630366304663056630666307663086630966310663116631266313663146631566316663176631866319663206632166322663236632466325663266632766328663296633066331663326633366334663356633666337663386633966340663416634266343663446634566346663476634866349663506635166352663536635466355663566635766358663596636066361663626636366364663656636666367663686636966370663716637266373663746637566376663776637866379663806638166382663836638466385663866638766388663896639066391663926639366394663956639666397663986639966400664016640266403664046640566406664076640866409664106641166412664136641466415664166641766418664196642066421664226642366424664256642666427664286642966430664316643266433664346643566436664376643866439664406644166442664436644466445664466644766448664496645066451664526645366454664556645666457664586645966460664616646266463664646646566466664676646866469664706647166472664736647466475664766647766478664796648066481664826648366484664856648666487664886648966490664916649266493664946649566496664976649866499665006650166502665036650466505665066650766508665096651066511665126651366514665156651666517665186651966520665216652266523665246652566526665276652866529665306653166532665336653466535665366653766538665396654066541665426654366544665456654666547665486654966550665516655266553665546655566556665576655866559665606656166562665636656466565665666656766568665696657066571665726657366574665756657666577665786657966580665816658266583665846658566586665876658866589665906659166592665936659466595665966659766598665996660066601666026660366604666056660666607666086660966610666116661266613666146661566616666176661866619666206662166622666236662466625666266662766628666296663066631666326663366634666356663666637666386663966640666416664266643666446664566646666476664866649666506665166652666536665466655666566665766658666596666066661666626666366664666656666666667666686666966670666716667266673666746667566676666776667866679666806668166682666836668466685666866668766688666896669066691666926669366694666956669666697666986669966700667016670266703667046670566706667076670866709667106671166712667136671466715667166671766718667196672066721667226672366724667256672666727667286672966730667316673266733667346673566736667376673866739667406674166742667436674466745667466674766748667496675066751667526675366754667556675666757667586675966760667616676266763667646676566766667676676866769667706677166772667736677466775667766677766778667796678066781667826678366784667856678666787667886678966790667916679266793667946679566796667976679866799668006680166802668036680466805668066680766808668096681066811668126681366814668156681666817668186681966820668216682266823668246682566826668276682866829668306683166832668336683466835668366683766838668396684066841668426684366844668456684666847668486684966850668516685266853668546685566856668576685866859668606686166862668636686466865668666686766868668696687066871668726687366874668756687666877668786687966880668816688266883668846688566886668876688866889668906689166892668936689466895668966689766898668996690066901669026690366904669056690666907669086690966910669116691266913669146691566916669176691866919669206692166922669236692466925669266692766928669296693066931669326693366934669356693666937669386693966940669416694266943669446694566946669476694866949669506695166952669536695466955669566695766958669596696066961669626696366964669656696666967669686696966970669716697266973669746697566976669776697866979669806698166982669836698466985669866698766988669896699066991669926699366994669956699666997669986699967000670016700267003670046700567006670076700867009670106701167012670136701467015670166701767018670196702067021670226702367024670256702667027670286702967030670316703267033670346703567036670376703867039670406704167042670436704467045670466704767048670496705067051670526705367054670556705667057670586705967060670616706267063670646706567066670676706867069670706707167072670736707467075670766707767078670796708067081670826708367084670856708667087670886708967090670916709267093670946709567096670976709867099671006710167102671036710467105671066710767108671096711067111671126711367114671156711667117671186711967120671216712267123671246712567126671276712867129671306713167132671336713467135671366713767138671396714067141671426714367144671456714667147671486714967150671516715267153671546715567156671576715867159671606716167162671636716467165671666716767168671696717067171671726717367174671756717667177671786717967180671816718267183671846718567186671876718867189671906719167192671936719467195671966719767198671996720067201672026720367204672056720667207672086720967210672116721267213672146721567216672176721867219672206722167222672236722467225672266722767228672296723067231672326723367234672356723667237672386723967240672416724267243672446724567246672476724867249672506725167252672536725467255672566725767258672596726067261672626726367264672656726667267672686726967270672716727267273672746727567276672776727867279672806728167282672836728467285672866728767288672896729067291672926729367294672956729667297672986729967300673016730267303673046730567306673076730867309673106731167312673136731467315673166731767318673196732067321673226732367324673256732667327673286732967330673316733267333673346733567336673376733867339673406734167342673436734467345673466734767348673496735067351673526735367354673556735667357673586735967360673616736267363673646736567366673676736867369673706737167372673736737467375673766737767378673796738067381673826738367384673856738667387673886738967390673916739267393673946739567396673976739867399674006740167402674036740467405674066740767408674096741067411674126741367414674156741667417674186741967420674216742267423674246742567426674276742867429674306743167432674336743467435674366743767438674396744067441674426744367444674456744667447674486744967450674516745267453674546745567456674576745867459674606746167462674636746467465674666746767468674696747067471674726747367474674756747667477674786747967480674816748267483674846748567486674876748867489674906749167492674936749467495674966749767498674996750067501675026750367504675056750667507675086750967510675116751267513675146751567516675176751867519675206752167522675236752467525675266752767528675296753067531675326753367534675356753667537675386753967540675416754267543675446754567546675476754867549675506755167552675536755467555675566755767558675596756067561675626756367564675656756667567675686756967570675716757267573675746757567576675776757867579675806758167582675836758467585675866758767588675896759067591675926759367594675956759667597675986759967600676016760267603676046760567606676076760867609676106761167612676136761467615676166761767618676196762067621676226762367624676256762667627676286762967630676316763267633676346763567636676376763867639676406764167642676436764467645676466764767648676496765067651676526765367654676556765667657676586765967660676616766267663676646766567666676676766867669676706767167672676736767467675676766767767678676796768067681676826768367684676856768667687676886768967690676916769267693676946769567696676976769867699677006770167702677036770467705677066770767708677096771067711677126771367714677156771667717677186771967720677216772267723677246772567726677276772867729677306773167732677336773467735677366773767738677396774067741677426774367744677456774667747677486774967750677516775267753677546775567756677576775867759677606776167762677636776467765677666776767768677696777067771677726777367774677756777667777677786777967780677816778267783677846778567786677876778867789677906779167792677936779467795677966779767798677996780067801678026780367804678056780667807678086780967810678116781267813678146781567816678176781867819678206782167822678236782467825678266782767828678296783067831678326783367834678356783667837678386783967840678416784267843678446784567846678476784867849678506785167852678536785467855678566785767858678596786067861678626786367864678656786667867678686786967870678716787267873678746787567876678776787867879678806788167882678836788467885678866788767888678896789067891678926789367894678956789667897678986789967900679016790267903679046790567906679076790867909679106791167912679136791467915679166791767918679196792067921679226792367924679256792667927679286792967930679316793267933679346793567936679376793867939679406794167942679436794467945679466794767948679496795067951679526795367954679556795667957679586795967960679616796267963679646796567966679676796867969679706797167972679736797467975679766797767978679796798067981679826798367984679856798667987679886798967990679916799267993679946799567996679976799867999680006800168002680036800468005680066800768008680096801068011680126801368014680156801668017680186801968020680216802268023680246802568026680276802868029680306803168032680336803468035680366803768038680396804068041680426804368044680456804668047680486804968050680516805268053680546805568056680576805868059680606806168062680636806468065680666806768068680696807068071680726807368074680756807668077680786807968080680816808268083680846808568086680876808868089680906809168092680936809468095680966809768098680996810068101681026810368104681056810668107681086810968110681116811268113681146811568116681176811868119681206812168122681236812468125681266812768128681296813068131681326813368134681356813668137681386813968140681416814268143681446814568146681476814868149681506815168152681536815468155681566815768158681596816068161681626816368164681656816668167681686816968170681716817268173681746817568176681776817868179681806818168182681836818468185681866818768188681896819068191681926819368194681956819668197681986819968200682016820268203682046820568206682076820868209682106821168212682136821468215682166821768218682196822068221682226822368224682256822668227682286822968230682316823268233682346823568236682376823868239682406824168242682436824468245682466824768248682496825068251682526825368254682556825668257682586825968260682616826268263682646826568266682676826868269682706827168272682736827468275682766827768278682796828068281682826828368284682856828668287682886828968290682916829268293682946829568296682976829868299683006830168302683036830468305683066830768308683096831068311683126831368314683156831668317683186831968320683216832268323683246832568326683276832868329683306833168332683336833468335683366833768338683396834068341683426834368344683456834668347683486834968350683516835268353683546835568356683576835868359683606836168362683636836468365683666836768368683696837068371683726837368374683756837668377683786837968380683816838268383683846838568386683876838868389683906839168392683936839468395683966839768398683996840068401684026840368404684056840668407684086840968410684116841268413684146841568416684176841868419684206842168422684236842468425684266842768428684296843068431684326843368434684356843668437684386843968440684416844268443684446844568446684476844868449684506845168452684536845468455684566845768458684596846068461684626846368464684656846668467684686846968470684716847268473684746847568476684776847868479684806848168482684836848468485684866848768488684896849068491684926849368494684956849668497684986849968500685016850268503685046850568506685076850868509685106851168512685136851468515685166851768518685196852068521685226852368524685256852668527685286852968530685316853268533685346853568536685376853868539685406854168542685436854468545685466854768548685496855068551685526855368554685556855668557685586855968560685616856268563685646856568566685676856868569685706857168572685736857468575685766857768578685796858068581685826858368584685856858668587685886858968590685916859268593685946859568596685976859868599686006860168602686036860468605686066860768608686096861068611686126861368614686156861668617686186861968620686216862268623686246862568626686276862868629686306863168632686336863468635686366863768638686396864068641686426864368644686456864668647686486864968650686516865268653686546865568656686576865868659686606866168662686636866468665686666866768668686696867068671686726867368674686756867668677686786867968680686816868268683686846868568686686876868868689686906869168692686936869468695686966869768698686996870068701687026870368704687056870668707687086870968710687116871268713687146871568716687176871868719687206872168722687236872468725687266872768728687296873068731687326873368734687356873668737687386873968740687416874268743687446874568746687476874868749687506875168752687536875468755687566875768758687596876068761687626876368764687656876668767687686876968770687716877268773687746877568776687776877868779687806878168782687836878468785687866878768788687896879068791687926879368794687956879668797687986879968800688016880268803688046880568806688076880868809688106881168812688136881468815688166881768818688196882068821688226882368824688256882668827688286882968830688316883268833688346883568836688376883868839688406884168842688436884468845688466884768848688496885068851688526885368854688556885668857688586885968860688616886268863688646886568866688676886868869688706887168872688736887468875688766887768878688796888068881688826888368884688856888668887688886888968890688916889268893688946889568896688976889868899689006890168902689036890468905689066890768908689096891068911689126891368914689156891668917689186891968920689216892268923689246892568926689276892868929689306893168932689336893468935689366893768938689396894068941689426894368944689456894668947689486894968950689516895268953689546895568956689576895868959689606896168962689636896468965689666896768968689696897068971689726897368974689756897668977689786897968980689816898268983689846898568986689876898868989689906899168992689936899468995689966899768998689996900069001690026900369004690056900669007690086900969010690116901269013690146901569016690176901869019690206902169022690236902469025690266902769028690296903069031690326903369034690356903669037690386903969040690416904269043690446904569046690476904869049690506905169052690536905469055690566905769058690596906069061690626906369064690656906669067690686906969070690716907269073690746907569076690776907869079690806908169082690836908469085690866908769088690896909069091690926909369094690956909669097690986909969100691016910269103691046910569106691076910869109691106911169112691136911469115691166911769118691196912069121691226912369124691256912669127691286912969130691316913269133691346913569136691376913869139691406914169142691436914469145691466914769148691496915069151691526915369154691556915669157691586915969160691616916269163691646916569166691676916869169691706917169172691736917469175691766917769178691796918069181691826918369184691856918669187691886918969190691916919269193691946919569196691976919869199692006920169202692036920469205692066920769208692096921069211692126921369214692156921669217692186921969220692216922269223692246922569226692276922869229692306923169232692336923469235692366923769238692396924069241692426924369244692456924669247692486924969250692516925269253692546925569256692576925869259692606926169262692636926469265692666926769268692696927069271692726927369274692756927669277692786927969280692816928269283692846928569286692876928869289692906929169292692936929469295692966929769298692996930069301693026930369304693056930669307693086930969310693116931269313693146931569316693176931869319693206932169322693236932469325693266932769328693296933069331693326933369334693356933669337693386933969340693416934269343693446934569346693476934869349693506935169352693536935469355693566935769358693596936069361693626936369364693656936669367693686936969370693716937269373693746937569376693776937869379693806938169382693836938469385693866938769388693896939069391693926939369394693956939669397693986939969400694016940269403694046940569406694076940869409694106941169412694136941469415694166941769418694196942069421694226942369424694256942669427694286942969430694316943269433694346943569436694376943869439694406944169442694436944469445694466944769448694496945069451694526945369454694556945669457694586945969460694616946269463694646946569466694676946869469694706947169472694736947469475694766947769478694796948069481694826948369484694856948669487694886948969490694916949269493694946949569496694976949869499695006950169502695036950469505695066950769508695096951069511695126951369514695156951669517695186951969520695216952269523695246952569526695276952869529695306953169532695336953469535695366953769538695396954069541695426954369544695456954669547695486954969550695516955269553695546955569556695576955869559695606956169562695636956469565695666956769568695696957069571695726957369574695756957669577695786957969580695816958269583695846958569586695876958869589695906959169592695936959469595695966959769598695996960069601696026960369604696056960669607696086960969610696116961269613696146961569616696176961869619696206962169622696236962469625696266962769628696296963069631696326963369634696356963669637696386963969640696416964269643696446964569646696476964869649696506965169652696536965469655696566965769658696596966069661696626966369664696656966669667696686966969670696716967269673696746967569676696776967869679696806968169682696836968469685696866968769688696896969069691696926969369694696956969669697696986969969700697016970269703697046970569706697076970869709697106971169712697136971469715697166971769718697196972069721697226972369724697256972669727697286972969730697316973269733697346973569736697376973869739697406974169742697436974469745697466974769748697496975069751697526975369754697556975669757697586975969760697616976269763697646976569766697676976869769697706977169772697736977469775697766977769778697796978069781697826978369784697856978669787697886978969790697916979269793697946979569796697976979869799698006980169802698036980469805698066980769808698096981069811698126981369814698156981669817698186981969820698216982269823698246982569826698276982869829698306983169832698336983469835698366983769838698396984069841698426984369844698456984669847698486984969850698516985269853698546985569856698576985869859698606986169862698636986469865698666986769868698696987069871698726987369874698756987669877698786987969880698816988269883698846988569886698876988869889698906989169892698936989469895698966989769898698996990069901699026990369904699056990669907699086990969910699116991269913699146991569916699176991869919699206992169922699236992469925699266992769928699296993069931699326993369934699356993669937699386993969940699416994269943699446994569946699476994869949699506995169952699536995469955699566995769958699596996069961699626996369964699656996669967699686996969970699716997269973699746997569976699776997869979699806998169982699836998469985699866998769988699896999069991699926999369994699956999669997699986999970000700017000270003700047000570006700077000870009700107001170012700137001470015700167001770018700197002070021700227002370024700257002670027700287002970030700317003270033700347003570036700377003870039700407004170042700437004470045700467004770048700497005070051700527005370054700557005670057700587005970060700617006270063700647006570066700677006870069700707007170072700737007470075700767007770078700797008070081700827008370084700857008670087700887008970090700917009270093700947009570096700977009870099701007010170102701037010470105701067010770108701097011070111701127011370114701157011670117701187011970120701217012270123701247012570126701277012870129701307013170132701337013470135701367013770138701397014070141701427014370144701457014670147701487014970150701517015270153701547015570156701577015870159701607016170162701637016470165701667016770168701697017070171701727017370174701757017670177701787017970180701817018270183701847018570186701877018870189701907019170192701937019470195701967019770198701997020070201702027020370204702057020670207702087020970210702117021270213702147021570216702177021870219702207022170222702237022470225702267022770228702297023070231702327023370234702357023670237702387023970240702417024270243702447024570246702477024870249702507025170252702537025470255702567025770258702597026070261702627026370264702657026670267702687026970270702717027270273702747027570276702777027870279702807028170282702837028470285702867028770288702897029070291702927029370294702957029670297702987029970300703017030270303703047030570306703077030870309703107031170312703137031470315703167031770318703197032070321703227032370324703257032670327703287032970330703317033270333703347033570336703377033870339703407034170342703437034470345703467034770348703497035070351703527035370354703557035670357703587035970360703617036270363703647036570366703677036870369703707037170372703737037470375703767037770378703797038070381703827038370384703857038670387703887038970390703917039270393703947039570396703977039870399704007040170402704037040470405704067040770408704097041070411704127041370414704157041670417704187041970420704217042270423704247042570426704277042870429704307043170432704337043470435704367043770438704397044070441704427044370444704457044670447704487044970450704517045270453704547045570456704577045870459704607046170462704637046470465704667046770468704697047070471704727047370474704757047670477704787047970480704817048270483704847048570486704877048870489704907049170492704937049470495704967049770498704997050070501705027050370504705057050670507705087050970510705117051270513705147051570516705177051870519705207052170522705237052470525705267052770528705297053070531705327053370534705357053670537705387053970540705417054270543705447054570546705477054870549705507055170552705537055470555705567055770558705597056070561705627056370564705657056670567705687056970570705717057270573705747057570576705777057870579705807058170582705837058470585705867058770588705897059070591705927059370594705957059670597705987059970600706017060270603706047060570606706077060870609706107061170612706137061470615706167061770618706197062070621706227062370624706257062670627706287062970630706317063270633706347063570636706377063870639706407064170642706437064470645706467064770648706497065070651706527065370654706557065670657706587065970660706617066270663706647066570666706677066870669706707067170672706737067470675706767067770678706797068070681706827068370684706857068670687706887068970690706917069270693706947069570696706977069870699707007070170702707037070470705707067070770708707097071070711707127071370714707157071670717707187071970720707217072270723707247072570726707277072870729707307073170732707337073470735707367073770738707397074070741707427074370744707457074670747707487074970750707517075270753707547075570756707577075870759707607076170762707637076470765707667076770768707697077070771707727077370774707757077670777707787077970780707817078270783707847078570786707877078870789707907079170792707937079470795707967079770798707997080070801708027080370804708057080670807708087080970810708117081270813708147081570816708177081870819708207082170822708237082470825708267082770828708297083070831708327083370834708357083670837708387083970840708417084270843708447084570846708477084870849708507085170852708537085470855708567085770858708597086070861708627086370864708657086670867708687086970870708717087270873708747087570876708777087870879708807088170882708837088470885708867088770888708897089070891708927089370894708957089670897708987089970900709017090270903709047090570906709077090870909709107091170912709137091470915709167091770918709197092070921709227092370924709257092670927709287092970930709317093270933709347093570936709377093870939709407094170942709437094470945709467094770948709497095070951709527095370954709557095670957709587095970960709617096270963709647096570966709677096870969709707097170972709737097470975709767097770978709797098070981709827098370984709857098670987709887098970990709917099270993709947099570996709977099870999710007100171002710037100471005710067100771008710097101071011710127101371014710157101671017710187101971020710217102271023710247102571026710277102871029710307103171032710337103471035710367103771038710397104071041710427104371044710457104671047710487104971050710517105271053710547105571056710577105871059710607106171062710637106471065710667106771068710697107071071710727107371074710757107671077710787107971080710817108271083710847108571086710877108871089710907109171092710937109471095710967109771098710997110071101711027110371104711057110671107711087110971110711117111271113711147111571116711177111871119711207112171122711237112471125711267112771128711297113071131711327113371134711357113671137711387113971140711417114271143711447114571146711477114871149711507115171152711537115471155711567115771158711597116071161711627116371164711657116671167711687116971170711717117271173711747117571176711777117871179711807118171182711837118471185711867118771188711897119071191711927119371194711957119671197711987119971200712017120271203712047120571206712077120871209712107121171212712137121471215712167121771218712197122071221712227122371224712257122671227712287122971230712317123271233712347123571236712377123871239712407124171242712437124471245712467124771248712497125071251712527125371254712557125671257712587125971260712617126271263712647126571266712677126871269712707127171272712737127471275712767127771278712797128071281712827128371284712857128671287712887128971290712917129271293712947129571296712977129871299713007130171302713037130471305713067130771308713097131071311713127131371314713157131671317713187131971320713217132271323713247132571326713277132871329713307133171332713337133471335713367133771338713397134071341713427134371344713457134671347713487134971350713517135271353713547135571356713577135871359713607136171362713637136471365713667136771368713697137071371713727137371374713757137671377713787137971380713817138271383713847138571386713877138871389713907139171392713937139471395713967139771398713997140071401714027140371404714057140671407714087140971410714117141271413714147141571416714177141871419714207142171422714237142471425714267142771428714297143071431714327143371434714357143671437714387143971440714417144271443714447144571446714477144871449714507145171452714537145471455714567145771458714597146071461714627146371464714657146671467714687146971470714717147271473714747147571476714777147871479714807148171482714837148471485714867148771488714897149071491714927149371494714957149671497714987149971500715017150271503715047150571506715077150871509715107151171512715137151471515715167151771518715197152071521715227152371524715257152671527715287152971530715317153271533715347153571536715377153871539715407154171542715437154471545715467154771548715497155071551715527155371554715557155671557715587155971560715617156271563715647156571566715677156871569715707157171572715737157471575715767157771578715797158071581715827158371584715857158671587715887158971590715917159271593715947159571596715977159871599716007160171602716037160471605716067160771608716097161071611716127161371614716157161671617716187161971620716217162271623716247162571626716277162871629716307163171632716337163471635716367163771638716397164071641716427164371644716457164671647716487164971650716517165271653716547165571656716577165871659716607166171662716637166471665716667166771668716697167071671716727167371674716757167671677716787167971680716817168271683716847168571686716877168871689716907169171692716937169471695716967169771698716997170071701717027170371704717057170671707717087170971710717117171271713717147171571716717177171871719717207172171722717237172471725717267172771728717297173071731717327173371734717357173671737717387173971740717417174271743717447174571746717477174871749717507175171752717537175471755717567175771758717597176071761717627176371764717657176671767717687176971770717717177271773717747177571776717777177871779717807178171782717837178471785717867178771788717897179071791717927179371794717957179671797717987179971800718017180271803718047180571806718077180871809718107181171812718137181471815718167181771818718197182071821718227182371824718257182671827718287182971830718317183271833718347183571836718377183871839718407184171842718437184471845718467184771848718497185071851718527185371854718557185671857718587185971860718617186271863718647186571866718677186871869718707187171872718737187471875718767187771878718797188071881718827188371884718857188671887718887188971890718917189271893718947189571896718977189871899719007190171902719037190471905719067190771908719097191071911719127191371914719157191671917719187191971920719217192271923719247192571926719277192871929719307193171932719337193471935719367193771938719397194071941719427194371944719457194671947719487194971950719517195271953719547195571956719577195871959719607196171962719637196471965719667196771968719697197071971719727197371974719757197671977719787197971980719817198271983719847198571986719877198871989719907199171992719937199471995719967199771998719997200072001720027200372004720057200672007720087200972010720117201272013720147201572016720177201872019720207202172022720237202472025720267202772028720297203072031720327203372034720357203672037720387203972040720417204272043720447204572046720477204872049720507205172052720537205472055720567205772058720597206072061720627206372064720657206672067720687206972070720717207272073720747207572076720777207872079720807208172082720837208472085720867208772088720897209072091720927209372094720957209672097720987209972100721017210272103721047210572106721077210872109721107211172112721137211472115721167211772118721197212072121721227212372124721257212672127721287212972130721317213272133721347213572136721377213872139721407214172142721437214472145721467214772148721497215072151721527215372154721557215672157721587215972160721617216272163721647216572166721677216872169721707217172172721737217472175
  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 0001b5b8 08020188 08020188 00008188 2**3
  7. CONTENTS, ALLOC, LOAD, READONLY, CODE
  8. 2 .ARM 00000008 0803b740 0803b740 00023740 2**2
  9. CONTENTS, ALLOC, LOAD, READONLY, DATA
  10. 3 .init_array 00000004 0803b748 0803b748 00023748 2**2
  11. CONTENTS, ALLOC, LOAD, DATA
  12. 4 .fini_array 00000004 0803b74c 0803b74c 0002374c 2**2
  13. CONTENTS, ALLOC, LOAD, DATA
  14. 5 .data 000018f8 20000000 0803b750 00028000 2**2
  15. CONTENTS, ALLOC, LOAD, DATA
  16. 6 .fill 00082fb4 0803d048 0803d048 0002d048 2**0
  17. CONTENTS, ALLOC, LOAD, DATA
  18. 7 .crc 00000004 080bfffc 080bfffc 000afffc 2**2
  19. CONTENTS, ALLOC, LOAD, DATA
  20. 8 .bss 000136e0 200018f8 0803d048 000b18f8 2**2
  21. ALLOC
  22. 9 ._user_heap_stack 00000200 20014fd8 08050728 000b18f8 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 0004086b 00000000 00000000 000b002f 2**0
  29. CONTENTS, READONLY, DEBUGGING
  30. 13 .debug_abbrev 0000af9c 00000000 00000000 000f089a 2**0
  31. CONTENTS, READONLY, DEBUGGING
  32. 14 .debug_loc 00020d82 00000000 00000000 000fb836 2**0
  33. CONTENTS, READONLY, DEBUGGING
  34. 15 .debug_aranges 00002ac0 00000000 00000000 0011c5b8 2**3
  35. CONTENTS, READONLY, DEBUGGING
  36. 16 .debug_ranges 00003358 00000000 00000000 0011f078 2**3
  37. CONTENTS, READONLY, DEBUGGING
  38. 17 .debug_macro 0001e180 00000000 00000000 001223d0 2**0
  39. CONTENTS, READONLY, DEBUGGING
  40. 18 .debug_line 0001fcd9 00000000 00000000 00140550 2**0
  41. CONTENTS, READONLY, DEBUGGING
  42. 19 .debug_str 0007f237 00000000 00000000 00160229 2**0
  43. CONTENTS, READONLY, DEBUGGING
  44. 20 .comment 00000030 00000000 00000000 001df460 2**0
  45. CONTENTS, READONLY
  46. 21 .debug_frame 00007230 00000000 00000000 001df490 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 00f8 movw r0, #6392 ; 0x18f8
  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: 200018fb .word 0x200018fb
  65. 080201b0 <register_tm_clones>:
  66. 80201b0: b508 push {r3, lr}
  67. 80201b2: f641 00f8 movw r0, #6392 ; 0x18f8
  68. 80201b6: f641 03f8 movw r3, #6392 ; 0x18f8
  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 04f8 movw r4, #6392 ; 0x18f8
  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: f24b 7028 movw r0, #46888 ; 0xb728
  94. 8020200: f6c0 0003 movt r0, #2051 ; 0x803
  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: f24b 7028 movw r0, #46888 ; 0xb728
  106. 8020220: f641 01fc movw r1, #6396 ; 0x18fc
  107. 8020224: f6c0 0003 movt r0, #2051 ; 0x803
  108. 8020228: f2c2 0100 movt r1, #8192 ; 0x2000
  109. 802022c: f3af 8000 nop.w
  110. 8020230: f641 00f8 movw r0, #6392 ; 0x18f8
  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_uldivmod>:
  915. 8020be4: b94b cbnz r3, 8020bfa <__aeabi_uldivmod+0x16>
  916. 8020be6: b942 cbnz r2, 8020bfa <__aeabi_uldivmod+0x16>
  917. 8020be8: 2900 cmp r1, #0
  918. 8020bea: bf08 it eq
  919. 8020bec: 2800 cmpeq r0, #0
  920. 8020bee: d002 beq.n 8020bf6 <__aeabi_uldivmod+0x12>
  921. 8020bf0: f04f 31ff mov.w r1, #4294967295
  922. 8020bf4: 4608 mov r0, r1
  923. 8020bf6: f000 b83b b.w 8020c70 <__aeabi_idiv0>
  924. 8020bfa: b082 sub sp, #8
  925. 8020bfc: 46ec mov ip, sp
  926. 8020bfe: e92d 5000 stmdb sp!, {ip, lr}
  927. 8020c02: f000 f81d bl 8020c40 <__gnu_uldivmod_helper>
  928. 8020c06: f8dd e004 ldr.w lr, [sp, #4]
  929. 8020c0a: b002 add sp, #8
  930. 8020c0c: bc0c pop {r2, r3}
  931. 8020c0e: 4770 bx lr
  932. 08020c10 <__gnu_ldivmod_helper>:
  933. 8020c10: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  934. 8020c14: 4690 mov r8, r2
  935. 8020c16: 4699 mov r9, r3
  936. 8020c18: 4606 mov r6, r0
  937. 8020c1a: 460f mov r7, r1
  938. 8020c1c: f000 f82a bl 8020c74 <__divdi3>
  939. 8020c20: 9b08 ldr r3, [sp, #32]
  940. 8020c22: fba8 4500 umull r4, r5, r8, r0
  941. 8020c26: fb08 f801 mul.w r8, r8, r1
  942. 8020c2a: fb00 8209 mla r2, r0, r9, r8
  943. 8020c2e: 1955 adds r5, r2, r5
  944. 8020c30: 1b34 subs r4, r6, r4
  945. 8020c32: eb67 0505 sbc.w r5, r7, r5
  946. 8020c36: e9c3 4500 strd r4, r5, [r3]
  947. 8020c3a: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  948. 8020c3e: bf00 nop
  949. 08020c40 <__gnu_uldivmod_helper>:
  950. 8020c40: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  951. 8020c44: 4690 mov r8, r2
  952. 8020c46: 4606 mov r6, r0
  953. 8020c48: 460f mov r7, r1
  954. 8020c4a: 461d mov r5, r3
  955. 8020c4c: f000 f9c8 bl 8020fe0 <__udivdi3>
  956. 8020c50: fb00 f305 mul.w r3, r0, r5
  957. 8020c54: fba0 4508 umull r4, r5, r0, r8
  958. 8020c58: fb08 3801 mla r8, r8, r1, r3
  959. 8020c5c: 9b06 ldr r3, [sp, #24]
  960. 8020c5e: 4445 add r5, r8
  961. 8020c60: 1b34 subs r4, r6, r4
  962. 8020c62: eb67 0505 sbc.w r5, r7, r5
  963. 8020c66: e9c3 4500 strd r4, r5, [r3]
  964. 8020c6a: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  965. 8020c6e: bf00 nop
  966. 08020c70 <__aeabi_idiv0>:
  967. 8020c70: 4770 bx lr
  968. 8020c72: bf00 nop
  969. 08020c74 <__divdi3>:
  970. 8020c74: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  971. 8020c78: 2500 movs r5, #0
  972. 8020c7a: 2900 cmp r1, #0
  973. 8020c7c: b085 sub sp, #20
  974. 8020c7e: 461c mov r4, r3
  975. 8020c80: f2c0 8149 blt.w 8020f16 <__divdi3+0x2a2>
  976. 8020c84: 2c00 cmp r4, #0
  977. 8020c86: f2c0 8141 blt.w 8020f0c <__divdi3+0x298>
  978. 8020c8a: 468c mov ip, r1
  979. 8020c8c: 460f mov r7, r1
  980. 8020c8e: 4682 mov sl, r0
  981. 8020c90: 4691 mov r9, r2
  982. 8020c92: 4614 mov r4, r2
  983. 8020c94: 4606 mov r6, r0
  984. 8020c96: 4619 mov r1, r3
  985. 8020c98: 2b00 cmp r3, #0
  986. 8020c9a: d14b bne.n 8020d34 <__divdi3+0xc0>
  987. 8020c9c: 4562 cmp r2, ip
  988. 8020c9e: d959 bls.n 8020d54 <__divdi3+0xe0>
  989. 8020ca0: fab2 f382 clz r3, r2
  990. 8020ca4: b143 cbz r3, 8020cb8 <__divdi3+0x44>
  991. 8020ca6: f1c3 0220 rsb r2, r3, #32
  992. 8020caa: fa0c f703 lsl.w r7, ip, r3
  993. 8020cae: fa20 f202 lsr.w r2, r0, r2
  994. 8020cb2: 409c lsls r4, r3
  995. 8020cb4: 4317 orrs r7, r2
  996. 8020cb6: 409e lsls r6, r3
  997. 8020cb8: ea4f 4814 mov.w r8, r4, lsr #16
  998. 8020cbc: 4638 mov r0, r7
  999. 8020cbe: 4641 mov r1, r8
  1000. 8020cc0: fa1f f984 uxth.w r9, r4
  1001. 8020cc4: f000 fb18 bl 80212f8 <__aeabi_uidiv>
  1002. 8020cc8: 4641 mov r1, r8
  1003. 8020cca: 4682 mov sl, r0
  1004. 8020ccc: 4638 mov r0, r7
  1005. 8020cce: f000 fc41 bl 8021554 <__aeabi_uidivmod>
  1006. 8020cd2: 0c33 lsrs r3, r6, #16
  1007. 8020cd4: fb09 f00a mul.w r0, r9, sl
  1008. 8020cd8: ea43 4101 orr.w r1, r3, r1, lsl #16
  1009. 8020cdc: 4288 cmp r0, r1
  1010. 8020cde: d90a bls.n 8020cf6 <__divdi3+0x82>
  1011. 8020ce0: 1909 adds r1, r1, r4
  1012. 8020ce2: f10a 32ff add.w r2, sl, #4294967295
  1013. 8020ce6: d205 bcs.n 8020cf4 <__divdi3+0x80>
  1014. 8020ce8: 4288 cmp r0, r1
  1015. 8020cea: bf84 itt hi
  1016. 8020cec: f1aa 0a02 subhi.w sl, sl, #2
  1017. 8020cf0: 1909 addhi r1, r1, r4
  1018. 8020cf2: d800 bhi.n 8020cf6 <__divdi3+0x82>
  1019. 8020cf4: 4692 mov sl, r2
  1020. 8020cf6: ebc0 0b01 rsb fp, r0, r1
  1021. 8020cfa: 4641 mov r1, r8
  1022. 8020cfc: 4658 mov r0, fp
  1023. 8020cfe: b2b6 uxth r6, r6
  1024. 8020d00: f000 fafa bl 80212f8 <__aeabi_uidiv>
  1025. 8020d04: 4641 mov r1, r8
  1026. 8020d06: 4607 mov r7, r0
  1027. 8020d08: 4658 mov r0, fp
  1028. 8020d0a: f000 fc23 bl 8021554 <__aeabi_uidivmod>
  1029. 8020d0e: fb09 f907 mul.w r9, r9, r7
  1030. 8020d12: ea46 4101 orr.w r1, r6, r1, lsl #16
  1031. 8020d16: 4589 cmp r9, r1
  1032. 8020d18: d907 bls.n 8020d2a <__divdi3+0xb6>
  1033. 8020d1a: 1e7b subs r3, r7, #1
  1034. 8020d1c: 190c adds r4, r1, r4
  1035. 8020d1e: f080 8157 bcs.w 8020fd0 <__divdi3+0x35c>
  1036. 8020d22: 3f02 subs r7, #2
  1037. 8020d24: 45a1 cmp r9, r4
  1038. 8020d26: f240 8153 bls.w 8020fd0 <__divdi3+0x35c>
  1039. 8020d2a: ea47 400a orr.w r0, r7, sl, lsl #16
  1040. 8020d2e: f04f 0800 mov.w r8, #0
  1041. 8020d32: e004 b.n 8020d3e <__divdi3+0xca>
  1042. 8020d34: 4563 cmp r3, ip
  1043. 8020d36: d958 bls.n 8020dea <__divdi3+0x176>
  1044. 8020d38: f04f 0800 mov.w r8, #0
  1045. 8020d3c: 4640 mov r0, r8
  1046. 8020d3e: 4602 mov r2, r0
  1047. 8020d40: 4643 mov r3, r8
  1048. 8020d42: b115 cbz r5, 8020d4a <__divdi3+0xd6>
  1049. 8020d44: 4252 negs r2, r2
  1050. 8020d46: eb63 0343 sbc.w r3, r3, r3, lsl #1
  1051. 8020d4a: 4610 mov r0, r2
  1052. 8020d4c: 4619 mov r1, r3
  1053. 8020d4e: b005 add sp, #20
  1054. 8020d50: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  1055. 8020d54: b922 cbnz r2, 8020d60 <__divdi3+0xec>
  1056. 8020d56: 2001 movs r0, #1
  1057. 8020d58: 4611 mov r1, r2
  1058. 8020d5a: f000 facd bl 80212f8 <__aeabi_uidiv>
  1059. 8020d5e: 4604 mov r4, r0
  1060. 8020d60: fab4 f384 clz r3, r4
  1061. 8020d64: 2b00 cmp r3, #0
  1062. 8020d66: f040 80dc bne.w 8020f22 <__divdi3+0x2ae>
  1063. 8020d6a: 1b3f subs r7, r7, r4
  1064. 8020d6c: ea4f 4914 mov.w r9, r4, lsr #16
  1065. 8020d70: fa1f fa84 uxth.w sl, r4
  1066. 8020d74: f04f 0801 mov.w r8, #1
  1067. 8020d78: 4649 mov r1, r9
  1068. 8020d7a: 4638 mov r0, r7
  1069. 8020d7c: f000 fabc bl 80212f8 <__aeabi_uidiv>
  1070. 8020d80: 4649 mov r1, r9
  1071. 8020d82: 4683 mov fp, r0
  1072. 8020d84: 4638 mov r0, r7
  1073. 8020d86: f000 fbe5 bl 8021554 <__aeabi_uidivmod>
  1074. 8020d8a: 0c33 lsrs r3, r6, #16
  1075. 8020d8c: fb0a f00b mul.w r0, sl, fp
  1076. 8020d90: ea43 4101 orr.w r1, r3, r1, lsl #16
  1077. 8020d94: 4288 cmp r0, r1
  1078. 8020d96: d90b bls.n 8020db0 <__divdi3+0x13c>
  1079. 8020d98: 1909 adds r1, r1, r4
  1080. 8020d9a: f10b 33ff add.w r3, fp, #4294967295
  1081. 8020d9e: f080 8115 bcs.w 8020fcc <__divdi3+0x358>
  1082. 8020da2: 4288 cmp r0, r1
  1083. 8020da4: bf84 itt hi
  1084. 8020da6: f1ab 0b02 subhi.w fp, fp, #2
  1085. 8020daa: 1909 addhi r1, r1, r4
  1086. 8020dac: f240 810e bls.w 8020fcc <__divdi3+0x358>
  1087. 8020db0: 1a0b subs r3, r1, r0
  1088. 8020db2: 4649 mov r1, r9
  1089. 8020db4: 4618 mov r0, r3
  1090. 8020db6: 9301 str r3, [sp, #4]
  1091. 8020db8: f000 fa9e bl 80212f8 <__aeabi_uidiv>
  1092. 8020dbc: 9b01 ldr r3, [sp, #4]
  1093. 8020dbe: 4649 mov r1, r9
  1094. 8020dc0: b2b6 uxth r6, r6
  1095. 8020dc2: 4607 mov r7, r0
  1096. 8020dc4: 4618 mov r0, r3
  1097. 8020dc6: f000 fbc5 bl 8021554 <__aeabi_uidivmod>
  1098. 8020dca: fb0a fa07 mul.w sl, sl, r7
  1099. 8020dce: ea46 4101 orr.w r1, r6, r1, lsl #16
  1100. 8020dd2: 458a cmp sl, r1
  1101. 8020dd4: d906 bls.n 8020de4 <__divdi3+0x170>
  1102. 8020dd6: 1e7b subs r3, r7, #1
  1103. 8020dd8: 190c adds r4, r1, r4
  1104. 8020dda: d202 bcs.n 8020de2 <__divdi3+0x16e>
  1105. 8020ddc: 3f02 subs r7, #2
  1106. 8020dde: 45a2 cmp sl, r4
  1107. 8020de0: d800 bhi.n 8020de4 <__divdi3+0x170>
  1108. 8020de2: 461f mov r7, r3
  1109. 8020de4: ea47 400b orr.w r0, r7, fp, lsl #16
  1110. 8020de8: e7a9 b.n 8020d3e <__divdi3+0xca>
  1111. 8020dea: fab3 f483 clz r4, r3
  1112. 8020dee: 2c00 cmp r4, #0
  1113. 8020df0: f000 80e4 beq.w 8020fbc <__divdi3+0x348>
  1114. 8020df4: f1c4 0320 rsb r3, r4, #32
  1115. 8020df8: fa01 f104 lsl.w r1, r1, r4
  1116. 8020dfc: fa22 fa03 lsr.w sl, r2, r3
  1117. 8020e00: fa2c fb03 lsr.w fp, ip, r3
  1118. 8020e04: ea4a 0a01 orr.w sl, sl, r1
  1119. 8020e08: fa20 f803 lsr.w r8, r0, r3
  1120. 8020e0c: fa0c fc04 lsl.w ip, ip, r4
  1121. 8020e10: 4658 mov r0, fp
  1122. 8020e12: ea4f 471a mov.w r7, sl, lsr #16
  1123. 8020e16: ea48 080c orr.w r8, r8, ip
  1124. 8020e1a: 4639 mov r1, r7
  1125. 8020e1c: fa02 f904 lsl.w r9, r2, r4
  1126. 8020e20: f8cd 900c str.w r9, [sp, #12]
  1127. 8020e24: f000 fa68 bl 80212f8 <__aeabi_uidiv>
  1128. 8020e28: 4639 mov r1, r7
  1129. 8020e2a: 4681 mov r9, r0
  1130. 8020e2c: 4658 mov r0, fp
  1131. 8020e2e: f000 fb91 bl 8021554 <__aeabi_uidivmod>
  1132. 8020e32: fa1f fc8a uxth.w ip, sl
  1133. 8020e36: ea4f 4318 mov.w r3, r8, lsr #16
  1134. 8020e3a: fb0c f009 mul.w r0, ip, r9
  1135. 8020e3e: ea43 4301 orr.w r3, r3, r1, lsl #16
  1136. 8020e42: 4298 cmp r0, r3
  1137. 8020e44: d90c bls.n 8020e60 <__divdi3+0x1ec>
  1138. 8020e46: eb13 030a adds.w r3, r3, sl
  1139. 8020e4a: f109 31ff add.w r1, r9, #4294967295
  1140. 8020e4e: f080 80c3 bcs.w 8020fd8 <__divdi3+0x364>
  1141. 8020e52: 4298 cmp r0, r3
  1142. 8020e54: bf84 itt hi
  1143. 8020e56: f1a9 0902 subhi.w r9, r9, #2
  1144. 8020e5a: 4453 addhi r3, sl
  1145. 8020e5c: f240 80bc bls.w 8020fd8 <__divdi3+0x364>
  1146. 8020e60: 1a1b subs r3, r3, r0
  1147. 8020e62: 4639 mov r1, r7
  1148. 8020e64: 4618 mov r0, r3
  1149. 8020e66: f8cd c008 str.w ip, [sp, #8]
  1150. 8020e6a: 9301 str r3, [sp, #4]
  1151. 8020e6c: f000 fa44 bl 80212f8 <__aeabi_uidiv>
  1152. 8020e70: 9b01 ldr r3, [sp, #4]
  1153. 8020e72: 4639 mov r1, r7
  1154. 8020e74: fa1f f888 uxth.w r8, r8
  1155. 8020e78: 4683 mov fp, r0
  1156. 8020e7a: 4618 mov r0, r3
  1157. 8020e7c: f000 fb6a bl 8021554 <__aeabi_uidivmod>
  1158. 8020e80: f8dd c008 ldr.w ip, [sp, #8]
  1159. 8020e84: fb0c f30b mul.w r3, ip, fp
  1160. 8020e88: ea48 4101 orr.w r1, r8, r1, lsl #16
  1161. 8020e8c: 428b cmp r3, r1
  1162. 8020e8e: d90c bls.n 8020eaa <__divdi3+0x236>
  1163. 8020e90: eb11 010a adds.w r1, r1, sl
  1164. 8020e94: f10b 30ff add.w r0, fp, #4294967295
  1165. 8020e98: f080 809c bcs.w 8020fd4 <__divdi3+0x360>
  1166. 8020e9c: 428b cmp r3, r1
  1167. 8020e9e: bf84 itt hi
  1168. 8020ea0: f1ab 0b02 subhi.w fp, fp, #2
  1169. 8020ea4: 4451 addhi r1, sl
  1170. 8020ea6: f240 8095 bls.w 8020fd4 <__divdi3+0x360>
  1171. 8020eaa: 9f03 ldr r7, [sp, #12]
  1172. 8020eac: ea4b 4009 orr.w r0, fp, r9, lsl #16
  1173. 8020eb0: 1ac9 subs r1, r1, r3
  1174. 8020eb2: fa1f fc80 uxth.w ip, r0
  1175. 8020eb6: b2ba uxth r2, r7
  1176. 8020eb8: ea4f 4917 mov.w r9, r7, lsr #16
  1177. 8020ebc: 0c07 lsrs r7, r0, #16
  1178. 8020ebe: fb02 f80c mul.w r8, r2, ip
  1179. 8020ec2: fb02 f207 mul.w r2, r2, r7
  1180. 8020ec6: fb09 230c mla r3, r9, ip, r2
  1181. 8020eca: fb09 f907 mul.w r9, r9, r7
  1182. 8020ece: eb03 4318 add.w r3, r3, r8, lsr #16
  1183. 8020ed2: 429a cmp r2, r3
  1184. 8020ed4: bf88 it hi
  1185. 8020ed6: f509 3980 addhi.w r9, r9, #65536 ; 0x10000
  1186. 8020eda: eb09 4913 add.w r9, r9, r3, lsr #16
  1187. 8020ede: 4549 cmp r1, r9
  1188. 8020ee0: d310 bcc.n 8020f04 <__divdi3+0x290>
  1189. 8020ee2: fa1f f888 uxth.w r8, r8
  1190. 8020ee6: bf14 ite ne
  1191. 8020ee8: 2200 movne r2, #0
  1192. 8020eea: 2201 moveq r2, #1
  1193. 8020eec: fa06 f404 lsl.w r4, r6, r4
  1194. 8020ef0: eb08 4303 add.w r3, r8, r3, lsl #16
  1195. 8020ef4: 429c cmp r4, r3
  1196. 8020ef6: bf2c ite cs
  1197. 8020ef8: 2300 movcs r3, #0
  1198. 8020efa: f002 0301 andcc.w r3, r2, #1
  1199. 8020efe: 2b00 cmp r3, #0
  1200. 8020f00: f43f af15 beq.w 8020d2e <__divdi3+0xba>
  1201. 8020f04: 3801 subs r0, #1
  1202. 8020f06: f04f 0800 mov.w r8, #0
  1203. 8020f0a: e718 b.n 8020d3e <__divdi3+0xca>
  1204. 8020f0c: 4252 negs r2, r2
  1205. 8020f0e: eb63 0343 sbc.w r3, r3, r3, lsl #1
  1206. 8020f12: 43ed mvns r5, r5
  1207. 8020f14: e6b9 b.n 8020c8a <__divdi3+0x16>
  1208. 8020f16: 4240 negs r0, r0
  1209. 8020f18: eb61 0141 sbc.w r1, r1, r1, lsl #1
  1210. 8020f1c: f04f 35ff mov.w r5, #4294967295
  1211. 8020f20: e6b0 b.n 8020c84 <__divdi3+0x10>
  1212. 8020f22: 409c lsls r4, r3
  1213. 8020f24: f1c3 0b20 rsb fp, r3, #32
  1214. 8020f28: fa27 f80b lsr.w r8, r7, fp
  1215. 8020f2c: fa07 f703 lsl.w r7, r7, r3
  1216. 8020f30: ea4f 4914 mov.w r9, r4, lsr #16
  1217. 8020f34: 4640 mov r0, r8
  1218. 8020f36: 4649 mov r1, r9
  1219. 8020f38: fa26 fb0b lsr.w fp, r6, fp
  1220. 8020f3c: 409e lsls r6, r3
  1221. 8020f3e: f000 f9db bl 80212f8 <__aeabi_uidiv>
  1222. 8020f42: 4649 mov r1, r9
  1223. 8020f44: fa1f fa84 uxth.w sl, r4
  1224. 8020f48: ea4b 0b07 orr.w fp, fp, r7
  1225. 8020f4c: 4603 mov r3, r0
  1226. 8020f4e: 4640 mov r0, r8
  1227. 8020f50: 9301 str r3, [sp, #4]
  1228. 8020f52: f000 faff bl 8021554 <__aeabi_uidivmod>
  1229. 8020f56: 9b01 ldr r3, [sp, #4]
  1230. 8020f58: ea4f 421b mov.w r2, fp, lsr #16
  1231. 8020f5c: fb0a f003 mul.w r0, sl, r3
  1232. 8020f60: ea42 4101 orr.w r1, r2, r1, lsl #16
  1233. 8020f64: 4288 cmp r0, r1
  1234. 8020f66: d906 bls.n 8020f76 <__divdi3+0x302>
  1235. 8020f68: 1e5a subs r2, r3, #1
  1236. 8020f6a: 1909 adds r1, r1, r4
  1237. 8020f6c: d236 bcs.n 8020fdc <__divdi3+0x368>
  1238. 8020f6e: 4288 cmp r0, r1
  1239. 8020f70: d934 bls.n 8020fdc <__divdi3+0x368>
  1240. 8020f72: 3b02 subs r3, #2
  1241. 8020f74: 1909 adds r1, r1, r4
  1242. 8020f76: 1a0f subs r7, r1, r0
  1243. 8020f78: 4649 mov r1, r9
  1244. 8020f7a: 4638 mov r0, r7
  1245. 8020f7c: 9301 str r3, [sp, #4]
  1246. 8020f7e: f000 f9bb bl 80212f8 <__aeabi_uidiv>
  1247. 8020f82: 4649 mov r1, r9
  1248. 8020f84: fa1f fb8b uxth.w fp, fp
  1249. 8020f88: 4680 mov r8, r0
  1250. 8020f8a: 4638 mov r0, r7
  1251. 8020f8c: f000 fae2 bl 8021554 <__aeabi_uidivmod>
  1252. 8020f90: 9b01 ldr r3, [sp, #4]
  1253. 8020f92: fb0a f708 mul.w r7, sl, r8
  1254. 8020f96: ea4b 4101 orr.w r1, fp, r1, lsl #16
  1255. 8020f9a: 428f cmp r7, r1
  1256. 8020f9c: d90a bls.n 8020fb4 <__divdi3+0x340>
  1257. 8020f9e: 1909 adds r1, r1, r4
  1258. 8020fa0: f108 32ff add.w r2, r8, #4294967295
  1259. 8020fa4: d205 bcs.n 8020fb2 <__divdi3+0x33e>
  1260. 8020fa6: 428f cmp r7, r1
  1261. 8020fa8: bf84 itt hi
  1262. 8020faa: f1a8 0802 subhi.w r8, r8, #2
  1263. 8020fae: 1909 addhi r1, r1, r4
  1264. 8020fb0: d800 bhi.n 8020fb4 <__divdi3+0x340>
  1265. 8020fb2: 4690 mov r8, r2
  1266. 8020fb4: 1bcf subs r7, r1, r7
  1267. 8020fb6: ea48 4803 orr.w r8, r8, r3, lsl #16
  1268. 8020fba: e6dd b.n 8020d78 <__divdi3+0x104>
  1269. 8020fbc: 2001 movs r0, #1
  1270. 8020fbe: 4563 cmp r3, ip
  1271. 8020fc0: bf28 it cs
  1272. 8020fc2: 4552 cmpcs r2, sl
  1273. 8020fc4: 46a0 mov r8, r4
  1274. 8020fc6: f67f aeba bls.w 8020d3e <__divdi3+0xca>
  1275. 8020fca: e6b5 b.n 8020d38 <__divdi3+0xc4>
  1276. 8020fcc: 469b mov fp, r3
  1277. 8020fce: e6ef b.n 8020db0 <__divdi3+0x13c>
  1278. 8020fd0: 461f mov r7, r3
  1279. 8020fd2: e6aa b.n 8020d2a <__divdi3+0xb6>
  1280. 8020fd4: 4683 mov fp, r0
  1281. 8020fd6: e768 b.n 8020eaa <__divdi3+0x236>
  1282. 8020fd8: 4689 mov r9, r1
  1283. 8020fda: e741 b.n 8020e60 <__divdi3+0x1ec>
  1284. 8020fdc: 4613 mov r3, r2
  1285. 8020fde: e7ca b.n 8020f76 <__divdi3+0x302>
  1286. 08020fe0 <__udivdi3>:
  1287. 8020fe0: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  1288. 8020fe4: 4606 mov r6, r0
  1289. 8020fe6: b083 sub sp, #12
  1290. 8020fe8: 460d mov r5, r1
  1291. 8020fea: 4614 mov r4, r2
  1292. 8020fec: 4607 mov r7, r0
  1293. 8020fee: 4688 mov r8, r1
  1294. 8020ff0: 2b00 cmp r3, #0
  1295. 8020ff2: d14a bne.n 802108a <__udivdi3+0xaa>
  1296. 8020ff4: 428a cmp r2, r1
  1297. 8020ff6: d955 bls.n 80210a4 <__udivdi3+0xc4>
  1298. 8020ff8: fab2 f382 clz r3, r2
  1299. 8020ffc: b14b cbz r3, 8021012 <__udivdi3+0x32>
  1300. 8020ffe: f1c3 0220 rsb r2, r3, #32
  1301. 8021002: fa01 f803 lsl.w r8, r1, r3
  1302. 8021006: fa20 f202 lsr.w r2, r0, r2
  1303. 802100a: 409c lsls r4, r3
  1304. 802100c: ea42 0808 orr.w r8, r2, r8
  1305. 8021010: 409f lsls r7, r3
  1306. 8021012: 0c25 lsrs r5, r4, #16
  1307. 8021014: 4640 mov r0, r8
  1308. 8021016: 4629 mov r1, r5
  1309. 8021018: fa1f fa84 uxth.w sl, r4
  1310. 802101c: f000 f96c bl 80212f8 <__aeabi_uidiv>
  1311. 8021020: 4629 mov r1, r5
  1312. 8021022: 4681 mov r9, r0
  1313. 8021024: 4640 mov r0, r8
  1314. 8021026: f000 fa95 bl 8021554 <__aeabi_uidivmod>
  1315. 802102a: 0c3b lsrs r3, r7, #16
  1316. 802102c: fb0a f009 mul.w r0, sl, r9
  1317. 8021030: ea43 4101 orr.w r1, r3, r1, lsl #16
  1318. 8021034: 4288 cmp r0, r1
  1319. 8021036: d90a bls.n 802104e <__udivdi3+0x6e>
  1320. 8021038: 1909 adds r1, r1, r4
  1321. 802103a: f109 32ff add.w r2, r9, #4294967295
  1322. 802103e: d205 bcs.n 802104c <__udivdi3+0x6c>
  1323. 8021040: 4288 cmp r0, r1
  1324. 8021042: bf84 itt hi
  1325. 8021044: f1a9 0902 subhi.w r9, r9, #2
  1326. 8021048: 1909 addhi r1, r1, r4
  1327. 802104a: d800 bhi.n 802104e <__udivdi3+0x6e>
  1328. 802104c: 4691 mov r9, r2
  1329. 802104e: ebc0 0801 rsb r8, r0, r1
  1330. 8021052: 4629 mov r1, r5
  1331. 8021054: 4640 mov r0, r8
  1332. 8021056: b2bf uxth r7, r7
  1333. 8021058: f000 f94e bl 80212f8 <__aeabi_uidiv>
  1334. 802105c: 4629 mov r1, r5
  1335. 802105e: 4606 mov r6, r0
  1336. 8021060: 4640 mov r0, r8
  1337. 8021062: f000 fa77 bl 8021554 <__aeabi_uidivmod>
  1338. 8021066: fb0a fa06 mul.w sl, sl, r6
  1339. 802106a: ea47 4101 orr.w r1, r7, r1, lsl #16
  1340. 802106e: 458a cmp sl, r1
  1341. 8021070: d907 bls.n 8021082 <__udivdi3+0xa2>
  1342. 8021072: 1e73 subs r3, r6, #1
  1343. 8021074: 190c adds r4, r1, r4
  1344. 8021076: f080 8122 bcs.w 80212be <__udivdi3+0x2de>
  1345. 802107a: 3e02 subs r6, #2
  1346. 802107c: 45a2 cmp sl, r4
  1347. 802107e: f240 811e bls.w 80212be <__udivdi3+0x2de>
  1348. 8021082: ea46 4009 orr.w r0, r6, r9, lsl #16
  1349. 8021086: 2600 movs r6, #0
  1350. 8021088: e058 b.n 802113c <__udivdi3+0x15c>
  1351. 802108a: 428b cmp r3, r1
  1352. 802108c: d854 bhi.n 8021138 <__udivdi3+0x158>
  1353. 802108e: fab3 f483 clz r4, r3
  1354. 8021092: 2c00 cmp r4, #0
  1355. 8021094: d156 bne.n 8021144 <__udivdi3+0x164>
  1356. 8021096: 428b cmp r3, r1
  1357. 8021098: bf28 it cs
  1358. 802109a: 4282 cmpcs r2, r0
  1359. 802109c: d84c bhi.n 8021138 <__udivdi3+0x158>
  1360. 802109e: 4626 mov r6, r4
  1361. 80210a0: 2001 movs r0, #1
  1362. 80210a2: e04b b.n 802113c <__udivdi3+0x15c>
  1363. 80210a4: b922 cbnz r2, 80210b0 <__udivdi3+0xd0>
  1364. 80210a6: 2001 movs r0, #1
  1365. 80210a8: 4611 mov r1, r2
  1366. 80210aa: f000 f925 bl 80212f8 <__aeabi_uidiv>
  1367. 80210ae: 4604 mov r4, r0
  1368. 80210b0: fab4 f384 clz r3, r4
  1369. 80210b4: 2b00 cmp r3, #0
  1370. 80210b6: f040 80b9 bne.w 802122c <__udivdi3+0x24c>
  1371. 80210ba: 1b2d subs r5, r5, r4
  1372. 80210bc: ea4f 4814 mov.w r8, r4, lsr #16
  1373. 80210c0: fa1f fa84 uxth.w sl, r4
  1374. 80210c4: 2601 movs r6, #1
  1375. 80210c6: 4641 mov r1, r8
  1376. 80210c8: 4628 mov r0, r5
  1377. 80210ca: f000 f915 bl 80212f8 <__aeabi_uidiv>
  1378. 80210ce: 4641 mov r1, r8
  1379. 80210d0: 4681 mov r9, r0
  1380. 80210d2: 4628 mov r0, r5
  1381. 80210d4: f000 fa3e bl 8021554 <__aeabi_uidivmod>
  1382. 80210d8: 0c3b lsrs r3, r7, #16
  1383. 80210da: fb0a f009 mul.w r0, sl, r9
  1384. 80210de: ea43 4101 orr.w r1, r3, r1, lsl #16
  1385. 80210e2: 4288 cmp r0, r1
  1386. 80210e4: d90b bls.n 80210fe <__udivdi3+0x11e>
  1387. 80210e6: 1909 adds r1, r1, r4
  1388. 80210e8: f109 33ff add.w r3, r9, #4294967295
  1389. 80210ec: f080 80e9 bcs.w 80212c2 <__udivdi3+0x2e2>
  1390. 80210f0: 4288 cmp r0, r1
  1391. 80210f2: bf84 itt hi
  1392. 80210f4: f1a9 0902 subhi.w r9, r9, #2
  1393. 80210f8: 1909 addhi r1, r1, r4
  1394. 80210fa: f240 80e2 bls.w 80212c2 <__udivdi3+0x2e2>
  1395. 80210fe: ebc0 0b01 rsb fp, r0, r1
  1396. 8021102: 4641 mov r1, r8
  1397. 8021104: 4658 mov r0, fp
  1398. 8021106: b2bf uxth r7, r7
  1399. 8021108: f000 f8f6 bl 80212f8 <__aeabi_uidiv>
  1400. 802110c: 4641 mov r1, r8
  1401. 802110e: 4605 mov r5, r0
  1402. 8021110: 4658 mov r0, fp
  1403. 8021112: f000 fa1f bl 8021554 <__aeabi_uidivmod>
  1404. 8021116: fb0a fa05 mul.w sl, sl, r5
  1405. 802111a: ea47 4101 orr.w r1, r7, r1, lsl #16
  1406. 802111e: 458a cmp sl, r1
  1407. 8021120: d907 bls.n 8021132 <__udivdi3+0x152>
  1408. 8021122: 1e6b subs r3, r5, #1
  1409. 8021124: 190c adds r4, r1, r4
  1410. 8021126: f080 80ce bcs.w 80212c6 <__udivdi3+0x2e6>
  1411. 802112a: 3d02 subs r5, #2
  1412. 802112c: 45a2 cmp sl, r4
  1413. 802112e: f240 80ca bls.w 80212c6 <__udivdi3+0x2e6>
  1414. 8021132: ea45 4009 orr.w r0, r5, r9, lsl #16
  1415. 8021136: e001 b.n 802113c <__udivdi3+0x15c>
  1416. 8021138: 2600 movs r6, #0
  1417. 802113a: 4630 mov r0, r6
  1418. 802113c: 4631 mov r1, r6
  1419. 802113e: b003 add sp, #12
  1420. 8021140: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  1421. 8021144: f1c4 0120 rsb r1, r4, #32
  1422. 8021148: fa03 f304 lsl.w r3, r3, r4
  1423. 802114c: fa22 f801 lsr.w r8, r2, r1
  1424. 8021150: fa25 f701 lsr.w r7, r5, r1
  1425. 8021154: ea48 0803 orr.w r8, r8, r3
  1426. 8021158: fa20 f101 lsr.w r1, r0, r1
  1427. 802115c: fa05 f504 lsl.w r5, r5, r4
  1428. 8021160: 4638 mov r0, r7
  1429. 8021162: ea4f 4918 mov.w r9, r8, lsr #16
  1430. 8021166: 430d orrs r5, r1
  1431. 8021168: 4649 mov r1, r9
  1432. 802116a: fa02 f204 lsl.w r2, r2, r4
  1433. 802116e: 9201 str r2, [sp, #4]
  1434. 8021170: f000 f8c2 bl 80212f8 <__aeabi_uidiv>
  1435. 8021174: 4649 mov r1, r9
  1436. 8021176: 4682 mov sl, r0
  1437. 8021178: 4638 mov r0, r7
  1438. 802117a: f000 f9eb bl 8021554 <__aeabi_uidivmod>
  1439. 802117e: fa1f f288 uxth.w r2, r8
  1440. 8021182: 0c2f lsrs r7, r5, #16
  1441. 8021184: fb02 f00a mul.w r0, r2, sl
  1442. 8021188: ea47 4701 orr.w r7, r7, r1, lsl #16
  1443. 802118c: 42b8 cmp r0, r7
  1444. 802118e: d906 bls.n 802119e <__udivdi3+0x1be>
  1445. 8021190: eb17 0708 adds.w r7, r7, r8
  1446. 8021194: f10a 31ff add.w r1, sl, #4294967295
  1447. 8021198: f0c0 809f bcc.w 80212da <__udivdi3+0x2fa>
  1448. 802119c: 468a mov sl, r1
  1449. 802119e: 1a3f subs r7, r7, r0
  1450. 80211a0: 4649 mov r1, r9
  1451. 80211a2: 4638 mov r0, r7
  1452. 80211a4: 9200 str r2, [sp, #0]
  1453. 80211a6: f000 f8a7 bl 80212f8 <__aeabi_uidiv>
  1454. 80211aa: 4649 mov r1, r9
  1455. 80211ac: b2ad uxth r5, r5
  1456. 80211ae: 4683 mov fp, r0
  1457. 80211b0: 4638 mov r0, r7
  1458. 80211b2: f000 f9cf bl 8021554 <__aeabi_uidivmod>
  1459. 80211b6: 9a00 ldr r2, [sp, #0]
  1460. 80211b8: fb02 f70b mul.w r7, r2, fp
  1461. 80211bc: ea45 4101 orr.w r1, r5, r1, lsl #16
  1462. 80211c0: 428f cmp r7, r1
  1463. 80211c2: d905 bls.n 80211d0 <__udivdi3+0x1f0>
  1464. 80211c4: eb11 0108 adds.w r1, r1, r8
  1465. 80211c8: f10b 32ff add.w r2, fp, #4294967295
  1466. 80211cc: d37d bcc.n 80212ca <__udivdi3+0x2ea>
  1467. 80211ce: 4693 mov fp, r2
  1468. 80211d0: 9b01 ldr r3, [sp, #4]
  1469. 80211d2: ea4b 400a orr.w r0, fp, sl, lsl #16
  1470. 80211d6: 1bc9 subs r1, r1, r7
  1471. 80211d8: ea4f 4c10 mov.w ip, r0, lsr #16
  1472. 80211dc: b29d uxth r5, r3
  1473. 80211de: ea4f 4a13 mov.w sl, r3, lsr #16
  1474. 80211e2: b283 uxth r3, r0
  1475. 80211e4: fb05 f203 mul.w r2, r5, r3
  1476. 80211e8: fb05 f50c mul.w r5, r5, ip
  1477. 80211ec: fb0a 5303 mla r3, sl, r3, r5
  1478. 80211f0: fb0a fa0c mul.w sl, sl, ip
  1479. 80211f4: eb03 4312 add.w r3, r3, r2, lsr #16
  1480. 80211f8: 429d cmp r5, r3
  1481. 80211fa: bf88 it hi
  1482. 80211fc: f50a 3a80 addhi.w sl, sl, #65536 ; 0x10000
  1483. 8021200: eb0a 4a13 add.w sl, sl, r3, lsr #16
  1484. 8021204: 4551 cmp r1, sl
  1485. 8021206: d30e bcc.n 8021226 <__udivdi3+0x246>
  1486. 8021208: b292 uxth r2, r2
  1487. 802120a: bf14 ite ne
  1488. 802120c: 2100 movne r1, #0
  1489. 802120e: 2101 moveq r1, #1
  1490. 8021210: fa06 f604 lsl.w r6, r6, r4
  1491. 8021214: eb02 4303 add.w r3, r2, r3, lsl #16
  1492. 8021218: 429e cmp r6, r3
  1493. 802121a: bf2c ite cs
  1494. 802121c: 2600 movcs r6, #0
  1495. 802121e: f001 0601 andcc.w r6, r1, #1
  1496. 8021222: 2e00 cmp r6, #0
  1497. 8021224: d08a beq.n 802113c <__udivdi3+0x15c>
  1498. 8021226: 3801 subs r0, #1
  1499. 8021228: 2600 movs r6, #0
  1500. 802122a: e787 b.n 802113c <__udivdi3+0x15c>
  1501. 802122c: 409c lsls r4, r3
  1502. 802122e: f1c3 0220 rsb r2, r3, #32
  1503. 8021232: fa25 fa02 lsr.w sl, r5, r2
  1504. 8021236: fa26 f902 lsr.w r9, r6, r2
  1505. 802123a: ea4f 4814 mov.w r8, r4, lsr #16
  1506. 802123e: 4650 mov r0, sl
  1507. 8021240: 4641 mov r1, r8
  1508. 8021242: fa05 f503 lsl.w r5, r5, r3
  1509. 8021246: fa06 f703 lsl.w r7, r6, r3
  1510. 802124a: f000 f855 bl 80212f8 <__aeabi_uidiv>
  1511. 802124e: 4641 mov r1, r8
  1512. 8021250: ea49 0905 orr.w r9, r9, r5
  1513. 8021254: 4683 mov fp, r0
  1514. 8021256: 4650 mov r0, sl
  1515. 8021258: f000 f97c bl 8021554 <__aeabi_uidivmod>
  1516. 802125c: fa1f fa84 uxth.w sl, r4
  1517. 8021260: ea4f 4319 mov.w r3, r9, lsr #16
  1518. 8021264: fb0a f00b mul.w r0, sl, fp
  1519. 8021268: ea43 4101 orr.w r1, r3, r1, lsl #16
  1520. 802126c: 4288 cmp r0, r1
  1521. 802126e: d909 bls.n 8021284 <__udivdi3+0x2a4>
  1522. 8021270: 1909 adds r1, r1, r4
  1523. 8021272: f10b 33ff add.w r3, fp, #4294967295
  1524. 8021276: d238 bcs.n 80212ea <__udivdi3+0x30a>
  1525. 8021278: 4288 cmp r0, r1
  1526. 802127a: bf84 itt hi
  1527. 802127c: f1ab 0b02 subhi.w fp, fp, #2
  1528. 8021280: 1909 addhi r1, r1, r4
  1529. 8021282: d932 bls.n 80212ea <__udivdi3+0x30a>
  1530. 8021284: 1a0d subs r5, r1, r0
  1531. 8021286: 4641 mov r1, r8
  1532. 8021288: 4628 mov r0, r5
  1533. 802128a: fa1f f989 uxth.w r9, r9
  1534. 802128e: f000 f833 bl 80212f8 <__aeabi_uidiv>
  1535. 8021292: 4641 mov r1, r8
  1536. 8021294: 4606 mov r6, r0
  1537. 8021296: 4628 mov r0, r5
  1538. 8021298: f000 f95c bl 8021554 <__aeabi_uidivmod>
  1539. 802129c: fb0a f506 mul.w r5, sl, r6
  1540. 80212a0: ea49 4101 orr.w r1, r9, r1, lsl #16
  1541. 80212a4: 428d cmp r5, r1
  1542. 80212a6: d906 bls.n 80212b6 <__udivdi3+0x2d6>
  1543. 80212a8: 1e73 subs r3, r6, #1
  1544. 80212aa: 1909 adds r1, r1, r4
  1545. 80212ac: d21f bcs.n 80212ee <__udivdi3+0x30e>
  1546. 80212ae: 428d cmp r5, r1
  1547. 80212b0: d91d bls.n 80212ee <__udivdi3+0x30e>
  1548. 80212b2: 3e02 subs r6, #2
  1549. 80212b4: 1909 adds r1, r1, r4
  1550. 80212b6: 1b4d subs r5, r1, r5
  1551. 80212b8: ea46 460b orr.w r6, r6, fp, lsl #16
  1552. 80212bc: e703 b.n 80210c6 <__udivdi3+0xe6>
  1553. 80212be: 461e mov r6, r3
  1554. 80212c0: e6df b.n 8021082 <__udivdi3+0xa2>
  1555. 80212c2: 4699 mov r9, r3
  1556. 80212c4: e71b b.n 80210fe <__udivdi3+0x11e>
  1557. 80212c6: 461d mov r5, r3
  1558. 80212c8: e733 b.n 8021132 <__udivdi3+0x152>
  1559. 80212ca: 428f cmp r7, r1
  1560. 80212cc: bf84 itt hi
  1561. 80212ce: f1ab 0b02 subhi.w fp, fp, #2
  1562. 80212d2: 4441 addhi r1, r8
  1563. 80212d4: f63f af7c bhi.w 80211d0 <__udivdi3+0x1f0>
  1564. 80212d8: e779 b.n 80211ce <__udivdi3+0x1ee>
  1565. 80212da: 42b8 cmp r0, r7
  1566. 80212dc: bf84 itt hi
  1567. 80212de: f1aa 0a02 subhi.w sl, sl, #2
  1568. 80212e2: 4447 addhi r7, r8
  1569. 80212e4: f63f af5b bhi.w 802119e <__udivdi3+0x1be>
  1570. 80212e8: e758 b.n 802119c <__udivdi3+0x1bc>
  1571. 80212ea: 469b mov fp, r3
  1572. 80212ec: e7ca b.n 8021284 <__udivdi3+0x2a4>
  1573. 80212ee: 461e mov r6, r3
  1574. 80212f0: e7e1 b.n 80212b6 <__udivdi3+0x2d6>
  1575. 80212f2: bf00 nop
  1576. 80212f4: 0000 movs r0, r0
  1577. 80212f6: 0000 movs r0, r0
  1578. 080212f8 <__aeabi_uidiv>:
  1579. 80212f8: 1e4a subs r2, r1, #1
  1580. 80212fa: bf08 it eq
  1581. 80212fc: 4770 bxeq lr
  1582. 80212fe: f0c0 8124 bcc.w 802154a <__aeabi_uidiv+0x252>
  1583. 8021302: 4288 cmp r0, r1
  1584. 8021304: f240 8116 bls.w 8021534 <__aeabi_uidiv+0x23c>
  1585. 8021308: 4211 tst r1, r2
  1586. 802130a: f000 8117 beq.w 802153c <__aeabi_uidiv+0x244>
  1587. 802130e: fab0 f380 clz r3, r0
  1588. 8021312: fab1 f281 clz r2, r1
  1589. 8021316: eba2 0303 sub.w r3, r2, r3
  1590. 802131a: f1c3 031f rsb r3, r3, #31
  1591. 802131e: a204 add r2, pc, #16 ; (adr r2, 8021330 <__aeabi_uidiv+0x38>)
  1592. 8021320: eb02 1303 add.w r3, r2, r3, lsl #4
  1593. 8021324: f04f 0200 mov.w r2, #0
  1594. 8021328: 469f mov pc, r3
  1595. 802132a: bf00 nop
  1596. 802132c: f3af 8000 nop.w
  1597. 8021330: ebb0 7fc1 cmp.w r0, r1, lsl #31
  1598. 8021334: bf00 nop
  1599. 8021336: eb42 0202 adc.w r2, r2, r2
  1600. 802133a: bf28 it cs
  1601. 802133c: eba0 70c1 subcs.w r0, r0, r1, lsl #31
  1602. 8021340: ebb0 7f81 cmp.w r0, r1, lsl #30
  1603. 8021344: bf00 nop
  1604. 8021346: eb42 0202 adc.w r2, r2, r2
  1605. 802134a: bf28 it cs
  1606. 802134c: eba0 7081 subcs.w r0, r0, r1, lsl #30
  1607. 8021350: ebb0 7f41 cmp.w r0, r1, lsl #29
  1608. 8021354: bf00 nop
  1609. 8021356: eb42 0202 adc.w r2, r2, r2
  1610. 802135a: bf28 it cs
  1611. 802135c: eba0 7041 subcs.w r0, r0, r1, lsl #29
  1612. 8021360: ebb0 7f01 cmp.w r0, r1, lsl #28
  1613. 8021364: bf00 nop
  1614. 8021366: eb42 0202 adc.w r2, r2, r2
  1615. 802136a: bf28 it cs
  1616. 802136c: eba0 7001 subcs.w r0, r0, r1, lsl #28
  1617. 8021370: ebb0 6fc1 cmp.w r0, r1, lsl #27
  1618. 8021374: bf00 nop
  1619. 8021376: eb42 0202 adc.w r2, r2, r2
  1620. 802137a: bf28 it cs
  1621. 802137c: eba0 60c1 subcs.w r0, r0, r1, lsl #27
  1622. 8021380: ebb0 6f81 cmp.w r0, r1, lsl #26
  1623. 8021384: bf00 nop
  1624. 8021386: eb42 0202 adc.w r2, r2, r2
  1625. 802138a: bf28 it cs
  1626. 802138c: eba0 6081 subcs.w r0, r0, r1, lsl #26
  1627. 8021390: ebb0 6f41 cmp.w r0, r1, lsl #25
  1628. 8021394: bf00 nop
  1629. 8021396: eb42 0202 adc.w r2, r2, r2
  1630. 802139a: bf28 it cs
  1631. 802139c: eba0 6041 subcs.w r0, r0, r1, lsl #25
  1632. 80213a0: ebb0 6f01 cmp.w r0, r1, lsl #24
  1633. 80213a4: bf00 nop
  1634. 80213a6: eb42 0202 adc.w r2, r2, r2
  1635. 80213aa: bf28 it cs
  1636. 80213ac: eba0 6001 subcs.w r0, r0, r1, lsl #24
  1637. 80213b0: ebb0 5fc1 cmp.w r0, r1, lsl #23
  1638. 80213b4: bf00 nop
  1639. 80213b6: eb42 0202 adc.w r2, r2, r2
  1640. 80213ba: bf28 it cs
  1641. 80213bc: eba0 50c1 subcs.w r0, r0, r1, lsl #23
  1642. 80213c0: ebb0 5f81 cmp.w r0, r1, lsl #22
  1643. 80213c4: bf00 nop
  1644. 80213c6: eb42 0202 adc.w r2, r2, r2
  1645. 80213ca: bf28 it cs
  1646. 80213cc: eba0 5081 subcs.w r0, r0, r1, lsl #22
  1647. 80213d0: ebb0 5f41 cmp.w r0, r1, lsl #21
  1648. 80213d4: bf00 nop
  1649. 80213d6: eb42 0202 adc.w r2, r2, r2
  1650. 80213da: bf28 it cs
  1651. 80213dc: eba0 5041 subcs.w r0, r0, r1, lsl #21
  1652. 80213e0: ebb0 5f01 cmp.w r0, r1, lsl #20
  1653. 80213e4: bf00 nop
  1654. 80213e6: eb42 0202 adc.w r2, r2, r2
  1655. 80213ea: bf28 it cs
  1656. 80213ec: eba0 5001 subcs.w r0, r0, r1, lsl #20
  1657. 80213f0: ebb0 4fc1 cmp.w r0, r1, lsl #19
  1658. 80213f4: bf00 nop
  1659. 80213f6: eb42 0202 adc.w r2, r2, r2
  1660. 80213fa: bf28 it cs
  1661. 80213fc: eba0 40c1 subcs.w r0, r0, r1, lsl #19
  1662. 8021400: ebb0 4f81 cmp.w r0, r1, lsl #18
  1663. 8021404: bf00 nop
  1664. 8021406: eb42 0202 adc.w r2, r2, r2
  1665. 802140a: bf28 it cs
  1666. 802140c: eba0 4081 subcs.w r0, r0, r1, lsl #18
  1667. 8021410: ebb0 4f41 cmp.w r0, r1, lsl #17
  1668. 8021414: bf00 nop
  1669. 8021416: eb42 0202 adc.w r2, r2, r2
  1670. 802141a: bf28 it cs
  1671. 802141c: eba0 4041 subcs.w r0, r0, r1, lsl #17
  1672. 8021420: ebb0 4f01 cmp.w r0, r1, lsl #16
  1673. 8021424: bf00 nop
  1674. 8021426: eb42 0202 adc.w r2, r2, r2
  1675. 802142a: bf28 it cs
  1676. 802142c: eba0 4001 subcs.w r0, r0, r1, lsl #16
  1677. 8021430: ebb0 3fc1 cmp.w r0, r1, lsl #15
  1678. 8021434: bf00 nop
  1679. 8021436: eb42 0202 adc.w r2, r2, r2
  1680. 802143a: bf28 it cs
  1681. 802143c: eba0 30c1 subcs.w r0, r0, r1, lsl #15
  1682. 8021440: ebb0 3f81 cmp.w r0, r1, lsl #14
  1683. 8021444: bf00 nop
  1684. 8021446: eb42 0202 adc.w r2, r2, r2
  1685. 802144a: bf28 it cs
  1686. 802144c: eba0 3081 subcs.w r0, r0, r1, lsl #14
  1687. 8021450: ebb0 3f41 cmp.w r0, r1, lsl #13
  1688. 8021454: bf00 nop
  1689. 8021456: eb42 0202 adc.w r2, r2, r2
  1690. 802145a: bf28 it cs
  1691. 802145c: eba0 3041 subcs.w r0, r0, r1, lsl #13
  1692. 8021460: ebb0 3f01 cmp.w r0, r1, lsl #12
  1693. 8021464: bf00 nop
  1694. 8021466: eb42 0202 adc.w r2, r2, r2
  1695. 802146a: bf28 it cs
  1696. 802146c: eba0 3001 subcs.w r0, r0, r1, lsl #12
  1697. 8021470: ebb0 2fc1 cmp.w r0, r1, lsl #11
  1698. 8021474: bf00 nop
  1699. 8021476: eb42 0202 adc.w r2, r2, r2
  1700. 802147a: bf28 it cs
  1701. 802147c: eba0 20c1 subcs.w r0, r0, r1, lsl #11
  1702. 8021480: ebb0 2f81 cmp.w r0, r1, lsl #10
  1703. 8021484: bf00 nop
  1704. 8021486: eb42 0202 adc.w r2, r2, r2
  1705. 802148a: bf28 it cs
  1706. 802148c: eba0 2081 subcs.w r0, r0, r1, lsl #10
  1707. 8021490: ebb0 2f41 cmp.w r0, r1, lsl #9
  1708. 8021494: bf00 nop
  1709. 8021496: eb42 0202 adc.w r2, r2, r2
  1710. 802149a: bf28 it cs
  1711. 802149c: eba0 2041 subcs.w r0, r0, r1, lsl #9
  1712. 80214a0: ebb0 2f01 cmp.w r0, r1, lsl #8
  1713. 80214a4: bf00 nop
  1714. 80214a6: eb42 0202 adc.w r2, r2, r2
  1715. 80214aa: bf28 it cs
  1716. 80214ac: eba0 2001 subcs.w r0, r0, r1, lsl #8
  1717. 80214b0: ebb0 1fc1 cmp.w r0, r1, lsl #7
  1718. 80214b4: bf00 nop
  1719. 80214b6: eb42 0202 adc.w r2, r2, r2
  1720. 80214ba: bf28 it cs
  1721. 80214bc: eba0 10c1 subcs.w r0, r0, r1, lsl #7
  1722. 80214c0: ebb0 1f81 cmp.w r0, r1, lsl #6
  1723. 80214c4: bf00 nop
  1724. 80214c6: eb42 0202 adc.w r2, r2, r2
  1725. 80214ca: bf28 it cs
  1726. 80214cc: eba0 1081 subcs.w r0, r0, r1, lsl #6
  1727. 80214d0: ebb0 1f41 cmp.w r0, r1, lsl #5
  1728. 80214d4: bf00 nop
  1729. 80214d6: eb42 0202 adc.w r2, r2, r2
  1730. 80214da: bf28 it cs
  1731. 80214dc: eba0 1041 subcs.w r0, r0, r1, lsl #5
  1732. 80214e0: ebb0 1f01 cmp.w r0, r1, lsl #4
  1733. 80214e4: bf00 nop
  1734. 80214e6: eb42 0202 adc.w r2, r2, r2
  1735. 80214ea: bf28 it cs
  1736. 80214ec: eba0 1001 subcs.w r0, r0, r1, lsl #4
  1737. 80214f0: ebb0 0fc1 cmp.w r0, r1, lsl #3
  1738. 80214f4: bf00 nop
  1739. 80214f6: eb42 0202 adc.w r2, r2, r2
  1740. 80214fa: bf28 it cs
  1741. 80214fc: eba0 00c1 subcs.w r0, r0, r1, lsl #3
  1742. 8021500: ebb0 0f81 cmp.w r0, r1, lsl #2
  1743. 8021504: bf00 nop
  1744. 8021506: eb42 0202 adc.w r2, r2, r2
  1745. 802150a: bf28 it cs
  1746. 802150c: eba0 0081 subcs.w r0, r0, r1, lsl #2
  1747. 8021510: ebb0 0f41 cmp.w r0, r1, lsl #1
  1748. 8021514: bf00 nop
  1749. 8021516: eb42 0202 adc.w r2, r2, r2
  1750. 802151a: bf28 it cs
  1751. 802151c: eba0 0041 subcs.w r0, r0, r1, lsl #1
  1752. 8021520: ebb0 0f01 cmp.w r0, r1
  1753. 8021524: bf00 nop
  1754. 8021526: eb42 0202 adc.w r2, r2, r2
  1755. 802152a: bf28 it cs
  1756. 802152c: eba0 0001 subcs.w r0, r0, r1
  1757. 8021530: 4610 mov r0, r2
  1758. 8021532: 4770 bx lr
  1759. 8021534: bf0c ite eq
  1760. 8021536: 2001 moveq r0, #1
  1761. 8021538: 2000 movne r0, #0
  1762. 802153a: 4770 bx lr
  1763. 802153c: fab1 f281 clz r2, r1
  1764. 8021540: f1c2 021f rsb r2, r2, #31
  1765. 8021544: fa20 f002 lsr.w r0, r0, r2
  1766. 8021548: 4770 bx lr
  1767. 802154a: b108 cbz r0, 8021550 <__aeabi_uidiv+0x258>
  1768. 802154c: f04f 30ff mov.w r0, #4294967295
  1769. 8021550: f7ff bb8e b.w 8020c70 <__aeabi_idiv0>
  1770. 08021554 <__aeabi_uidivmod>:
  1771. 8021554: 2900 cmp r1, #0
  1772. 8021556: d0f8 beq.n 802154a <__aeabi_uidiv+0x252>
  1773. 8021558: e92d 4003 stmdb sp!, {r0, r1, lr}
  1774. 802155c: f7ff fecc bl 80212f8 <__aeabi_uidiv>
  1775. 8021560: e8bd 4006 ldmia.w sp!, {r1, r2, lr}
  1776. 8021564: fb02 f300 mul.w r3, r2, r0
  1777. 8021568: eba1 0103 sub.w r1, r1, r3
  1778. 802156c: 4770 bx lr
  1779. 802156e: bf00 nop
  1780. 08021570 <atof>:
  1781. 8021570: 2100 movs r1, #0
  1782. 8021572: f001 bde7 b.w 8023144 <strtod>
  1783. 8021576: bf00 nop
  1784. 08021578 <atoi>:
  1785. 8021578: 2100 movs r1, #0
  1786. 802157a: 220a movs r2, #10
  1787. 802157c: f001 bee2 b.w 8023344 <strtol>
  1788. 08021580 <_atoi_r>:
  1789. 8021580: 2200 movs r2, #0
  1790. 8021582: 230a movs r3, #10
  1791. 8021584: f001 be3c b.w 8023200 <_strtol_r>
  1792. 08021588 <__libc_init_array>:
  1793. 8021588: b570 push {r4, r5, r6, lr}
  1794. 802158a: f24b 7648 movw r6, #46920 ; 0xb748
  1795. 802158e: f24b 7548 movw r5, #46920 ; 0xb748
  1796. 8021592: f6c0 0603 movt r6, #2051 ; 0x803
  1797. 8021596: f6c0 0503 movt r5, #2051 ; 0x803
  1798. 802159a: 1b76 subs r6, r6, r5
  1799. 802159c: 10b6 asrs r6, r6, #2
  1800. 802159e: d007 beq.n 80215b0 <__libc_init_array+0x28>
  1801. 80215a0: 3d04 subs r5, #4
  1802. 80215a2: 2400 movs r4, #0
  1803. 80215a4: f855 3f04 ldr.w r3, [r5, #4]!
  1804. 80215a8: 3401 adds r4, #1
  1805. 80215aa: 4798 blx r3
  1806. 80215ac: 42a6 cmp r6, r4
  1807. 80215ae: d1f9 bne.n 80215a4 <__libc_init_array+0x1c>
  1808. 80215b0: f24b 764c movw r6, #46924 ; 0xb74c
  1809. 80215b4: f24b 7548 movw r5, #46920 ; 0xb748
  1810. 80215b8: f6c0 0603 movt r6, #2051 ; 0x803
  1811. 80215bc: f6c0 0503 movt r5, #2051 ; 0x803
  1812. 80215c0: 1b76 subs r6, r6, r5
  1813. 80215c2: f01a f8b1 bl 803b728 <_init>
  1814. 80215c6: 10b6 asrs r6, r6, #2
  1815. 80215c8: d008 beq.n 80215dc <__libc_init_array+0x54>
  1816. 80215ca: 3d04 subs r5, #4
  1817. 80215cc: 2400 movs r4, #0
  1818. 80215ce: f855 3f04 ldr.w r3, [r5, #4]!
  1819. 80215d2: 3401 adds r4, #1
  1820. 80215d4: 4798 blx r3
  1821. 80215d6: 42a6 cmp r6, r4
  1822. 80215d8: d1f9 bne.n 80215ce <__libc_init_array+0x46>
  1823. 80215da: bd70 pop {r4, r5, r6, pc}
  1824. 80215dc: bd70 pop {r4, r5, r6, pc}
  1825. 80215de: bf00 nop
  1826. 080215e0 <memcmp>:
  1827. 80215e0: 2a03 cmp r2, #3
  1828. 80215e2: b470 push {r4, r5, r6}
  1829. 80215e4: d922 bls.n 802162c <memcmp+0x4c>
  1830. 80215e6: ea41 0300 orr.w r3, r1, r0
  1831. 80215ea: 079b lsls r3, r3, #30
  1832. 80215ec: d013 beq.n 8021616 <memcmp+0x36>
  1833. 80215ee: 7805 ldrb r5, [r0, #0]
  1834. 80215f0: 3a01 subs r2, #1
  1835. 80215f2: 780c ldrb r4, [r1, #0]
  1836. 80215f4: 2300 movs r3, #0
  1837. 80215f6: 42a5 cmp r5, r4
  1838. 80215f8: d006 beq.n 8021608 <memcmp+0x28>
  1839. 80215fa: e01b b.n 8021634 <memcmp+0x54>
  1840. 80215fc: f810 5f01 ldrb.w r5, [r0, #1]!
  1841. 8021600: f811 4f01 ldrb.w r4, [r1, #1]!
  1842. 8021604: 42a5 cmp r5, r4
  1843. 8021606: d115 bne.n 8021634 <memcmp+0x54>
  1844. 8021608: 4293 cmp r3, r2
  1845. 802160a: f103 0301 add.w r3, r3, #1
  1846. 802160e: d1f5 bne.n 80215fc <memcmp+0x1c>
  1847. 8021610: 2000 movs r0, #0
  1848. 8021612: bc70 pop {r4, r5, r6}
  1849. 8021614: 4770 bx lr
  1850. 8021616: 460c mov r4, r1
  1851. 8021618: 4603 mov r3, r0
  1852. 802161a: 3104 adds r1, #4
  1853. 802161c: 3004 adds r0, #4
  1854. 802161e: 681e ldr r6, [r3, #0]
  1855. 8021620: 6825 ldr r5, [r4, #0]
  1856. 8021622: 42ae cmp r6, r5
  1857. 8021624: d108 bne.n 8021638 <memcmp+0x58>
  1858. 8021626: 3a04 subs r2, #4
  1859. 8021628: 2a03 cmp r2, #3
  1860. 802162a: d8f4 bhi.n 8021616 <memcmp+0x36>
  1861. 802162c: 2a00 cmp r2, #0
  1862. 802162e: d1de bne.n 80215ee <memcmp+0xe>
  1863. 8021630: 4610 mov r0, r2
  1864. 8021632: e7ee b.n 8021612 <memcmp+0x32>
  1865. 8021634: 1b28 subs r0, r5, r4
  1866. 8021636: e7ec b.n 8021612 <memcmp+0x32>
  1867. 8021638: 4621 mov r1, r4
  1868. 802163a: 4618 mov r0, r3
  1869. 802163c: 2a00 cmp r2, #0
  1870. 802163e: d1d6 bne.n 80215ee <memcmp+0xe>
  1871. 8021640: e7f6 b.n 8021630 <memcmp+0x50>
  1872. 8021642: bf00 nop
  1873. 08021644 <memcpy>:
  1874. 8021644: 2a03 cmp r2, #3
  1875. 8021646: e92d 0ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp}
  1876. 802164a: d809 bhi.n 8021660 <memcpy+0x1c>
  1877. 802164c: b12a cbz r2, 802165a <memcpy+0x16>
  1878. 802164e: 2300 movs r3, #0
  1879. 8021650: 5ccc ldrb r4, [r1, r3]
  1880. 8021652: 54c4 strb r4, [r0, r3]
  1881. 8021654: 3301 adds r3, #1
  1882. 8021656: 4293 cmp r3, r2
  1883. 8021658: d1fa bne.n 8021650 <memcpy+0xc>
  1884. 802165a: e8bd 0ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp}
  1885. 802165e: 4770 bx lr
  1886. 8021660: 0783 lsls r3, r0, #30
  1887. 8021662: 4402 add r2, r0
  1888. 8021664: d00e beq.n 8021684 <memcpy+0x40>
  1889. 8021666: 1c44 adds r4, r0, #1
  1890. 8021668: 1c4d adds r5, r1, #1
  1891. 802166a: f815 7c01 ldrb.w r7, [r5, #-1]
  1892. 802166e: f004 0603 and.w r6, r4, #3
  1893. 8021672: 4623 mov r3, r4
  1894. 8021674: 3401 adds r4, #1
  1895. 8021676: 4629 mov r1, r5
  1896. 8021678: 3501 adds r5, #1
  1897. 802167a: f804 7c02 strb.w r7, [r4, #-2]
  1898. 802167e: 2e00 cmp r6, #0
  1899. 8021680: d1f3 bne.n 802166a <memcpy+0x26>
  1900. 8021682: e000 b.n 8021686 <memcpy+0x42>
  1901. 8021684: 4603 mov r3, r0
  1902. 8021686: f011 0403 ands.w r4, r1, #3
  1903. 802168a: d06d beq.n 8021768 <memcpy+0x124>
  1904. 802168c: 1ad7 subs r7, r2, r3
  1905. 802168e: 1b0d subs r5, r1, r4
  1906. 8021690: 2f03 cmp r7, #3
  1907. 8021692: 682e ldr r6, [r5, #0]
  1908. 8021694: dd19 ble.n 80216ca <memcpy+0x86>
  1909. 8021696: f1c4 0c04 rsb ip, r4, #4
  1910. 802169a: ea4f 08c4 mov.w r8, r4, lsl #3
  1911. 802169e: 1d1c adds r4, r3, #4
  1912. 80216a0: ea4f 0ccc mov.w ip, ip, lsl #3
  1913. 80216a4: f855 7f04 ldr.w r7, [r5, #4]!
  1914. 80216a8: ebc4 0902 rsb r9, r4, r2
  1915. 80216ac: 4623 mov r3, r4
  1916. 80216ae: 3104 adds r1, #4
  1917. 80216b0: 3404 adds r4, #4
  1918. 80216b2: f1b9 0f03 cmp.w r9, #3
  1919. 80216b6: fa26 fa08 lsr.w sl, r6, r8
  1920. 80216ba: fa07 fb0c lsl.w fp, r7, ip
  1921. 80216be: 463e mov r6, r7
  1922. 80216c0: ea4b 070a orr.w r7, fp, sl
  1923. 80216c4: f844 7c08 str.w r7, [r4, #-8]
  1924. 80216c8: dcec bgt.n 80216a4 <memcpy+0x60>
  1925. 80216ca: 429a cmp r2, r3
  1926. 80216cc: d9c5 bls.n 802165a <memcpy+0x16>
  1927. 80216ce: 3301 adds r3, #1
  1928. 80216d0: 3101 adds r1, #1
  1929. 80216d2: 3201 adds r2, #1
  1930. 80216d4: f811 4c01 ldrb.w r4, [r1, #-1]
  1931. 80216d8: 3301 adds r3, #1
  1932. 80216da: 3101 adds r1, #1
  1933. 80216dc: 4293 cmp r3, r2
  1934. 80216de: f803 4c02 strb.w r4, [r3, #-2]
  1935. 80216e2: d1f7 bne.n 80216d4 <memcpy+0x90>
  1936. 80216e4: e7b9 b.n 802165a <memcpy+0x16>
  1937. 80216e6: 680c ldr r4, [r1, #0]
  1938. 80216e8: 3340 adds r3, #64 ; 0x40
  1939. 80216ea: 3140 adds r1, #64 ; 0x40
  1940. 80216ec: f843 4c40 str.w r4, [r3, #-64]
  1941. 80216f0: f851 4c3c ldr.w r4, [r1, #-60]
  1942. 80216f4: f843 4c3c str.w r4, [r3, #-60]
  1943. 80216f8: f851 4c38 ldr.w r4, [r1, #-56]
  1944. 80216fc: f843 4c38 str.w r4, [r3, #-56]
  1945. 8021700: f851 4c34 ldr.w r4, [r1, #-52]
  1946. 8021704: f843 4c34 str.w r4, [r3, #-52]
  1947. 8021708: f851 4c30 ldr.w r4, [r1, #-48]
  1948. 802170c: f843 4c30 str.w r4, [r3, #-48]
  1949. 8021710: f851 4c2c ldr.w r4, [r1, #-44]
  1950. 8021714: f843 4c2c str.w r4, [r3, #-44]
  1951. 8021718: f851 4c28 ldr.w r4, [r1, #-40]
  1952. 802171c: f843 4c28 str.w r4, [r3, #-40]
  1953. 8021720: f851 4c24 ldr.w r4, [r1, #-36]
  1954. 8021724: f843 4c24 str.w r4, [r3, #-36]
  1955. 8021728: f851 4c20 ldr.w r4, [r1, #-32]
  1956. 802172c: f843 4c20 str.w r4, [r3, #-32]
  1957. 8021730: f851 4c1c ldr.w r4, [r1, #-28]
  1958. 8021734: f843 4c1c str.w r4, [r3, #-28]
  1959. 8021738: f851 4c18 ldr.w r4, [r1, #-24]
  1960. 802173c: f843 4c18 str.w r4, [r3, #-24]
  1961. 8021740: f851 4c14 ldr.w r4, [r1, #-20]
  1962. 8021744: f843 4c14 str.w r4, [r3, #-20]
  1963. 8021748: f851 4c10 ldr.w r4, [r1, #-16]
  1964. 802174c: f843 4c10 str.w r4, [r3, #-16]
  1965. 8021750: f851 4c0c ldr.w r4, [r1, #-12]
  1966. 8021754: f843 4c0c str.w r4, [r3, #-12]
  1967. 8021758: f851 4c08 ldr.w r4, [r1, #-8]
  1968. 802175c: f843 4c08 str.w r4, [r3, #-8]
  1969. 8021760: f851 4c04 ldr.w r4, [r1, #-4]
  1970. 8021764: f843 4c04 str.w r4, [r3, #-4]
  1971. 8021768: 1ad4 subs r4, r2, r3
  1972. 802176a: 2c3f cmp r4, #63 ; 0x3f
  1973. 802176c: dcbb bgt.n 80216e6 <memcpy+0xa2>
  1974. 802176e: e011 b.n 8021794 <memcpy+0x150>
  1975. 8021770: 680c ldr r4, [r1, #0]
  1976. 8021772: 3310 adds r3, #16
  1977. 8021774: 3110 adds r1, #16
  1978. 8021776: f843 4c10 str.w r4, [r3, #-16]
  1979. 802177a: f851 4c0c ldr.w r4, [r1, #-12]
  1980. 802177e: f843 4c0c str.w r4, [r3, #-12]
  1981. 8021782: f851 4c08 ldr.w r4, [r1, #-8]
  1982. 8021786: f843 4c08 str.w r4, [r3, #-8]
  1983. 802178a: f851 4c04 ldr.w r4, [r1, #-4]
  1984. 802178e: f843 4c04 str.w r4, [r3, #-4]
  1985. 8021792: 1ad4 subs r4, r2, r3
  1986. 8021794: 2c0f cmp r4, #15
  1987. 8021796: dceb bgt.n 8021770 <memcpy+0x12c>
  1988. 8021798: 2c03 cmp r4, #3
  1989. 802179a: dd96 ble.n 80216ca <memcpy+0x86>
  1990. 802179c: 1d1c adds r4, r3, #4
  1991. 802179e: 1d0d adds r5, r1, #4
  1992. 80217a0: f855 7c04 ldr.w r7, [r5, #-4]
  1993. 80217a4: 1b16 subs r6, r2, r4
  1994. 80217a6: 4623 mov r3, r4
  1995. 80217a8: 4629 mov r1, r5
  1996. 80217aa: 3404 adds r4, #4
  1997. 80217ac: 3504 adds r5, #4
  1998. 80217ae: 2e03 cmp r6, #3
  1999. 80217b0: f844 7c08 str.w r7, [r4, #-8]
  2000. 80217b4: dcf4 bgt.n 80217a0 <memcpy+0x15c>
  2001. 80217b6: e788 b.n 80216ca <memcpy+0x86>
  2002. 080217b8 <memset>:
  2003. 80217b8: 2a03 cmp r2, #3
  2004. 80217ba: b2c9 uxtb r1, r1
  2005. 80217bc: b470 push {r4, r5, r6}
  2006. 80217be: d808 bhi.n 80217d2 <memset+0x1a>
  2007. 80217c0: b12a cbz r2, 80217ce <memset+0x16>
  2008. 80217c2: 4603 mov r3, r0
  2009. 80217c4: 1812 adds r2, r2, r0
  2010. 80217c6: f803 1b01 strb.w r1, [r3], #1
  2011. 80217ca: 4293 cmp r3, r2
  2012. 80217cc: d1fb bne.n 80217c6 <memset+0xe>
  2013. 80217ce: bc70 pop {r4, r5, r6}
  2014. 80217d0: 4770 bx lr
  2015. 80217d2: 0783 lsls r3, r0, #30
  2016. 80217d4: 4402 add r2, r0
  2017. 80217d6: d009 beq.n 80217ec <memset+0x34>
  2018. 80217d8: 1c44 adds r4, r0, #1
  2019. 80217da: f004 0503 and.w r5, r4, #3
  2020. 80217de: 4623 mov r3, r4
  2021. 80217e0: f804 1c01 strb.w r1, [r4, #-1]
  2022. 80217e4: 3401 adds r4, #1
  2023. 80217e6: 2d00 cmp r5, #0
  2024. 80217e8: d1f7 bne.n 80217da <memset+0x22>
  2025. 80217ea: e000 b.n 80217ee <memset+0x36>
  2026. 80217ec: 4603 mov r3, r0
  2027. 80217ee: 1ad5 subs r5, r2, r3
  2028. 80217f0: eb01 2401 add.w r4, r1, r1, lsl #8
  2029. 80217f4: 2d3f cmp r5, #63 ; 0x3f
  2030. 80217f6: eb04 4404 add.w r4, r4, r4, lsl #16
  2031. 80217fa: dd2c ble.n 8021856 <memset+0x9e>
  2032. 80217fc: 601c str r4, [r3, #0]
  2033. 80217fe: 3340 adds r3, #64 ; 0x40
  2034. 8021800: 1ad5 subs r5, r2, r3
  2035. 8021802: f843 4c3c str.w r4, [r3, #-60]
  2036. 8021806: 2d3f cmp r5, #63 ; 0x3f
  2037. 8021808: f843 4c38 str.w r4, [r3, #-56]
  2038. 802180c: f843 4c34 str.w r4, [r3, #-52]
  2039. 8021810: f843 4c30 str.w r4, [r3, #-48]
  2040. 8021814: f843 4c2c str.w r4, [r3, #-44]
  2041. 8021818: f843 4c28 str.w r4, [r3, #-40]
  2042. 802181c: f843 4c24 str.w r4, [r3, #-36]
  2043. 8021820: f843 4c20 str.w r4, [r3, #-32]
  2044. 8021824: f843 4c1c str.w r4, [r3, #-28]
  2045. 8021828: f843 4c18 str.w r4, [r3, #-24]
  2046. 802182c: f843 4c14 str.w r4, [r3, #-20]
  2047. 8021830: f843 4c10 str.w r4, [r3, #-16]
  2048. 8021834: f843 4c0c str.w r4, [r3, #-12]
  2049. 8021838: f843 4c08 str.w r4, [r3, #-8]
  2050. 802183c: f843 4c04 str.w r4, [r3, #-4]
  2051. 8021840: dcdc bgt.n 80217fc <memset+0x44>
  2052. 8021842: e008 b.n 8021856 <memset+0x9e>
  2053. 8021844: 601c str r4, [r3, #0]
  2054. 8021846: 3310 adds r3, #16
  2055. 8021848: 1ad5 subs r5, r2, r3
  2056. 802184a: f843 4c0c str.w r4, [r3, #-12]
  2057. 802184e: f843 4c08 str.w r4, [r3, #-8]
  2058. 8021852: f843 4c04 str.w r4, [r3, #-4]
  2059. 8021856: 2d0f cmp r5, #15
  2060. 8021858: dcf4 bgt.n 8021844 <memset+0x8c>
  2061. 802185a: 2d03 cmp r5, #3
  2062. 802185c: dd08 ble.n 8021870 <memset+0xb8>
  2063. 802185e: 1d1d adds r5, r3, #4
  2064. 8021860: 1b56 subs r6, r2, r5
  2065. 8021862: f845 4c04 str.w r4, [r5, #-4]
  2066. 8021866: 2e03 cmp r6, #3
  2067. 8021868: 462b mov r3, r5
  2068. 802186a: f105 0504 add.w r5, r5, #4
  2069. 802186e: dcf7 bgt.n 8021860 <memset+0xa8>
  2070. 8021870: 429a cmp r2, r3
  2071. 8021872: d9ac bls.n 80217ce <memset+0x16>
  2072. 8021874: 3301 adds r3, #1
  2073. 8021876: 3201 adds r2, #1
  2074. 8021878: f803 1c01 strb.w r1, [r3, #-1]
  2075. 802187c: 3301 adds r3, #1
  2076. 802187e: 4293 cmp r3, r2
  2077. 8021880: d1fa bne.n 8021878 <memset+0xc0>
  2078. 8021882: e7a4 b.n 80217ce <memset+0x16>
  2079. 08021884 <strcat>:
  2080. 8021884: 0783 lsls r3, r0, #30
  2081. 8021886: b570 push {r4, r5, r6, lr}
  2082. 8021888: 4606 mov r6, r0
  2083. 802188a: d114 bne.n 80218b6 <strcat+0x32>
  2084. 802188c: 6803 ldr r3, [r0, #0]
  2085. 802188e: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  2086. 8021892: ea22 0303 bic.w r3, r2, r3
  2087. 8021896: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  2088. 802189a: d10c bne.n 80218b6 <strcat+0x32>
  2089. 802189c: 1d03 adds r3, r0, #4
  2090. 802189e: 461a mov r2, r3
  2091. 80218a0: f853 4b04 ldr.w r4, [r3], #4
  2092. 80218a4: f1a4 3501 sub.w r5, r4, #16843009 ; 0x1010101
  2093. 80218a8: ea25 0404 bic.w r4, r5, r4
  2094. 80218ac: f014 3f80 tst.w r4, #2155905152 ; 0x80808080
  2095. 80218b0: d0f5 beq.n 802189e <strcat+0x1a>
  2096. 80218b2: 4610 mov r0, r2
  2097. 80218b4: e000 b.n 80218b8 <strcat+0x34>
  2098. 80218b6: 4630 mov r0, r6
  2099. 80218b8: 7803 ldrb r3, [r0, #0]
  2100. 80218ba: b12b cbz r3, 80218c8 <strcat+0x44>
  2101. 80218bc: 1c43 adds r3, r0, #1
  2102. 80218be: 4618 mov r0, r3
  2103. 80218c0: 3301 adds r3, #1
  2104. 80218c2: 7804 ldrb r4, [r0, #0]
  2105. 80218c4: 2c00 cmp r4, #0
  2106. 80218c6: d1fa bne.n 80218be <strcat+0x3a>
  2107. 80218c8: f000 f8f0 bl 8021aac <strcpy>
  2108. 80218cc: 4630 mov r0, r6
  2109. 80218ce: bd70 pop {r4, r5, r6, pc}
  2110. 080218d0 <strcmp>:
  2111. 80218d0: ea80 0201 eor.w r2, r0, r1
  2112. 80218d4: f012 0f03 tst.w r2, #3
  2113. 80218d8: f040 803a bne.w 8021950 <strcmp_unaligned>
  2114. 80218dc: f010 0203 ands.w r2, r0, #3
  2115. 80218e0: f020 0003 bic.w r0, r0, #3
  2116. 80218e4: f021 0103 bic.w r1, r1, #3
  2117. 80218e8: f850 cb04 ldr.w ip, [r0], #4
  2118. 80218ec: bf08 it eq
  2119. 80218ee: f851 3b04 ldreq.w r3, [r1], #4
  2120. 80218f2: d00d beq.n 8021910 <strcmp+0x40>
  2121. 80218f4: f082 0203 eor.w r2, r2, #3
  2122. 80218f8: ea4f 02c2 mov.w r2, r2, lsl #3
  2123. 80218fc: f06f 437f mvn.w r3, #4278190080 ; 0xff000000
  2124. 8021900: fa23 f202 lsr.w r2, r3, r2
  2125. 8021904: f851 3b04 ldr.w r3, [r1], #4
  2126. 8021908: ea4c 0c02 orr.w ip, ip, r2
  2127. 802190c: ea43 0302 orr.w r3, r3, r2
  2128. 8021910: f1ac 3201 sub.w r2, ip, #16843009 ; 0x1010101
  2129. 8021914: 459c cmp ip, r3
  2130. 8021916: bf01 itttt eq
  2131. 8021918: ea22 020c biceq.w r2, r2, ip
  2132. 802191c: f012 3f80 tsteq.w r2, #2155905152 ; 0x80808080
  2133. 8021920: f850 cb04 ldreq.w ip, [r0], #4
  2134. 8021924: f851 3b04 ldreq.w r3, [r1], #4
  2135. 8021928: d0f2 beq.n 8021910 <strcmp+0x40>
  2136. 802192a: ea4f 600c mov.w r0, ip, lsl #24
  2137. 802192e: ea4f 2c1c mov.w ip, ip, lsr #8
  2138. 8021932: 2801 cmp r0, #1
  2139. 8021934: bf28 it cs
  2140. 8021936: ebb0 6f03 cmpcs.w r0, r3, lsl #24
  2141. 802193a: bf08 it eq
  2142. 802193c: 0a1b lsreq r3, r3, #8
  2143. 802193e: d0f4 beq.n 802192a <strcmp+0x5a>
  2144. 8021940: f003 03ff and.w r3, r3, #255 ; 0xff
  2145. 8021944: ea4f 6010 mov.w r0, r0, lsr #24
  2146. 8021948: eba0 0003 sub.w r0, r0, r3
  2147. 802194c: 4770 bx lr
  2148. 802194e: bf00 nop
  2149. 08021950 <strcmp_unaligned>:
  2150. 8021950: f010 0f03 tst.w r0, #3
  2151. 8021954: d00a beq.n 802196c <strcmp_unaligned+0x1c>
  2152. 8021956: f810 2b01 ldrb.w r2, [r0], #1
  2153. 802195a: f811 3b01 ldrb.w r3, [r1], #1
  2154. 802195e: 2a01 cmp r2, #1
  2155. 8021960: bf28 it cs
  2156. 8021962: 429a cmpcs r2, r3
  2157. 8021964: d0f4 beq.n 8021950 <strcmp_unaligned>
  2158. 8021966: eba2 0003 sub.w r0, r2, r3
  2159. 802196a: 4770 bx lr
  2160. 802196c: f84d 5d04 str.w r5, [sp, #-4]!
  2161. 8021970: f84d 4d04 str.w r4, [sp, #-4]!
  2162. 8021974: f04f 0201 mov.w r2, #1
  2163. 8021978: ea42 2202 orr.w r2, r2, r2, lsl #8
  2164. 802197c: ea42 4202 orr.w r2, r2, r2, lsl #16
  2165. 8021980: f001 0c03 and.w ip, r1, #3
  2166. 8021984: f021 0103 bic.w r1, r1, #3
  2167. 8021988: f850 4b04 ldr.w r4, [r0], #4
  2168. 802198c: f851 5b04 ldr.w r5, [r1], #4
  2169. 8021990: f1bc 0f02 cmp.w ip, #2
  2170. 8021994: d026 beq.n 80219e4 <strcmp_unaligned+0x94>
  2171. 8021996: d84b bhi.n 8021a30 <strcmp_unaligned+0xe0>
  2172. 8021998: f024 4c7f bic.w ip, r4, #4278190080 ; 0xff000000
  2173. 802199c: ebbc 2f15 cmp.w ip, r5, lsr #8
  2174. 80219a0: eba4 0302 sub.w r3, r4, r2
  2175. 80219a4: ea23 0304 bic.w r3, r3, r4
  2176. 80219a8: d10d bne.n 80219c6 <strcmp_unaligned+0x76>
  2177. 80219aa: ea13 13c2 ands.w r3, r3, r2, lsl #7
  2178. 80219ae: bf08 it eq
  2179. 80219b0: f851 5b04 ldreq.w r5, [r1], #4
  2180. 80219b4: d10a bne.n 80219cc <strcmp_unaligned+0x7c>
  2181. 80219b6: ea8c 0c04 eor.w ip, ip, r4
  2182. 80219ba: ebbc 6f05 cmp.w ip, r5, lsl #24
  2183. 80219be: d10c bne.n 80219da <strcmp_unaligned+0x8a>
  2184. 80219c0: f850 4b04 ldr.w r4, [r0], #4
  2185. 80219c4: e7e8 b.n 8021998 <strcmp_unaligned+0x48>
  2186. 80219c6: ea4f 2515 mov.w r5, r5, lsr #8
  2187. 80219ca: e05c b.n 8021a86 <strcmp_unaligned+0x136>
  2188. 80219cc: f033 437f bics.w r3, r3, #4278190080 ; 0xff000000
  2189. 80219d0: d152 bne.n 8021a78 <strcmp_unaligned+0x128>
  2190. 80219d2: 780d ldrb r5, [r1, #0]
  2191. 80219d4: ea4f 6c14 mov.w ip, r4, lsr #24
  2192. 80219d8: e055 b.n 8021a86 <strcmp_unaligned+0x136>
  2193. 80219da: ea4f 6c14 mov.w ip, r4, lsr #24
  2194. 80219de: f005 05ff and.w r5, r5, #255 ; 0xff
  2195. 80219e2: e050 b.n 8021a86 <strcmp_unaligned+0x136>
  2196. 80219e4: ea4f 4c04 mov.w ip, r4, lsl #16
  2197. 80219e8: eba4 0302 sub.w r3, r4, r2
  2198. 80219ec: ea4f 4c1c mov.w ip, ip, lsr #16
  2199. 80219f0: ea23 0304 bic.w r3, r3, r4
  2200. 80219f4: ebbc 4f15 cmp.w ip, r5, lsr #16
  2201. 80219f8: d117 bne.n 8021a2a <strcmp_unaligned+0xda>
  2202. 80219fa: ea13 13c2 ands.w r3, r3, r2, lsl #7
  2203. 80219fe: bf08 it eq
  2204. 8021a00: f851 5b04 ldreq.w r5, [r1], #4
  2205. 8021a04: d107 bne.n 8021a16 <strcmp_unaligned+0xc6>
  2206. 8021a06: ea8c 0c04 eor.w ip, ip, r4
  2207. 8021a0a: ebbc 4f05 cmp.w ip, r5, lsl #16
  2208. 8021a0e: d108 bne.n 8021a22 <strcmp_unaligned+0xd2>
  2209. 8021a10: f850 4b04 ldr.w r4, [r0], #4
  2210. 8021a14: e7e6 b.n 80219e4 <strcmp_unaligned+0x94>
  2211. 8021a16: 041b lsls r3, r3, #16
  2212. 8021a18: d12e bne.n 8021a78 <strcmp_unaligned+0x128>
  2213. 8021a1a: 880d ldrh r5, [r1, #0]
  2214. 8021a1c: ea4f 4c14 mov.w ip, r4, lsr #16
  2215. 8021a20: e031 b.n 8021a86 <strcmp_unaligned+0x136>
  2216. 8021a22: ea4f 4505 mov.w r5, r5, lsl #16
  2217. 8021a26: ea4f 4c14 mov.w ip, r4, lsr #16
  2218. 8021a2a: ea4f 4515 mov.w r5, r5, lsr #16
  2219. 8021a2e: e02a b.n 8021a86 <strcmp_unaligned+0x136>
  2220. 8021a30: f004 0cff and.w ip, r4, #255 ; 0xff
  2221. 8021a34: ebbc 6f15 cmp.w ip, r5, lsr #24
  2222. 8021a38: eba4 0302 sub.w r3, r4, r2
  2223. 8021a3c: ea23 0304 bic.w r3, r3, r4
  2224. 8021a40: d10d bne.n 8021a5e <strcmp_unaligned+0x10e>
  2225. 8021a42: ea13 13c2 ands.w r3, r3, r2, lsl #7
  2226. 8021a46: bf08 it eq
  2227. 8021a48: f851 5b04 ldreq.w r5, [r1], #4
  2228. 8021a4c: d10a bne.n 8021a64 <strcmp_unaligned+0x114>
  2229. 8021a4e: ea8c 0c04 eor.w ip, ip, r4
  2230. 8021a52: ebbc 2f05 cmp.w ip, r5, lsl #8
  2231. 8021a56: d10a bne.n 8021a6e <strcmp_unaligned+0x11e>
  2232. 8021a58: f850 4b04 ldr.w r4, [r0], #4
  2233. 8021a5c: e7e8 b.n 8021a30 <strcmp_unaligned+0xe0>
  2234. 8021a5e: ea4f 6515 mov.w r5, r5, lsr #24
  2235. 8021a62: e010 b.n 8021a86 <strcmp_unaligned+0x136>
  2236. 8021a64: f014 0fff tst.w r4, #255 ; 0xff
  2237. 8021a68: d006 beq.n 8021a78 <strcmp_unaligned+0x128>
  2238. 8021a6a: f851 5b04 ldr.w r5, [r1], #4
  2239. 8021a6e: ea4f 2c14 mov.w ip, r4, lsr #8
  2240. 8021a72: f025 457f bic.w r5, r5, #4278190080 ; 0xff000000
  2241. 8021a76: e006 b.n 8021a86 <strcmp_unaligned+0x136>
  2242. 8021a78: f04f 0000 mov.w r0, #0
  2243. 8021a7c: f85d 4b04 ldr.w r4, [sp], #4
  2244. 8021a80: f85d 5b04 ldr.w r5, [sp], #4
  2245. 8021a84: 4770 bx lr
  2246. 8021a86: f00c 02ff and.w r2, ip, #255 ; 0xff
  2247. 8021a8a: f005 00ff and.w r0, r5, #255 ; 0xff
  2248. 8021a8e: 2801 cmp r0, #1
  2249. 8021a90: bf28 it cs
  2250. 8021a92: 4290 cmpcs r0, r2
  2251. 8021a94: bf04 itt eq
  2252. 8021a96: ea4f 2c1c moveq.w ip, ip, lsr #8
  2253. 8021a9a: 0a2d lsreq r5, r5, #8
  2254. 8021a9c: d0f3 beq.n 8021a86 <strcmp_unaligned+0x136>
  2255. 8021a9e: eba2 0000 sub.w r0, r2, r0
  2256. 8021aa2: f85d 4b04 ldr.w r4, [sp], #4
  2257. 8021aa6: f85d 5b04 ldr.w r5, [sp], #4
  2258. 8021aaa: 4770 bx lr
  2259. 08021aac <strcpy>:
  2260. 8021aac: ea80 0201 eor.w r2, r0, r1
  2261. 8021ab0: 4684 mov ip, r0
  2262. 8021ab2: f012 0f03 tst.w r2, #3
  2263. 8021ab6: d14f bne.n 8021b58 <strcpy+0xac>
  2264. 8021ab8: f011 0f03 tst.w r1, #3
  2265. 8021abc: d132 bne.n 8021b24 <strcpy+0x78>
  2266. 8021abe: f84d 4d04 str.w r4, [sp, #-4]!
  2267. 8021ac2: f011 0f04 tst.w r1, #4
  2268. 8021ac6: f851 3b04 ldr.w r3, [r1], #4
  2269. 8021aca: d00b beq.n 8021ae4 <strcpy+0x38>
  2270. 8021acc: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  2271. 8021ad0: 439a bics r2, r3
  2272. 8021ad2: f012 3f80 tst.w r2, #2155905152 ; 0x80808080
  2273. 8021ad6: bf04 itt eq
  2274. 8021ad8: f84c 3b04 streq.w r3, [ip], #4
  2275. 8021adc: f851 3b04 ldreq.w r3, [r1], #4
  2276. 8021ae0: d116 bne.n 8021b10 <strcpy+0x64>
  2277. 8021ae2: bf00 nop
  2278. 8021ae4: f851 4b04 ldr.w r4, [r1], #4
  2279. 8021ae8: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  2280. 8021aec: 439a bics r2, r3
  2281. 8021aee: f012 3f80 tst.w r2, #2155905152 ; 0x80808080
  2282. 8021af2: f1a4 3201 sub.w r2, r4, #16843009 ; 0x1010101
  2283. 8021af6: d10b bne.n 8021b10 <strcpy+0x64>
  2284. 8021af8: f84c 3b04 str.w r3, [ip], #4
  2285. 8021afc: 43a2 bics r2, r4
  2286. 8021afe: f012 3f80 tst.w r2, #2155905152 ; 0x80808080
  2287. 8021b02: bf04 itt eq
  2288. 8021b04: f851 3b04 ldreq.w r3, [r1], #4
  2289. 8021b08: f84c 4b04 streq.w r4, [ip], #4
  2290. 8021b0c: d0ea beq.n 8021ae4 <strcpy+0x38>
  2291. 8021b0e: 4623 mov r3, r4
  2292. 8021b10: f80c 3b01 strb.w r3, [ip], #1
  2293. 8021b14: f013 0fff tst.w r3, #255 ; 0xff
  2294. 8021b18: ea4f 2333 mov.w r3, r3, ror #8
  2295. 8021b1c: d1f8 bne.n 8021b10 <strcpy+0x64>
  2296. 8021b1e: f85d 4b04 ldr.w r4, [sp], #4
  2297. 8021b22: 4770 bx lr
  2298. 8021b24: f011 0f01 tst.w r1, #1
  2299. 8021b28: d006 beq.n 8021b38 <strcpy+0x8c>
  2300. 8021b2a: f811 2b01 ldrb.w r2, [r1], #1
  2301. 8021b2e: f80c 2b01 strb.w r2, [ip], #1
  2302. 8021b32: 2a00 cmp r2, #0
  2303. 8021b34: bf08 it eq
  2304. 8021b36: 4770 bxeq lr
  2305. 8021b38: f011 0f02 tst.w r1, #2
  2306. 8021b3c: d0bf beq.n 8021abe <strcpy+0x12>
  2307. 8021b3e: f831 2b02 ldrh.w r2, [r1], #2
  2308. 8021b42: f012 0fff tst.w r2, #255 ; 0xff
  2309. 8021b46: bf16 itet ne
  2310. 8021b48: f82c 2b02 strhne.w r2, [ip], #2
  2311. 8021b4c: f88c 2000 strbeq.w r2, [ip]
  2312. 8021b50: f412 4f7f tstne.w r2, #65280 ; 0xff00
  2313. 8021b54: d1b3 bne.n 8021abe <strcpy+0x12>
  2314. 8021b56: 4770 bx lr
  2315. 8021b58: f811 2b01 ldrb.w r2, [r1], #1
  2316. 8021b5c: f80c 2b01 strb.w r2, [ip], #1
  2317. 8021b60: 2a00 cmp r2, #0
  2318. 8021b62: d1f9 bne.n 8021b58 <strcpy+0xac>
  2319. 8021b64: 4770 bx lr
  2320. 8021b66: bf00 nop
  2321. 08021b68 <strlen>:
  2322. 8021b68: f020 0103 bic.w r1, r0, #3
  2323. 8021b6c: f010 0003 ands.w r0, r0, #3
  2324. 8021b70: f1c0 0000 rsb r0, r0, #0
  2325. 8021b74: f851 3b04 ldr.w r3, [r1], #4
  2326. 8021b78: f100 0c04 add.w ip, r0, #4
  2327. 8021b7c: ea4f 0ccc mov.w ip, ip, lsl #3
  2328. 8021b80: f06f 0200 mvn.w r2, #0
  2329. 8021b84: bf1c itt ne
  2330. 8021b86: fa22 f20c lsrne.w r2, r2, ip
  2331. 8021b8a: 4313 orrne r3, r2
  2332. 8021b8c: f04f 0c01 mov.w ip, #1
  2333. 8021b90: ea4c 2c0c orr.w ip, ip, ip, lsl #8
  2334. 8021b94: ea4c 4c0c orr.w ip, ip, ip, lsl #16
  2335. 8021b98: eba3 020c sub.w r2, r3, ip
  2336. 8021b9c: ea22 0203 bic.w r2, r2, r3
  2337. 8021ba0: ea12 12cc ands.w r2, r2, ip, lsl #7
  2338. 8021ba4: bf04 itt eq
  2339. 8021ba6: f851 3b04 ldreq.w r3, [r1], #4
  2340. 8021baa: 3004 addeq r0, #4
  2341. 8021bac: d0f4 beq.n 8021b98 <strlen+0x30>
  2342. 8021bae: f013 0fff tst.w r3, #255 ; 0xff
  2343. 8021bb2: bf1f itttt ne
  2344. 8021bb4: 3001 addne r0, #1
  2345. 8021bb6: f413 4f7f tstne.w r3, #65280 ; 0xff00
  2346. 8021bba: 3001 addne r0, #1
  2347. 8021bbc: f413 0f7f tstne.w r3, #16711680 ; 0xff0000
  2348. 8021bc0: bf18 it ne
  2349. 8021bc2: 3001 addne r0, #1
  2350. 8021bc4: 4770 bx lr
  2351. 8021bc6: bf00 nop
  2352. 08021bc8 <strncat>:
  2353. 8021bc8: 0783 lsls r3, r0, #30
  2354. 8021bca: b470 push {r4, r5, r6}
  2355. 8021bcc: d113 bne.n 8021bf6 <strncat+0x2e>
  2356. 8021bce: 6803 ldr r3, [r0, #0]
  2357. 8021bd0: f1a3 3401 sub.w r4, r3, #16843009 ; 0x1010101
  2358. 8021bd4: ea24 0303 bic.w r3, r4, r3
  2359. 8021bd8: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  2360. 8021bdc: d10b bne.n 8021bf6 <strncat+0x2e>
  2361. 8021bde: 1d03 adds r3, r0, #4
  2362. 8021be0: 461d mov r5, r3
  2363. 8021be2: f853 4b04 ldr.w r4, [r3], #4
  2364. 8021be6: f1a4 3601 sub.w r6, r4, #16843009 ; 0x1010101
  2365. 8021bea: ea26 0404 bic.w r4, r6, r4
  2366. 8021bee: f014 3f80 tst.w r4, #2155905152 ; 0x80808080
  2367. 8021bf2: d0f5 beq.n 8021be0 <strncat+0x18>
  2368. 8021bf4: e000 b.n 8021bf8 <strncat+0x30>
  2369. 8021bf6: 4605 mov r5, r0
  2370. 8021bf8: 782b ldrb r3, [r5, #0]
  2371. 8021bfa: b12b cbz r3, 8021c08 <strncat+0x40>
  2372. 8021bfc: 1c6b adds r3, r5, #1
  2373. 8021bfe: 461d mov r5, r3
  2374. 8021c00: 3301 adds r3, #1
  2375. 8021c02: 782c ldrb r4, [r5, #0]
  2376. 8021c04: 2c00 cmp r4, #0
  2377. 8021c06: d1fa bne.n 8021bfe <strncat+0x36>
  2378. 8021c08: 3901 subs r1, #1
  2379. 8021c0a: 3d01 subs r5, #1
  2380. 8021c0c: 1e53 subs r3, r2, #1
  2381. 8021c0e: b15a cbz r2, 8021c28 <strncat+0x60>
  2382. 8021c10: f811 4f01 ldrb.w r4, [r1, #1]!
  2383. 8021c14: 461a mov r2, r3
  2384. 8021c16: f805 4f01 strb.w r4, [r5, #1]!
  2385. 8021c1a: b12c cbz r4, 8021c28 <strncat+0x60>
  2386. 8021c1c: 2b00 cmp r3, #0
  2387. 8021c1e: d1f5 bne.n 8021c0c <strncat+0x44>
  2388. 8021c20: 706b strb r3, [r5, #1]
  2389. 8021c22: 1e53 subs r3, r2, #1
  2390. 8021c24: 2a00 cmp r2, #0
  2391. 8021c26: d1f3 bne.n 8021c10 <strncat+0x48>
  2392. 8021c28: bc70 pop {r4, r5, r6}
  2393. 8021c2a: 4770 bx lr
  2394. 08021c2c <strncmp>:
  2395. 8021c2c: b470 push {r4, r5, r6}
  2396. 8021c2e: 2a00 cmp r2, #0
  2397. 8021c30: d045 beq.n 8021cbe <strncmp+0x92>
  2398. 8021c32: ea41 0300 orr.w r3, r1, r0
  2399. 8021c36: f013 0303 ands.w r3, r3, #3
  2400. 8021c3a: d129 bne.n 8021c90 <strncmp+0x64>
  2401. 8021c3c: 2a03 cmp r2, #3
  2402. 8021c3e: d927 bls.n 8021c90 <strncmp+0x64>
  2403. 8021c40: 6805 ldr r5, [r0, #0]
  2404. 8021c42: 680c ldr r4, [r1, #0]
  2405. 8021c44: 42a5 cmp r5, r4
  2406. 8021c46: d123 bne.n 8021c90 <strncmp+0x64>
  2407. 8021c48: 1f14 subs r4, r2, #4
  2408. 8021c4a: d03a beq.n 8021cc2 <strncmp+0x96>
  2409. 8021c4c: f1a5 3201 sub.w r2, r5, #16843009 ; 0x1010101
  2410. 8021c50: ea22 0505 bic.w r5, r2, r5
  2411. 8021c54: f015 3f80 tst.w r5, #2155905152 ; 0x80808080
  2412. 8021c58: d00d beq.n 8021c76 <strncmp+0x4a>
  2413. 8021c5a: e03a b.n 8021cd2 <strncmp+0xa6>
  2414. 8021c5c: 685b ldr r3, [r3, #4]
  2415. 8021c5e: 686a ldr r2, [r5, #4]
  2416. 8021c60: f1a3 3501 sub.w r5, r3, #16843009 ; 0x1010101
  2417. 8021c64: 4293 cmp r3, r2
  2418. 8021c66: ea25 0503 bic.w r5, r5, r3
  2419. 8021c6a: d12e bne.n 8021cca <strncmp+0x9e>
  2420. 8021c6c: 3c04 subs r4, #4
  2421. 8021c6e: d028 beq.n 8021cc2 <strncmp+0x96>
  2422. 8021c70: f015 3f80 tst.w r5, #2155905152 ; 0x80808080
  2423. 8021c74: d127 bne.n 8021cc6 <strncmp+0x9a>
  2424. 8021c76: 460d mov r5, r1
  2425. 8021c78: 4603 mov r3, r0
  2426. 8021c7a: 3104 adds r1, #4
  2427. 8021c7c: 3004 adds r0, #4
  2428. 8021c7e: 2c03 cmp r4, #3
  2429. 8021c80: d8ec bhi.n 8021c5c <strncmp+0x30>
  2430. 8021c82: 1e66 subs r6, r4, #1
  2431. 8021c84: b92c cbnz r4, 8021c92 <strncmp+0x66>
  2432. 8021c86: 791c ldrb r4, [r3, #4]
  2433. 8021c88: 792a ldrb r2, [r5, #4]
  2434. 8021c8a: 1aa0 subs r0, r4, r2
  2435. 8021c8c: bc70 pop {r4, r5, r6}
  2436. 8021c8e: 4770 bx lr
  2437. 8021c90: 1e56 subs r6, r2, #1
  2438. 8021c92: 7804 ldrb r4, [r0, #0]
  2439. 8021c94: 780a ldrb r2, [r1, #0]
  2440. 8021c96: 4294 cmp r4, r2
  2441. 8021c98: d1f7 bne.n 8021c8a <strncmp+0x5e>
  2442. 8021c9a: b1c6 cbz r6, 8021cce <strncmp+0xa2>
  2443. 8021c9c: b18c cbz r4, 8021cc2 <strncmp+0x96>
  2444. 8021c9e: 3601 adds r6, #1
  2445. 8021ca0: 1c8b adds r3, r1, #2
  2446. 8021ca2: 1989 adds r1, r1, r6
  2447. 8021ca4: e004 b.n 8021cb0 <strncmp+0x84>
  2448. 8021ca6: 428b cmp r3, r1
  2449. 8021ca8: f103 0301 add.w r3, r3, #1
  2450. 8021cac: d00b beq.n 8021cc6 <strncmp+0x9a>
  2451. 8021cae: b144 cbz r4, 8021cc2 <strncmp+0x96>
  2452. 8021cb0: f813 2c01 ldrb.w r2, [r3, #-1]
  2453. 8021cb4: f810 4f01 ldrb.w r4, [r0, #1]!
  2454. 8021cb8: 4294 cmp r4, r2
  2455. 8021cba: d0f4 beq.n 8021ca6 <strncmp+0x7a>
  2456. 8021cbc: e7e5 b.n 8021c8a <strncmp+0x5e>
  2457. 8021cbe: 4610 mov r0, r2
  2458. 8021cc0: e7e4 b.n 8021c8c <strncmp+0x60>
  2459. 8021cc2: 4620 mov r0, r4
  2460. 8021cc4: e7e2 b.n 8021c8c <strncmp+0x60>
  2461. 8021cc6: 2000 movs r0, #0
  2462. 8021cc8: e7e0 b.n 8021c8c <strncmp+0x60>
  2463. 8021cca: 1e66 subs r6, r4, #1
  2464. 8021ccc: e7e1 b.n 8021c92 <strncmp+0x66>
  2465. 8021cce: 4630 mov r0, r6
  2466. 8021cd0: e7dc b.n 8021c8c <strncmp+0x60>
  2467. 8021cd2: 4618 mov r0, r3
  2468. 8021cd4: e7da b.n 8021c8c <strncmp+0x60>
  2469. 8021cd6: bf00 nop
  2470. 08021cd8 <strncpy>:
  2471. 8021cd8: ea41 0300 orr.w r3, r1, r0
  2472. 8021cdc: f013 0f03 tst.w r3, #3
  2473. 8021ce0: 4603 mov r3, r0
  2474. 8021ce2: b470 push {r4, r5, r6}
  2475. 8021ce4: d025 beq.n 8021d32 <strncpy+0x5a>
  2476. 8021ce6: b1aa cbz r2, 8021d14 <strncpy+0x3c>
  2477. 8021ce8: 780c ldrb r4, [r1, #0]
  2478. 8021cea: 3a01 subs r2, #1
  2479. 8021cec: f803 4b01 strb.w r4, [r3], #1
  2480. 8021cf0: b14c cbz r4, 8021d06 <strncpy+0x2e>
  2481. 8021cf2: 461c mov r4, r3
  2482. 8021cf4: b172 cbz r2, 8021d14 <strncpy+0x3c>
  2483. 8021cf6: f811 5f01 ldrb.w r5, [r1, #1]!
  2484. 8021cfa: 3a01 subs r2, #1
  2485. 8021cfc: f804 5b01 strb.w r5, [r4], #1
  2486. 8021d00: 4623 mov r3, r4
  2487. 8021d02: 2d00 cmp r5, #0
  2488. 8021d04: d1f6 bne.n 8021cf4 <strncpy+0x1c>
  2489. 8021d06: b12a cbz r2, 8021d14 <strncpy+0x3c>
  2490. 8021d08: 189a adds r2, r3, r2
  2491. 8021d0a: 2100 movs r1, #0
  2492. 8021d0c: f803 1b01 strb.w r1, [r3], #1
  2493. 8021d10: 4293 cmp r3, r2
  2494. 8021d12: d1fb bne.n 8021d0c <strncpy+0x34>
  2495. 8021d14: bc70 pop {r4, r5, r6}
  2496. 8021d16: 4770 bx lr
  2497. 8021d18: 460e mov r6, r1
  2498. 8021d1a: f851 4b04 ldr.w r4, [r1], #4
  2499. 8021d1e: f1a4 3501 sub.w r5, r4, #16843009 ; 0x1010101
  2500. 8021d22: ea25 0504 bic.w r5, r5, r4
  2501. 8021d26: f015 3f80 tst.w r5, #2155905152 ; 0x80808080
  2502. 8021d2a: d105 bne.n 8021d38 <strncpy+0x60>
  2503. 8021d2c: 3a04 subs r2, #4
  2504. 8021d2e: f843 4b04 str.w r4, [r3], #4
  2505. 8021d32: 2a03 cmp r2, #3
  2506. 8021d34: d8f0 bhi.n 8021d18 <strncpy+0x40>
  2507. 8021d36: e7d6 b.n 8021ce6 <strncpy+0xe>
  2508. 8021d38: 4631 mov r1, r6
  2509. 8021d3a: e7d4 b.n 8021ce6 <strncpy+0xe>
  2510. 08021d3c <strpbrk>:
  2511. 8021d3c: b4f0 push {r4, r5, r6, r7}
  2512. 8021d3e: 7804 ldrb r4, [r0, #0]
  2513. 8021d40: 2c00 cmp r4, #0
  2514. 8021d42: d021 beq.n 8021d88 <strpbrk+0x4c>
  2515. 8021d44: 780f ldrb r7, [r1, #0]
  2516. 8021d46: 4606 mov r6, r0
  2517. 8021d48: 4630 mov r0, r6
  2518. 8021d4a: b1af cbz r7, 8021d78 <strpbrk+0x3c>
  2519. 8021d4c: 42a7 cmp r7, r4
  2520. 8021d4e: d019 beq.n 8021d84 <strpbrk+0x48>
  2521. 8021d50: 1c4b adds r3, r1, #1
  2522. 8021d52: e001 b.n 8021d58 <strpbrk+0x1c>
  2523. 8021d54: 4294 cmp r4, r2
  2524. 8021d56: d009 beq.n 8021d6c <strpbrk+0x30>
  2525. 8021d58: 461d mov r5, r3
  2526. 8021d5a: f813 2b01 ldrb.w r2, [r3], #1
  2527. 8021d5e: 2a00 cmp r2, #0
  2528. 8021d60: d1f8 bne.n 8021d54 <strpbrk+0x18>
  2529. 8021d62: 7844 ldrb r4, [r0, #1]
  2530. 8021d64: 3601 adds r6, #1
  2531. 8021d66: 2c00 cmp r4, #0
  2532. 8021d68: d1ee bne.n 8021d48 <strpbrk+0xc>
  2533. 8021d6a: 782a ldrb r2, [r5, #0]
  2534. 8021d6c: 2a00 cmp r2, #0
  2535. 8021d6e: bf14 ite ne
  2536. 8021d70: 4630 movne r0, r6
  2537. 8021d72: 2000 moveq r0, #0
  2538. 8021d74: bcf0 pop {r4, r5, r6, r7}
  2539. 8021d76: 4770 bx lr
  2540. 8021d78: 7844 ldrb r4, [r0, #1]
  2541. 8021d7a: 460d mov r5, r1
  2542. 8021d7c: 3601 adds r6, #1
  2543. 8021d7e: 2c00 cmp r4, #0
  2544. 8021d80: d1e2 bne.n 8021d48 <strpbrk+0xc>
  2545. 8021d82: e7f2 b.n 8021d6a <strpbrk+0x2e>
  2546. 8021d84: 463a mov r2, r7
  2547. 8021d86: e7f1 b.n 8021d6c <strpbrk+0x30>
  2548. 8021d88: 4620 mov r0, r4
  2549. 8021d8a: e7f3 b.n 8021d74 <strpbrk+0x38>
  2550. 08021d8c <critical_factorization>:
  2551. 8021d8c: e92d 07f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl}
  2552. 8021d90: 2701 movs r7, #1
  2553. 8021d92: 463c mov r4, r7
  2554. 8021d94: 2500 movs r5, #0
  2555. 8021d96: f04f 36ff mov.w r6, #4294967295
  2556. 8021d9a: 1963 adds r3, r4, r5
  2557. 8021d9c: eb00 0c06 add.w ip, r0, r6
  2558. 8021da0: 428b cmp r3, r1
  2559. 8021da2: d20d bcs.n 8021dc0 <critical_factorization+0x34>
  2560. 8021da4: f81c c004 ldrb.w ip, [ip, r4]
  2561. 8021da8: f810 8003 ldrb.w r8, [r0, r3]
  2562. 8021dac: 45e0 cmp r8, ip
  2563. 8021dae: d22e bcs.n 8021e0e <critical_factorization+0x82>
  2564. 8021db0: 2401 movs r4, #1
  2565. 8021db2: 461d mov r5, r3
  2566. 8021db4: 1b9f subs r7, r3, r6
  2567. 8021db6: 1963 adds r3, r4, r5
  2568. 8021db8: 428b cmp r3, r1
  2569. 8021dba: eb00 0c06 add.w ip, r0, r6
  2570. 8021dbe: d3f1 bcc.n 8021da4 <critical_factorization+0x18>
  2571. 8021dc0: f04f 0a01 mov.w sl, #1
  2572. 8021dc4: 2500 movs r5, #0
  2573. 8021dc6: 4654 mov r4, sl
  2574. 8021dc8: f04f 3cff mov.w ip, #4294967295
  2575. 8021dcc: 6017 str r7, [r2, #0]
  2576. 8021dce: 1963 adds r3, r4, r5
  2577. 8021dd0: eb00 080c add.w r8, r0, ip
  2578. 8021dd4: 4299 cmp r1, r3
  2579. 8021dd6: d90e bls.n 8021df6 <critical_factorization+0x6a>
  2580. 8021dd8: f818 8004 ldrb.w r8, [r8, r4]
  2581. 8021ddc: f810 9003 ldrb.w r9, [r0, r3]
  2582. 8021de0: 45c1 cmp r9, r8
  2583. 8021de2: d91a bls.n 8021e1a <critical_factorization+0x8e>
  2584. 8021de4: 2401 movs r4, #1
  2585. 8021de6: 461d mov r5, r3
  2586. 8021de8: ebcc 0a03 rsb sl, ip, r3
  2587. 8021dec: 1963 adds r3, r4, r5
  2588. 8021dee: 4299 cmp r1, r3
  2589. 8021df0: eb00 080c add.w r8, r0, ip
  2590. 8021df4: d8f0 bhi.n 8021dd8 <critical_factorization+0x4c>
  2591. 8021df6: f10c 0001 add.w r0, ip, #1
  2592. 8021dfa: 3601 adds r6, #1
  2593. 8021dfc: 42b0 cmp r0, r6
  2594. 8021dfe: bf3c itt cc
  2595. 8021e00: 46ba movcc sl, r7
  2596. 8021e02: 4630 movcc r0, r6
  2597. 8021e04: f8c2 a000 str.w sl, [r2]
  2598. 8021e08: e8bd 07f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl}
  2599. 8021e0c: 4770 bx lr
  2600. 8021e0e: d00b beq.n 8021e28 <critical_factorization+0x9c>
  2601. 8021e10: 2701 movs r7, #1
  2602. 8021e12: 462e mov r6, r5
  2603. 8021e14: 463c mov r4, r7
  2604. 8021e16: 19ed adds r5, r5, r7
  2605. 8021e18: e7bf b.n 8021d9a <critical_factorization+0xe>
  2606. 8021e1a: d009 beq.n 8021e30 <critical_factorization+0xa4>
  2607. 8021e1c: f04f 0a01 mov.w sl, #1
  2608. 8021e20: 46ac mov ip, r5
  2609. 8021e22: 4654 mov r4, sl
  2610. 8021e24: 4455 add r5, sl
  2611. 8021e26: e7d2 b.n 8021dce <critical_factorization+0x42>
  2612. 8021e28: 42bc cmp r4, r7
  2613. 8021e2a: d005 beq.n 8021e38 <critical_factorization+0xac>
  2614. 8021e2c: 3401 adds r4, #1
  2615. 8021e2e: e7b4 b.n 8021d9a <critical_factorization+0xe>
  2616. 8021e30: 4554 cmp r4, sl
  2617. 8021e32: d005 beq.n 8021e40 <critical_factorization+0xb4>
  2618. 8021e34: 3401 adds r4, #1
  2619. 8021e36: e7ca b.n 8021dce <critical_factorization+0x42>
  2620. 8021e38: 4627 mov r7, r4
  2621. 8021e3a: 461d mov r5, r3
  2622. 8021e3c: 2401 movs r4, #1
  2623. 8021e3e: e7ac b.n 8021d9a <critical_factorization+0xe>
  2624. 8021e40: 46a2 mov sl, r4
  2625. 8021e42: 461d mov r5, r3
  2626. 8021e44: 2401 movs r4, #1
  2627. 8021e46: e7c2 b.n 8021dce <critical_factorization+0x42>
  2628. 08021e48 <two_way_long_needle>:
  2629. 8021e48: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  2630. 8021e4c: f2ad 4d24 subw sp, sp, #1060 ; 0x424
  2631. 8021e50: 4616 mov r6, r2
  2632. 8021e52: 4680 mov r8, r0
  2633. 8021e54: 460c mov r4, r1
  2634. 8021e56: 4610 mov r0, r2
  2635. 8021e58: 4619 mov r1, r3
  2636. 8021e5a: aa07 add r2, sp, #28
  2637. 8021e5c: 461d mov r5, r3
  2638. 8021e5e: f7ff ff95 bl 8021d8c <critical_factorization>
  2639. 8021e62: ab07 add r3, sp, #28
  2640. 8021e64: f20d 421c addw r2, sp, #1052 ; 0x41c
  2641. 8021e68: 9003 str r0, [sp, #12]
  2642. 8021e6a: f843 5f04 str.w r5, [r3, #4]!
  2643. 8021e6e: 4293 cmp r3, r2
  2644. 8021e70: d1fb bne.n 8021e6a <two_way_long_needle+0x22>
  2645. 8021e72: 1e6f subs r7, r5, #1
  2646. 8021e74: 2300 movs r3, #0
  2647. 8021e76: a808 add r0, sp, #32
  2648. 8021e78: b135 cbz r5, 8021e88 <two_way_long_needle+0x40>
  2649. 8021e7a: 5cf2 ldrb r2, [r6, r3]
  2650. 8021e7c: 1af9 subs r1, r7, r3
  2651. 8021e7e: 3301 adds r3, #1
  2652. 8021e80: 42ab cmp r3, r5
  2653. 8021e82: f840 1022 str.w r1, [r0, r2, lsl #2]
  2654. 8021e86: d1f8 bne.n 8021e7a <two_way_long_needle+0x32>
  2655. 8021e88: 9907 ldr r1, [sp, #28]
  2656. 8021e8a: 4630 mov r0, r6
  2657. 8021e8c: 9a03 ldr r2, [sp, #12]
  2658. 8021e8e: 1871 adds r1, r6, r1
  2659. 8021e90: f7ff fba6 bl 80215e0 <memcmp>
  2660. 8021e94: 2800 cmp r0, #0
  2661. 8021e96: d17f bne.n 8021f98 <two_way_long_needle+0x150>
  2662. 8021e98: f8dd c00c ldr.w ip, [sp, #12]
  2663. 8021e9c: 4622 mov r2, r4
  2664. 8021e9e: 4682 mov sl, r0
  2665. 8021ea0: 1e6f subs r7, r5, #1
  2666. 8021ea2: f10c 3cff add.w ip, ip, #4294967295
  2667. 8021ea6: f8cd c008 str.w ip, [sp, #8]
  2668. 8021eaa: 44b4 add ip, r6
  2669. 8021eac: f8cd c014 str.w ip, [sp, #20]
  2670. 8021eb0: f8dd c00c ldr.w ip, [sp, #12]
  2671. 8021eb4: 4604 mov r4, r0
  2672. 8021eb6: 9501 str r5, [sp, #4]
  2673. 8021eb8: f1cc 0c01 rsb ip, ip, #1
  2674. 8021ebc: f8cd c010 str.w ip, [sp, #16]
  2675. 8021ec0: e009 b.n 8021ed6 <two_way_long_needle+0x8e>
  2676. 8021ec2: b134 cbz r4, 8021ed2 <two_way_long_needle+0x8a>
  2677. 8021ec4: 9a07 ldr r2, [sp, #28]
  2678. 8021ec6: 4293 cmp r3, r2
  2679. 8021ec8: bf3e ittt cc
  2680. 8021eca: 4604 movcc r4, r0
  2681. 8021ecc: 9901 ldrcc r1, [sp, #4]
  2682. 8021ece: ebc2 0301 rsbcc r3, r2, r1
  2683. 8021ed2: 449a add sl, r3
  2684. 8021ed4: 462a mov r2, r5
  2685. 8021ed6: 9b01 ldr r3, [sp, #4]
  2686. 8021ed8: eb08 0002 add.w r0, r8, r2
  2687. 8021edc: 2100 movs r1, #0
  2688. 8021ede: eb0a 0503 add.w r5, sl, r3
  2689. 8021ee2: 1aaa subs r2, r5, r2
  2690. 8021ee4: f002 fa90 bl 8024408 <memchr>
  2691. 8021ee8: 2800 cmp r0, #0
  2692. 8021eea: d14f bne.n 8021f8c <two_way_long_needle+0x144>
  2693. 8021eec: 2d00 cmp r5, #0
  2694. 8021eee: d04d beq.n 8021f8c <two_way_long_needle+0x144>
  2695. 8021ef0: eb08 0305 add.w r3, r8, r5
  2696. 8021ef4: a908 add r1, sp, #32
  2697. 8021ef6: f813 3c01 ldrb.w r3, [r3, #-1]
  2698. 8021efa: f851 3023 ldr.w r3, [r1, r3, lsl #2]
  2699. 8021efe: 2b00 cmp r3, #0
  2700. 8021f00: d1df bne.n 8021ec2 <two_way_long_needle+0x7a>
  2701. 8021f02: 9a03 ldr r2, [sp, #12]
  2702. 8021f04: 4294 cmp r4, r2
  2703. 8021f06: bf28 it cs
  2704. 8021f08: 4622 movcs r2, r4
  2705. 8021f0a: 42ba cmp r2, r7
  2706. 8021f0c: d211 bcs.n 8021f32 <two_way_long_needle+0xea>
  2707. 8021f0e: eb08 030a add.w r3, r8, sl
  2708. 8021f12: f816 c002 ldrb.w ip, [r6, r2]
  2709. 8021f16: 18b1 adds r1, r6, r2
  2710. 8021f18: 5c98 ldrb r0, [r3, r2]
  2711. 8021f1a: 4584 cmp ip, r0
  2712. 8021f1c: d006 beq.n 8021f2c <two_way_long_needle+0xe4>
  2713. 8021f1e: e02f b.n 8021f80 <two_way_long_needle+0x138>
  2714. 8021f20: f811 0f01 ldrb.w r0, [r1, #1]!
  2715. 8021f24: f813 c002 ldrb.w ip, [r3, r2]
  2716. 8021f28: 4584 cmp ip, r0
  2717. 8021f2a: d129 bne.n 8021f80 <two_way_long_needle+0x138>
  2718. 8021f2c: 3201 adds r2, #1
  2719. 8021f2e: 42ba cmp r2, r7
  2720. 8021f30: d3f6 bcc.n 8021f20 <two_way_long_needle+0xd8>
  2721. 8021f32: 9b03 ldr r3, [sp, #12]
  2722. 8021f34: 9802 ldr r0, [sp, #8]
  2723. 8021f36: 429c cmp r4, r3
  2724. 8021f38: bf28 it cs
  2725. 8021f3a: 4618 movcs r0, r3
  2726. 8021f3c: d218 bcs.n 8021f70 <two_way_long_needle+0x128>
  2727. 8021f3e: f8dd c008 ldr.w ip, [sp, #8]
  2728. 8021f42: eb08 030a add.w r3, r8, sl
  2729. 8021f46: f816 100c ldrb.w r1, [r6, ip]
  2730. 8021f4a: f813 200c ldrb.w r2, [r3, ip]
  2731. 8021f4e: 4291 cmp r1, r2
  2732. 8021f50: f040 8085 bne.w 802205e <two_way_long_needle+0x216>
  2733. 8021f54: 9a05 ldr r2, [sp, #20]
  2734. 8021f56: eb06 0b04 add.w fp, r6, r4
  2735. 8021f5a: e006 b.n 8021f6a <two_way_long_needle+0x122>
  2736. 8021f5c: f813 c001 ldrb.w ip, [r3, r1]
  2737. 8021f60: f812 9d01 ldrb.w r9, [r2, #-1]!
  2738. 8021f64: 45e1 cmp r9, ip
  2739. 8021f66: d103 bne.n 8021f70 <two_way_long_needle+0x128>
  2740. 8021f68: 4608 mov r0, r1
  2741. 8021f6a: 1e41 subs r1, r0, #1
  2742. 8021f6c: 455a cmp r2, fp
  2743. 8021f6e: d1f5 bne.n 8021f5c <two_way_long_needle+0x114>
  2744. 8021f70: 3401 adds r4, #1
  2745. 8021f72: 4284 cmp r4, r0
  2746. 8021f74: d875 bhi.n 8022062 <two_way_long_needle+0x21a>
  2747. 8021f76: 9c07 ldr r4, [sp, #28]
  2748. 8021f78: 9b01 ldr r3, [sp, #4]
  2749. 8021f7a: 44a2 add sl, r4
  2750. 8021f7c: 1b1c subs r4, r3, r4
  2751. 8021f7e: e7a9 b.n 8021ed4 <two_way_long_needle+0x8c>
  2752. 8021f80: f8dd c010 ldr.w ip, [sp, #16]
  2753. 8021f84: 2400 movs r4, #0
  2754. 8021f86: 44e2 add sl, ip
  2755. 8021f88: 4492 add sl, r2
  2756. 8021f8a: e7a3 b.n 8021ed4 <two_way_long_needle+0x8c>
  2757. 8021f8c: 2000 movs r0, #0
  2758. 8021f8e: b009 add sp, #36 ; 0x24
  2759. 8021f90: f50d 6d80 add.w sp, sp, #1024 ; 0x400
  2760. 8021f94: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  2761. 8021f98: f8dd c00c ldr.w ip, [sp, #12]
  2762. 8021f9c: f04f 0a00 mov.w sl, #0
  2763. 8021fa0: f8dd b00c ldr.w fp, [sp, #12]
  2764. 8021fa4: f10d 0920 add.w r9, sp, #32
  2765. 8021fa8: ebcc 0305 rsb r3, ip, r5
  2766. 8021fac: 1e6f subs r7, r5, #1
  2767. 8021fae: 4563 cmp r3, ip
  2768. 8021fb0: bf38 it cc
  2769. 8021fb2: 4663 movcc r3, ip
  2770. 8021fb4: 4622 mov r2, r4
  2771. 8021fb6: 3301 adds r3, #1
  2772. 8021fb8: 9307 str r3, [sp, #28]
  2773. 8021fba: f10c 33ff add.w r3, ip, #4294967295
  2774. 8021fbe: 9301 str r3, [sp, #4]
  2775. 8021fc0: 9b03 ldr r3, [sp, #12]
  2776. 8021fc2: 44b4 add ip, r6
  2777. 8021fc4: f8cd c008 str.w ip, [sp, #8]
  2778. 8021fc8: f1c3 0301 rsb r3, r3, #1
  2779. 8021fcc: 9304 str r3, [sp, #16]
  2780. 8021fce: eb0a 0405 add.w r4, sl, r5
  2781. 8021fd2: eb08 0002 add.w r0, r8, r2
  2782. 8021fd6: 2100 movs r1, #0
  2783. 8021fd8: 1aa2 subs r2, r4, r2
  2784. 8021fda: f002 fa15 bl 8024408 <memchr>
  2785. 8021fde: 2800 cmp r0, #0
  2786. 8021fe0: d1d4 bne.n 8021f8c <two_way_long_needle+0x144>
  2787. 8021fe2: 2c00 cmp r4, #0
  2788. 8021fe4: d0d2 beq.n 8021f8c <two_way_long_needle+0x144>
  2789. 8021fe6: eb08 0304 add.w r3, r8, r4
  2790. 8021fea: f813 3c01 ldrb.w r3, [r3, #-1]
  2791. 8021fee: f859 3023 ldr.w r3, [r9, r3, lsl #2]
  2792. 8021ff2: bb63 cbnz r3, 802204e <two_way_long_needle+0x206>
  2793. 8021ff4: 45bb cmp fp, r7
  2794. 8021ff6: eb08 000a add.w r0, r8, sl
  2795. 8021ffa: d215 bcs.n 8022028 <two_way_long_needle+0x1e0>
  2796. 8021ffc: f8dd c008 ldr.w ip, [sp, #8]
  2797. 8022000: f810 300b ldrb.w r3, [r0, fp]
  2798. 8022004: f89c 2000 ldrb.w r2, [ip]
  2799. 8022008: 429a cmp r2, r3
  2800. 802200a: bf18 it ne
  2801. 802200c: 465b movne r3, fp
  2802. 802200e: d121 bne.n 8022054 <two_way_long_needle+0x20c>
  2803. 8022010: 9a02 ldr r2, [sp, #8]
  2804. 8022012: 465b mov r3, fp
  2805. 8022014: e005 b.n 8022022 <two_way_long_needle+0x1da>
  2806. 8022016: f812 1f01 ldrb.w r1, [r2, #1]!
  2807. 802201a: f810 c003 ldrb.w ip, [r0, r3]
  2808. 802201e: 458c cmp ip, r1
  2809. 8022020: d118 bne.n 8022054 <two_way_long_needle+0x20c>
  2810. 8022022: 3301 adds r3, #1
  2811. 8022024: 42bb cmp r3, r7
  2812. 8022026: d3f6 bcc.n 8022016 <two_way_long_needle+0x1ce>
  2813. 8022028: 9b01 ldr r3, [sp, #4]
  2814. 802202a: 1c5a adds r2, r3, #1
  2815. 802202c: d0af beq.n 8021f8e <two_way_long_needle+0x146>
  2816. 802202e: f8dd c004 ldr.w ip, [sp, #4]
  2817. 8022032: f816 100c ldrb.w r1, [r6, ip]
  2818. 8022036: f810 200c ldrb.w r2, [r0, ip]
  2819. 802203a: 4291 cmp r1, r2
  2820. 802203c: d106 bne.n 802204c <two_way_long_needle+0x204>
  2821. 802203e: f113 33ff adds.w r3, r3, #4294967295
  2822. 8022042: d3a4 bcc.n 8021f8e <two_way_long_needle+0x146>
  2823. 8022044: 5cf1 ldrb r1, [r6, r3]
  2824. 8022046: 5cc2 ldrb r2, [r0, r3]
  2825. 8022048: 4291 cmp r1, r2
  2826. 802204a: d0f8 beq.n 802203e <two_way_long_needle+0x1f6>
  2827. 802204c: 9b07 ldr r3, [sp, #28]
  2828. 802204e: 449a add sl, r3
  2829. 8022050: 4622 mov r2, r4
  2830. 8022052: e7bc b.n 8021fce <two_way_long_needle+0x186>
  2831. 8022054: f8dd c010 ldr.w ip, [sp, #16]
  2832. 8022058: 44e2 add sl, ip
  2833. 802205a: 449a add sl, r3
  2834. 802205c: e7f8 b.n 8022050 <two_way_long_needle+0x208>
  2835. 802205e: 9803 ldr r0, [sp, #12]
  2836. 8022060: e786 b.n 8021f70 <two_way_long_needle+0x128>
  2837. 8022062: eb08 000a add.w r0, r8, sl
  2838. 8022066: e792 b.n 8021f8e <two_way_long_needle+0x146>
  2839. 08022068 <strstr>:
  2840. 8022068: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  2841. 802206c: 4680 mov r8, r0
  2842. 802206e: 7803 ldrb r3, [r0, #0]
  2843. 8022070: b087 sub sp, #28
  2844. 8022072: 460e mov r6, r1
  2845. 8022074: 2b00 cmp r3, #0
  2846. 8022076: f000 80f7 beq.w 8022268 <strstr+0x200>
  2847. 802207a: 780a ldrb r2, [r1, #0]
  2848. 802207c: b19a cbz r2, 80220a6 <strstr+0x3e>
  2849. 802207e: 4684 mov ip, r0
  2850. 8022080: 3101 adds r1, #1
  2851. 8022082: 2701 movs r7, #1
  2852. 8022084: e002 b.n 802208c <strstr+0x24>
  2853. 8022086: f811 2b01 ldrb.w r2, [r1], #1
  2854. 802208a: b15a cbz r2, 80220a4 <strstr+0x3c>
  2855. 802208c: 4293 cmp r3, r2
  2856. 802208e: bf14 ite ne
  2857. 8022090: 2700 movne r7, #0
  2858. 8022092: f007 0701 andeq.w r7, r7, #1
  2859. 8022096: f81c 3f01 ldrb.w r3, [ip, #1]!
  2860. 802209a: 460d mov r5, r1
  2861. 802209c: 2b00 cmp r3, #0
  2862. 802209e: d1f2 bne.n 8022086 <strstr+0x1e>
  2863. 80220a0: 782b ldrb r3, [r5, #0]
  2864. 80220a2: bb03 cbnz r3, 80220e6 <strstr+0x7e>
  2865. 80220a4: b11f cbz r7, 80220ae <strstr+0x46>
  2866. 80220a6: 4640 mov r0, r8
  2867. 80220a8: b007 add sp, #28
  2868. 80220aa: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  2869. 80220ae: f108 0001 add.w r0, r8, #1
  2870. 80220b2: 7831 ldrb r1, [r6, #0]
  2871. 80220b4: f002 fe92 bl 8024ddc <strchr>
  2872. 80220b8: 1bad subs r5, r5, r6
  2873. 80220ba: 2d01 cmp r5, #1
  2874. 80220bc: bf18 it ne
  2875. 80220be: 2800 cmpne r0, #0
  2876. 80220c0: 4607 mov r7, r0
  2877. 80220c2: bf08 it eq
  2878. 80220c4: 4680 moveq r8, r0
  2879. 80220c6: d0ee beq.n 80220a6 <strstr+0x3e>
  2880. 80220c8: 44a8 add r8, r5
  2881. 80220ca: 4540 cmp r0, r8
  2882. 80220cc: bf94 ite ls
  2883. 80220ce: ebc0 0408 rsbls r4, r0, r8
  2884. 80220d2: 2401 movhi r4, #1
  2885. 80220d4: 2d1f cmp r5, #31
  2886. 80220d6: d909 bls.n 80220ec <strstr+0x84>
  2887. 80220d8: 4621 mov r1, r4
  2888. 80220da: 4632 mov r2, r6
  2889. 80220dc: 462b mov r3, r5
  2890. 80220de: f7ff feb3 bl 8021e48 <two_way_long_needle>
  2891. 80220e2: 4680 mov r8, r0
  2892. 80220e4: e7df b.n 80220a6 <strstr+0x3e>
  2893. 80220e6: f04f 0800 mov.w r8, #0
  2894. 80220ea: e7dc b.n 80220a6 <strstr+0x3e>
  2895. 80220ec: 4629 mov r1, r5
  2896. 80220ee: aa05 add r2, sp, #20
  2897. 80220f0: 4630 mov r0, r6
  2898. 80220f2: f7ff fe4b bl 8021d8c <critical_factorization>
  2899. 80220f6: 9905 ldr r1, [sp, #20]
  2900. 80220f8: 1871 adds r1, r6, r1
  2901. 80220fa: 9001 str r0, [sp, #4]
  2902. 80220fc: 4630 mov r0, r6
  2903. 80220fe: 9a01 ldr r2, [sp, #4]
  2904. 8022100: f7ff fa6e bl 80215e0 <memcmp>
  2905. 8022104: 2800 cmp r0, #0
  2906. 8022106: d152 bne.n 80221ae <strstr+0x146>
  2907. 8022108: 9b01 ldr r3, [sp, #4]
  2908. 802210a: 4683 mov fp, r0
  2909. 802210c: 4680 mov r8, r0
  2910. 802210e: 3b01 subs r3, #1
  2911. 8022110: 9300 str r3, [sp, #0]
  2912. 8022112: 18f3 adds r3, r6, r3
  2913. 8022114: 9303 str r3, [sp, #12]
  2914. 8022116: 9b01 ldr r3, [sp, #4]
  2915. 8022118: f1c3 0301 rsb r3, r3, #1
  2916. 802211c: 9302 str r3, [sp, #8]
  2917. 802211e: 4622 mov r2, r4
  2918. 8022120: eb08 0405 add.w r4, r8, r5
  2919. 8022124: 18b8 adds r0, r7, r2
  2920. 8022126: 2100 movs r1, #0
  2921. 8022128: 1aa2 subs r2, r4, r2
  2922. 802212a: f002 f96d bl 8024408 <memchr>
  2923. 802212e: 2800 cmp r0, #0
  2924. 8022130: d1d9 bne.n 80220e6 <strstr+0x7e>
  2925. 8022132: 2c00 cmp r4, #0
  2926. 8022134: d0d7 beq.n 80220e6 <strstr+0x7e>
  2927. 8022136: 9b01 ldr r3, [sp, #4]
  2928. 8022138: 459b cmp fp, r3
  2929. 802213a: bf28 it cs
  2930. 802213c: 465b movcs r3, fp
  2931. 802213e: 429d cmp r5, r3
  2932. 8022140: d913 bls.n 802216a <strstr+0x102>
  2933. 8022142: 18f9 adds r1, r7, r3
  2934. 8022144: 5cf0 ldrb r0, [r6, r3]
  2935. 8022146: 18f2 adds r2, r6, r3
  2936. 8022148: f811 1008 ldrb.w r1, [r1, r8]
  2937. 802214c: 4288 cmp r0, r1
  2938. 802214e: f040 8085 bne.w 802225c <strstr+0x1f4>
  2939. 8022152: eb07 0c08 add.w ip, r7, r8
  2940. 8022156: e005 b.n 8022164 <strstr+0xfc>
  2941. 8022158: f812 1f01 ldrb.w r1, [r2, #1]!
  2942. 802215c: f81c 0003 ldrb.w r0, [ip, r3]
  2943. 8022160: 4288 cmp r0, r1
  2944. 8022162: d17b bne.n 802225c <strstr+0x1f4>
  2945. 8022164: 3301 adds r3, #1
  2946. 8022166: 429d cmp r5, r3
  2947. 8022168: d8f6 bhi.n 8022158 <strstr+0xf0>
  2948. 802216a: e89d 000a ldmia.w sp, {r1, r3}
  2949. 802216e: 455b cmp r3, fp
  2950. 8022170: d97d bls.n 802226e <strstr+0x206>
  2951. 8022172: eb07 0908 add.w r9, r7, r8
  2952. 8022176: 5c72 ldrb r2, [r6, r1]
  2953. 8022178: f819 3001 ldrb.w r3, [r9, r1]
  2954. 802217c: 429a cmp r2, r3
  2955. 802217e: d176 bne.n 802226e <strstr+0x206>
  2956. 8022180: 9b03 ldr r3, [sp, #12]
  2957. 8022182: eb06 0a0b add.w sl, r6, fp
  2958. 8022186: e006 b.n 8022196 <strstr+0x12e>
  2959. 8022188: f819 0002 ldrb.w r0, [r9, r2]
  2960. 802218c: f813 cd01 ldrb.w ip, [r3, #-1]!
  2961. 8022190: 4584 cmp ip, r0
  2962. 8022192: d103 bne.n 802219c <strstr+0x134>
  2963. 8022194: 4611 mov r1, r2
  2964. 8022196: 1e4a subs r2, r1, #1
  2965. 8022198: 4553 cmp r3, sl
  2966. 802219a: d1f5 bne.n 8022188 <strstr+0x120>
  2967. 802219c: f10b 0b01 add.w fp, fp, #1
  2968. 80221a0: 458b cmp fp, r1
  2969. 80221a2: d866 bhi.n 8022272 <strstr+0x20a>
  2970. 80221a4: 9b05 ldr r3, [sp, #20]
  2971. 80221a6: 4498 add r8, r3
  2972. 80221a8: ebc3 0b05 rsb fp, r3, r5
  2973. 80221ac: e7b7 b.n 802211e <strstr+0xb6>
  2974. 80221ae: 9801 ldr r0, [sp, #4]
  2975. 80221b0: f04f 0b00 mov.w fp, #0
  2976. 80221b4: 4622 mov r2, r4
  2977. 80221b6: 1a2b subs r3, r5, r0
  2978. 80221b8: eb06 0900 add.w r9, r6, r0
  2979. 80221bc: f100 38ff add.w r8, r0, #4294967295
  2980. 80221c0: 4682 mov sl, r0
  2981. 80221c2: 4283 cmp r3, r0
  2982. 80221c4: bf38 it cc
  2983. 80221c6: 4603 movcc r3, r0
  2984. 80221c8: 1839 adds r1, r7, r0
  2985. 80221ca: 3301 adds r3, #1
  2986. 80221cc: 9100 str r1, [sp, #0]
  2987. 80221ce: 9305 str r3, [sp, #20]
  2988. 80221d0: f1c0 0301 rsb r3, r0, #1
  2989. 80221d4: 9302 str r3, [sp, #8]
  2990. 80221d6: eb0b 0405 add.w r4, fp, r5
  2991. 80221da: 18b8 adds r0, r7, r2
  2992. 80221dc: 2100 movs r1, #0
  2993. 80221de: 1aa2 subs r2, r4, r2
  2994. 80221e0: f002 f912 bl 8024408 <memchr>
  2995. 80221e4: 2800 cmp r0, #0
  2996. 80221e6: f47f af7e bne.w 80220e6 <strstr+0x7e>
  2997. 80221ea: 2c00 cmp r4, #0
  2998. 80221ec: f43f af7b beq.w 80220e6 <strstr+0x7e>
  2999. 80221f0: 4555 cmp r5, sl
  3000. 80221f2: bf98 it ls
  3001. 80221f4: eb07 000b addls.w r0, r7, fp
  3002. 80221f8: d914 bls.n 8022224 <strstr+0x1bc>
  3003. 80221fa: 9800 ldr r0, [sp, #0]
  3004. 80221fc: f899 2000 ldrb.w r2, [r9]
  3005. 8022200: f810 300b ldrb.w r3, [r0, fp]
  3006. 8022204: 429a cmp r2, r3
  3007. 8022206: d124 bne.n 8022252 <strstr+0x1ea>
  3008. 8022208: 464a mov r2, r9
  3009. 802220a: 4653 mov r3, sl
  3010. 802220c: eb07 000b add.w r0, r7, fp
  3011. 8022210: e005 b.n 802221e <strstr+0x1b6>
  3012. 8022212: f812 1f01 ldrb.w r1, [r2, #1]!
  3013. 8022216: f810 c003 ldrb.w ip, [r0, r3]
  3014. 802221a: 458c cmp ip, r1
  3015. 802221c: d11a bne.n 8022254 <strstr+0x1ec>
  3016. 802221e: 3301 adds r3, #1
  3017. 8022220: 429d cmp r5, r3
  3018. 8022222: d8f6 bhi.n 8022212 <strstr+0x1aa>
  3019. 8022224: f1b8 3fff cmp.w r8, #4294967295
  3020. 8022228: 4643 mov r3, r8
  3021. 802222a: f43f af5a beq.w 80220e2 <strstr+0x7a>
  3022. 802222e: f816 1008 ldrb.w r1, [r6, r8]
  3023. 8022232: f810 2008 ldrb.w r2, [r0, r8]
  3024. 8022236: 4291 cmp r1, r2
  3025. 8022238: d107 bne.n 802224a <strstr+0x1e2>
  3026. 802223a: f113 33ff adds.w r3, r3, #4294967295
  3027. 802223e: f4ff af50 bcc.w 80220e2 <strstr+0x7a>
  3028. 8022242: 5cf1 ldrb r1, [r6, r3]
  3029. 8022244: 5cc2 ldrb r2, [r0, r3]
  3030. 8022246: 4291 cmp r1, r2
  3031. 8022248: d0f7 beq.n 802223a <strstr+0x1d2>
  3032. 802224a: 9b05 ldr r3, [sp, #20]
  3033. 802224c: 449b add fp, r3
  3034. 802224e: 4622 mov r2, r4
  3035. 8022250: e7c1 b.n 80221d6 <strstr+0x16e>
  3036. 8022252: 4653 mov r3, sl
  3037. 8022254: 9a02 ldr r2, [sp, #8]
  3038. 8022256: 4493 add fp, r2
  3039. 8022258: 449b add fp, r3
  3040. 802225a: e7f8 b.n 802224e <strstr+0x1e6>
  3041. 802225c: 9902 ldr r1, [sp, #8]
  3042. 802225e: f04f 0b00 mov.w fp, #0
  3043. 8022262: 4488 add r8, r1
  3044. 8022264: 4498 add r8, r3
  3045. 8022266: e75a b.n 802211e <strstr+0xb6>
  3046. 8022268: 460d mov r5, r1
  3047. 802226a: 2701 movs r7, #1
  3048. 802226c: e718 b.n 80220a0 <strstr+0x38>
  3049. 802226e: 9901 ldr r1, [sp, #4]
  3050. 8022270: e794 b.n 802219c <strstr+0x134>
  3051. 8022272: 44b8 add r8, r7
  3052. 8022274: e717 b.n 80220a6 <strstr+0x3e>
  3053. 8022276: bf00 nop
  3054. 08022278 <_strtod_r>:
  3055. 8022278: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  3056. 802227c: b09d sub sp, #116 ; 0x74
  3057. 802227e: 468c mov ip, r1
  3058. 8022280: 4683 mov fp, r0
  3059. 8022282: 9210 str r2, [sp, #64] ; 0x40
  3060. 8022284: 4662 mov r2, ip
  3061. 8022286: 2000 movs r0, #0
  3062. 8022288: 2100 movs r1, #0
  3063. 802228a: f8cd c05c str.w ip, [sp, #92] ; 0x5c
  3064. 802228e: e9cd 0106 strd r0, r1, [sp, #24]
  3065. 8022292: 4611 mov r1, r2
  3066. 8022294: f812 3b01 ldrb.w r3, [r2], #1
  3067. 8022298: 2b2d cmp r3, #45 ; 0x2d
  3068. 802229a: f200 8147 bhi.w 802252c <_strtod_r+0x2b4>
  3069. 802229e: e8df f013 tbh [pc, r3, lsl #1]
  3070. 80222a2: 0131 .short 0x0131
  3071. 80222a4: 01450145 .word 0x01450145
  3072. 80222a8: 01450145 .word 0x01450145
  3073. 80222ac: 01450145 .word 0x01450145
  3074. 80222b0: 01450145 .word 0x01450145
  3075. 80222b4: 01640164 .word 0x01640164
  3076. 80222b8: 01640164 .word 0x01640164
  3077. 80222bc: 01450164 .word 0x01450164
  3078. 80222c0: 01450145 .word 0x01450145
  3079. 80222c4: 01450145 .word 0x01450145
  3080. 80222c8: 01450145 .word 0x01450145
  3081. 80222cc: 01450145 .word 0x01450145
  3082. 80222d0: 01450145 .word 0x01450145
  3083. 80222d4: 01450145 .word 0x01450145
  3084. 80222d8: 01450145 .word 0x01450145
  3085. 80222dc: 01450145 .word 0x01450145
  3086. 80222e0: 01640145 .word 0x01640145
  3087. 80222e4: 01450145 .word 0x01450145
  3088. 80222e8: 01450145 .word 0x01450145
  3089. 80222ec: 01450145 .word 0x01450145
  3090. 80222f0: 01450145 .word 0x01450145
  3091. 80222f4: 01450145 .word 0x01450145
  3092. 80222f8: 0145012e .word 0x0145012e
  3093. 80222fc: 002e .short 0x002e
  3094. 80222fe: 2501 movs r5, #1
  3095. 8022300: 9512 str r5, [sp, #72] ; 0x48
  3096. 8022302: 1c4e adds r6, r1, #1
  3097. 8022304: 9617 str r6, [sp, #92] ; 0x5c
  3098. 8022306: 784b ldrb r3, [r1, #1]
  3099. 8022308: 4699 mov r9, r3
  3100. 802230a: 469a mov sl, r3
  3101. 802230c: 2b00 cmp r3, #0
  3102. 802230e: f000 80fc beq.w 802250a <_strtod_r+0x292>
  3103. 8022312: 2b30 cmp r3, #48 ; 0x30
  3104. 8022314: bf18 it ne
  3105. 8022316: f04f 0900 movne.w r9, #0
  3106. 802231a: f000 8110 beq.w 802253e <_strtod_r+0x2c6>
  3107. 802231e: 2b2f cmp r3, #47 ; 0x2f
  3108. 8022320: 461d mov r5, r3
  3109. 8022322: f04f 0a00 mov.w sl, #0
  3110. 8022326: f340 84f9 ble.w 8022d1c <_strtod_r+0xaa4>
  3111. 802232a: 2b39 cmp r3, #57 ; 0x39
  3112. 802232c: f300 84f6 bgt.w 8022d1c <_strtod_r+0xaa4>
  3113. 8022330: 1c72 adds r2, r6, #1
  3114. 8022332: 4657 mov r7, sl
  3115. 8022334: 4654 mov r4, sl
  3116. 8022336: e001 b.n 802233c <_strtod_r+0xc4>
  3117. 8022338: 2b39 cmp r3, #57 ; 0x39
  3118. 802233a: dc18 bgt.n 802236e <_strtod_r+0xf6>
  3119. 802233c: eb07 0187 add.w r1, r7, r7, lsl #2
  3120. 8022340: 2c08 cmp r4, #8
  3121. 8022342: eb03 0141 add.w r1, r3, r1, lsl #1
  3122. 8022346: bfd8 it le
  3123. 8022348: f1a1 0730 suble.w r7, r1, #48 ; 0x30
  3124. 802234c: dd07 ble.n 802235e <_strtod_r+0xe6>
  3125. 802234e: eb0a 018a add.w r1, sl, sl, lsl #2
  3126. 8022352: 2c0f cmp r4, #15
  3127. 8022354: eb03 0341 add.w r3, r3, r1, lsl #1
  3128. 8022358: bfd8 it le
  3129. 802235a: f1a3 0a30 suble.w sl, r3, #48 ; 0x30
  3130. 802235e: 9217 str r2, [sp, #92] ; 0x5c
  3131. 8022360: 4690 mov r8, r2
  3132. 8022362: f812 3b01 ldrb.w r3, [r2], #1
  3133. 8022366: 3401 adds r4, #1
  3134. 8022368: 2b2f cmp r3, #47 ; 0x2f
  3135. 802236a: 461d mov r5, r3
  3136. 802236c: dce4 bgt.n 8022338 <_strtod_r+0xc0>
  3137. 802236e: 4658 mov r0, fp
  3138. 8022370: f8cd c010 str.w ip, [sp, #16]
  3139. 8022374: f001 fd5a bl 8023e2c <_localeconv_r>
  3140. 8022378: 6801 ldr r1, [r0, #0]
  3141. 802237a: 4658 mov r0, fp
  3142. 802237c: 9105 str r1, [sp, #20]
  3143. 802237e: f001 fd55 bl 8023e2c <_localeconv_r>
  3144. 8022382: 6800 ldr r0, [r0, #0]
  3145. 8022384: f7ff fbf0 bl 8021b68 <strlen>
  3146. 8022388: 9905 ldr r1, [sp, #20]
  3147. 802238a: 4602 mov r2, r0
  3148. 802238c: 4640 mov r0, r8
  3149. 802238e: f7ff fc4d bl 8021c2c <strncmp>
  3150. 8022392: f8dd c010 ldr.w ip, [sp, #16]
  3151. 8022396: 4680 mov r8, r0
  3152. 8022398: 2800 cmp r0, #0
  3153. 802239a: f000 8142 beq.w 8022622 <_strtod_r+0x3aa>
  3154. 802239e: 2000 movs r0, #0
  3155. 80223a0: 46a0 mov r8, r4
  3156. 80223a2: 4601 mov r1, r0
  3157. 80223a4: 9009 str r0, [sp, #36] ; 0x24
  3158. 80223a6: f025 0320 bic.w r3, r5, #32
  3159. 80223aa: 2b45 cmp r3, #69 ; 0x45
  3160. 80223ac: f040 80df bne.w 802256e <_strtod_r+0x2f6>
  3161. 80223b0: ea48 0300 orr.w r3, r8, r0
  3162. 80223b4: ea53 0309 orrs.w r3, r3, r9
  3163. 80223b8: f000 811d beq.w 80225f6 <_strtod_r+0x37e>
  3164. 80223bc: f8dd c05c ldr.w ip, [sp, #92] ; 0x5c
  3165. 80223c0: f10c 0301 add.w r3, ip, #1
  3166. 80223c4: 9317 str r3, [sp, #92] ; 0x5c
  3167. 80223c6: f89c 5001 ldrb.w r5, [ip, #1]
  3168. 80223ca: 2d2b cmp r5, #43 ; 0x2b
  3169. 80223cc: f000 84ab beq.w 8022d26 <_strtod_r+0xaae>
  3170. 80223d0: 2d2d cmp r5, #45 ; 0x2d
  3171. 80223d2: f000 833d beq.w 8022a50 <_strtod_r+0x7d8>
  3172. 80223d6: 2200 movs r2, #0
  3173. 80223d8: 920a str r2, [sp, #40] ; 0x28
  3174. 80223da: f1a5 0330 sub.w r3, r5, #48 ; 0x30
  3175. 80223de: 2b09 cmp r3, #9
  3176. 80223e0: f200 842c bhi.w 8022c3c <_strtod_r+0x9c4>
  3177. 80223e4: 2d30 cmp r5, #48 ; 0x30
  3178. 80223e6: d106 bne.n 80223f6 <_strtod_r+0x17e>
  3179. 80223e8: 9b17 ldr r3, [sp, #92] ; 0x5c
  3180. 80223ea: 3301 adds r3, #1
  3181. 80223ec: 9317 str r3, [sp, #92] ; 0x5c
  3182. 80223ee: f813 5b01 ldrb.w r5, [r3], #1
  3183. 80223f2: 2d30 cmp r5, #48 ; 0x30
  3184. 80223f4: d0fa beq.n 80223ec <_strtod_r+0x174>
  3185. 80223f6: f1a5 0331 sub.w r3, r5, #49 ; 0x31
  3186. 80223fa: 2b08 cmp r3, #8
  3187. 80223fc: f200 80b7 bhi.w 802256e <_strtod_r+0x2f6>
  3188. 8022400: 9a17 ldr r2, [sp, #92] ; 0x5c
  3189. 8022402: 3d30 subs r5, #48 ; 0x30
  3190. 8022404: 950d str r5, [sp, #52] ; 0x34
  3191. 8022406: 1c53 adds r3, r2, #1
  3192. 8022408: 9317 str r3, [sp, #92] ; 0x5c
  3193. 802240a: 7855 ldrb r5, [r2, #1]
  3194. 802240c: 920b str r2, [sp, #44] ; 0x2c
  3195. 802240e: 2d2f cmp r5, #47 ; 0x2f
  3196. 8022410: dd16 ble.n 8022440 <_strtod_r+0x1c8>
  3197. 8022412: 2d39 cmp r5, #57 ; 0x39
  3198. 8022414: dc14 bgt.n 8022440 <_strtod_r+0x1c8>
  3199. 8022416: 1c93 adds r3, r2, #2
  3200. 8022418: 910c str r1, [sp, #48] ; 0x30
  3201. 802241a: 9a0d ldr r2, [sp, #52] ; 0x34
  3202. 802241c: e001 b.n 8022422 <_strtod_r+0x1aa>
  3203. 802241e: 2d39 cmp r5, #57 ; 0x39
  3204. 8022420: dc0b bgt.n 802243a <_strtod_r+0x1c2>
  3205. 8022422: 9317 str r3, [sp, #92] ; 0x5c
  3206. 8022424: 4619 mov r1, r3
  3207. 8022426: eb02 0282 add.w r2, r2, r2, lsl #2
  3208. 802242a: 3301 adds r3, #1
  3209. 802242c: eb05 0242 add.w r2, r5, r2, lsl #1
  3210. 8022430: f813 5c01 ldrb.w r5, [r3, #-1]
  3211. 8022434: 3a30 subs r2, #48 ; 0x30
  3212. 8022436: 2d2f cmp r5, #47 ; 0x2f
  3213. 8022438: dcf1 bgt.n 802241e <_strtod_r+0x1a6>
  3214. 802243a: 460b mov r3, r1
  3215. 802243c: 990c ldr r1, [sp, #48] ; 0x30
  3216. 802243e: 920d str r2, [sp, #52] ; 0x34
  3217. 8022440: 9a0b ldr r2, [sp, #44] ; 0x2c
  3218. 8022442: 1a9b subs r3, r3, r2
  3219. 8022444: 2b08 cmp r3, #8
  3220. 8022446: bfc8 it gt
  3221. 8022448: f644 621f movwgt r2, #19999 ; 0x4e1f
  3222. 802244c: dc05 bgt.n 802245a <_strtod_r+0x1e2>
  3223. 802244e: 9a0d ldr r2, [sp, #52] ; 0x34
  3224. 8022450: f644 631f movw r3, #19999 ; 0x4e1f
  3225. 8022454: 429a cmp r2, r3
  3226. 8022456: bfa8 it ge
  3227. 8022458: 461a movge r2, r3
  3228. 802245a: 9b0a ldr r3, [sp, #40] ; 0x28
  3229. 802245c: b103 cbz r3, 8022460 <_strtod_r+0x1e8>
  3230. 802245e: 4252 negs r2, r2
  3231. 8022460: f1b8 0f00 cmp.w r8, #0
  3232. 8022464: f000 8088 beq.w 8022578 <_strtod_r+0x300>
  3233. 8022468: 9d09 ldr r5, [sp, #36] ; 0x24
  3234. 802246a: 4638 mov r0, r7
  3235. 802246c: 2c00 cmp r4, #0
  3236. 802246e: bf08 it eq
  3237. 8022470: 4644 moveq r4, r8
  3238. 8022472: 940a str r4, [sp, #40] ; 0x28
  3239. 8022474: 1b52 subs r2, r2, r5
  3240. 8022476: 9209 str r2, [sp, #36] ; 0x24
  3241. 8022478: f7fe f82c bl 80204d4 <__aeabi_ui2d>
  3242. 802247c: f1b8 0f10 cmp.w r8, #16
  3243. 8022480: bfb4 ite lt
  3244. 8022482: 46c1 movlt r9, r8
  3245. 8022484: f04f 0910 movge.w r9, #16
  3246. 8022488: f1b9 0f09 cmp.w r9, #9
  3247. 802248c: 4602 mov r2, r0
  3248. 802248e: 460b mov r3, r1
  3249. 8022490: e9cd 2306 strd r2, r3, [sp, #24]
  3250. 8022494: dd16 ble.n 80224c4 <_strtod_r+0x24c>
  3251. 8022496: f643 4310 movw r3, #15376 ; 0x3c10
  3252. 802249a: f6c0 0303 movt r3, #2051 ; 0x803
  3253. 802249e: eb03 03c9 add.w r3, r3, r9, lsl #3
  3254. 80224a2: e953 2312 ldrd r2, r3, [r3, #-72] ; 0x48
  3255. 80224a6: f7fe f88b bl 80205c0 <__aeabi_dmul>
  3256. 80224aa: 4604 mov r4, r0
  3257. 80224ac: 4650 mov r0, sl
  3258. 80224ae: 460d mov r5, r1
  3259. 80224b0: f7fe f810 bl 80204d4 <__aeabi_ui2d>
  3260. 80224b4: 4602 mov r2, r0
  3261. 80224b6: 460b mov r3, r1
  3262. 80224b8: 4620 mov r0, r4
  3263. 80224ba: 4629 mov r1, r5
  3264. 80224bc: f7fd fece bl 802025c <__adddf3>
  3265. 80224c0: e9cd 0106 strd r0, r1, [sp, #24]
  3266. 80224c4: f1b8 0f0f cmp.w r8, #15
  3267. 80224c8: f300 80f2 bgt.w 80226b0 <_strtod_r+0x438>
  3268. 80224cc: 9c09 ldr r4, [sp, #36] ; 0x24
  3269. 80224ce: 2c00 cmp r4, #0
  3270. 80224d0: f000 80a2 beq.w 8022618 <_strtod_r+0x3a0>
  3271. 80224d4: f340 8591 ble.w 8022ffa <_strtod_r+0xd82>
  3272. 80224d8: 9d09 ldr r5, [sp, #36] ; 0x24
  3273. 80224da: 2d16 cmp r5, #22
  3274. 80224dc: f300 8545 bgt.w 8022f6a <_strtod_r+0xcf2>
  3275. 80224e0: f643 4110 movw r1, #15376 ; 0x3c10
  3276. 80224e4: e9dd 2306 ldrd r2, r3, [sp, #24]
  3277. 80224e8: f6c0 0103 movt r1, #2051 ; 0x803
  3278. 80224ec: eb01 01c5 add.w r1, r1, r5, lsl #3
  3279. 80224f0: e9d1 0100 ldrd r0, r1, [r1]
  3280. 80224f4: f7fe f864 bl 80205c0 <__aeabi_dmul>
  3281. 80224f8: 4681 mov r9, r0
  3282. 80224fa: 468a mov sl, r1
  3283. 80224fc: e009 b.n 8022512 <_strtod_r+0x29a>
  3284. 80224fe: 2400 movs r4, #0
  3285. 8022500: 9412 str r4, [sp, #72] ; 0x48
  3286. 8022502: e6fe b.n 8022302 <_strtod_r+0x8a>
  3287. 8022504: f04f 0900 mov.w r9, #0
  3288. 8022508: 46ca mov sl, r9
  3289. 802250a: 2400 movs r4, #0
  3290. 802250c: f8cd c05c str.w ip, [sp, #92] ; 0x5c
  3291. 8022510: 9412 str r4, [sp, #72] ; 0x48
  3292. 8022512: 9c10 ldr r4, [sp, #64] ; 0x40
  3293. 8022514: b10c cbz r4, 802251a <_strtod_r+0x2a2>
  3294. 8022516: 9b17 ldr r3, [sp, #92] ; 0x5c
  3295. 8022518: 6023 str r3, [r4, #0]
  3296. 802251a: 9d12 ldr r5, [sp, #72] ; 0x48
  3297. 802251c: b10d cbz r5, 8022522 <_strtod_r+0x2aa>
  3298. 802251e: f10a 4a00 add.w sl, sl, #2147483648 ; 0x80000000
  3299. 8022522: 4648 mov r0, r9
  3300. 8022524: 4651 mov r1, sl
  3301. 8022526: b01d add sp, #116 ; 0x74
  3302. 8022528: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  3303. 802252c: 2500 movs r5, #0
  3304. 802252e: 2b30 cmp r3, #48 ; 0x30
  3305. 8022530: 460e mov r6, r1
  3306. 8022532: 9512 str r5, [sp, #72] ; 0x48
  3307. 8022534: bf18 it ne
  3308. 8022536: f04f 0900 movne.w r9, #0
  3309. 802253a: f47f aef0 bne.w 802231e <_strtod_r+0xa6>
  3310. 802253e: 7873 ldrb r3, [r6, #1]
  3311. 8022540: 2b58 cmp r3, #88 ; 0x58
  3312. 8022542: f000 8383 beq.w 8022c4c <_strtod_r+0x9d4>
  3313. 8022546: 1c72 adds r2, r6, #1
  3314. 8022548: 2b78 cmp r3, #120 ; 0x78
  3315. 802254a: f000 837f beq.w 8022c4c <_strtod_r+0x9d4>
  3316. 802254e: 4616 mov r6, r2
  3317. 8022550: 9217 str r2, [sp, #92] ; 0x5c
  3318. 8022552: f812 3b01 ldrb.w r3, [r2], #1
  3319. 8022556: 2b30 cmp r3, #48 ; 0x30
  3320. 8022558: d0f9 beq.n 802254e <_strtod_r+0x2d6>
  3321. 802255a: f04f 0901 mov.w r9, #1
  3322. 802255e: 2b00 cmp r3, #0
  3323. 8022560: f47f aedd bne.w 802231e <_strtod_r+0xa6>
  3324. 8022564: 4699 mov r9, r3
  3325. 8022566: 469a mov sl, r3
  3326. 8022568: e7d3 b.n 8022512 <_strtod_r+0x29a>
  3327. 802256a: 9217 str r2, [sp, #92] ; 0x5c
  3328. 802256c: e691 b.n 8022292 <_strtod_r+0x1a>
  3329. 802256e: 2200 movs r2, #0
  3330. 8022570: f1b8 0f00 cmp.w r8, #0
  3331. 8022574: f47f af78 bne.w 8022468 <_strtod_r+0x1f0>
  3332. 8022578: ea50 0009 orrs.w r0, r0, r9
  3333. 802257c: d14c bne.n 8022618 <_strtod_r+0x3a0>
  3334. 802257e: 2900 cmp r1, #0
  3335. 8022580: d139 bne.n 80225f6 <_strtod_r+0x37e>
  3336. 8022582: 3d49 subs r5, #73 ; 0x49
  3337. 8022584: 2d25 cmp r5, #37 ; 0x25
  3338. 8022586: d836 bhi.n 80225f6 <_strtod_r+0x37e>
  3339. 8022588: e8df f015 tbh [pc, r5, lsl #1]
  3340. 802258c: 0035026a .word 0x0035026a
  3341. 8022590: 00350035 .word 0x00350035
  3342. 8022594: 00260035 .word 0x00260035
  3343. 8022598: 00350035 .word 0x00350035
  3344. 802259c: 00350035 .word 0x00350035
  3345. 80225a0: 00350035 .word 0x00350035
  3346. 80225a4: 00350035 .word 0x00350035
  3347. 80225a8: 00350035 .word 0x00350035
  3348. 80225ac: 00350035 .word 0x00350035
  3349. 80225b0: 00350035 .word 0x00350035
  3350. 80225b4: 00350035 .word 0x00350035
  3351. 80225b8: 00350035 .word 0x00350035
  3352. 80225bc: 00350035 .word 0x00350035
  3353. 80225c0: 00350035 .word 0x00350035
  3354. 80225c4: 00350035 .word 0x00350035
  3355. 80225c8: 00350035 .word 0x00350035
  3356. 80225cc: 0035026a .word 0x0035026a
  3357. 80225d0: 00350035 .word 0x00350035
  3358. 80225d4: 00260035 .word 0x00260035
  3359. 80225d8: 4853 ldr r0, [pc, #332] ; (8022728 <_strtod_r+0x4b0>)
  3360. 80225da: 9a17 ldr r2, [sp, #92] ; 0x5c
  3361. 80225dc: f810 1f01 ldrb.w r1, [r0, #1]!
  3362. 80225e0: 4613 mov r3, r2
  3363. 80225e2: b169 cbz r1, 8022600 <_strtod_r+0x388>
  3364. 80225e4: 785b ldrb r3, [r3, #1]
  3365. 80225e6: 3201 adds r2, #1
  3366. 80225e8: 2b40 cmp r3, #64 ; 0x40
  3367. 80225ea: dd02 ble.n 80225f2 <_strtod_r+0x37a>
  3368. 80225ec: 2b5a cmp r3, #90 ; 0x5a
  3369. 80225ee: bfd8 it le
  3370. 80225f0: 3320 addle r3, #32
  3371. 80225f2: 428b cmp r3, r1
  3372. 80225f4: d0f2 beq.n 80225dc <_strtod_r+0x364>
  3373. 80225f6: f8dd 9018 ldr.w r9, [sp, #24]
  3374. 80225fa: f8dd a01c ldr.w sl, [sp, #28]
  3375. 80225fe: e784 b.n 802250a <_strtod_r+0x292>
  3376. 8022600: 1c53 adds r3, r2, #1
  3377. 8022602: 9317 str r3, [sp, #92] ; 0x5c
  3378. 8022604: 7853 ldrb r3, [r2, #1]
  3379. 8022606: 2b28 cmp r3, #40 ; 0x28
  3380. 8022608: f000 8575 beq.w 80230f6 <_strtod_r+0xe7e>
  3381. 802260c: 2300 movs r3, #0
  3382. 802260e: 9306 str r3, [sp, #24]
  3383. 8022610: 461c mov r4, r3
  3384. 8022612: f6cf 74f8 movt r4, #65528 ; 0xfff8
  3385. 8022616: 9407 str r4, [sp, #28]
  3386. 8022618: f8dd 9018 ldr.w r9, [sp, #24]
  3387. 802261c: f8dd a01c ldr.w sl, [sp, #28]
  3388. 8022620: e777 b.n 8022512 <_strtod_r+0x29a>
  3389. 8022622: 4658 mov r0, fp
  3390. 8022624: 9d17 ldr r5, [sp, #92] ; 0x5c
  3391. 8022626: f001 fc01 bl 8023e2c <_localeconv_r>
  3392. 802262a: 6800 ldr r0, [r0, #0]
  3393. 802262c: f7ff fa9c bl 8021b68 <strlen>
  3394. 8022630: f8dd c010 ldr.w ip, [sp, #16]
  3395. 8022634: 182b adds r3, r5, r0
  3396. 8022636: 9317 str r3, [sp, #92] ; 0x5c
  3397. 8022638: 5c2d ldrb r5, [r5, r0]
  3398. 802263a: 2c00 cmp r4, #0
  3399. 802263c: f040 819b bne.w 8022976 <_strtod_r+0x6fe>
  3400. 8022640: 2d30 cmp r5, #48 ; 0x30
  3401. 8022642: 4620 mov r0, r4
  3402. 8022644: d105 bne.n 8022652 <_strtod_r+0x3da>
  3403. 8022646: 3301 adds r3, #1
  3404. 8022648: 9317 str r3, [sp, #92] ; 0x5c
  3405. 802264a: 3001 adds r0, #1
  3406. 802264c: 781d ldrb r5, [r3, #0]
  3407. 802264e: 2d30 cmp r5, #48 ; 0x30
  3408. 8022650: d0f9 beq.n 8022646 <_strtod_r+0x3ce>
  3409. 8022652: f1a5 0331 sub.w r3, r5, #49 ; 0x31
  3410. 8022656: 2b08 cmp r3, #8
  3411. 8022658: f200 819a bhi.w 8022990 <_strtod_r+0x718>
  3412. 802265c: 9e17 ldr r6, [sp, #92] ; 0x5c
  3413. 802265e: f04f 0800 mov.w r8, #0
  3414. 8022662: 9009 str r0, [sp, #36] ; 0x24
  3415. 8022664: f1a5 0130 sub.w r1, r5, #48 ; 0x30
  3416. 8022668: 2001 movs r0, #1
  3417. 802266a: 960a str r6, [sp, #40] ; 0x28
  3418. 802266c: 2900 cmp r1, #0
  3419. 802266e: f000 836c beq.w 8022d4a <_strtod_r+0xad2>
  3420. 8022672: 9a09 ldr r2, [sp, #36] ; 0x24
  3421. 8022674: 2801 cmp r0, #1
  3422. 8022676: 4402 add r2, r0
  3423. 8022678: 9209 str r2, [sp, #36] ; 0x24
  3424. 802267a: f000 8532 beq.w 80230e2 <_strtod_r+0xe6a>
  3425. 802267e: eb08 0200 add.w r2, r8, r0
  3426. 8022682: 4643 mov r3, r8
  3427. 8022684: 3a01 subs r2, #1
  3428. 8022686: f8cd 802c str.w r8, [sp, #44] ; 0x2c
  3429. 802268a: 4690 mov r8, r2
  3430. 802268c: e003 b.n 8022696 <_strtod_r+0x41e>
  3431. 802268e: 006f lsls r7, r5, #1
  3432. 8022690: 4543 cmp r3, r8
  3433. 8022692: f000 834b beq.w 8022d2c <_strtod_r+0xab4>
  3434. 8022696: 3301 adds r3, #1
  3435. 8022698: eb07 0587 add.w r5, r7, r7, lsl #2
  3436. 802269c: 1e5a subs r2, r3, #1
  3437. 802269e: 2a08 cmp r2, #8
  3438. 80226a0: ddf5 ble.n 802268e <_strtod_r+0x416>
  3439. 80226a2: eb0a 028a add.w r2, sl, sl, lsl #2
  3440. 80226a6: 2b10 cmp r3, #16
  3441. 80226a8: bfd8 it le
  3442. 80226aa: ea4f 0a42 movle.w sl, r2, lsl #1
  3443. 80226ae: e7ef b.n 8022690 <_strtod_r+0x418>
  3444. 80226b0: 9d09 ldr r5, [sp, #36] ; 0x24
  3445. 80226b2: ebc9 0908 rsb r9, r9, r8
  3446. 80226b6: eb05 0409 add.w r4, r5, r9
  3447. 80226ba: 2c00 cmp r4, #0
  3448. 80226bc: f340 83de ble.w 8022e7c <_strtod_r+0xc04>
  3449. 80226c0: f014 000f ands.w r0, r4, #15
  3450. 80226c4: d00d beq.n 80226e2 <_strtod_r+0x46a>
  3451. 80226c6: f643 4110 movw r1, #15376 ; 0x3c10
  3452. 80226ca: e9dd 2306 ldrd r2, r3, [sp, #24]
  3453. 80226ce: f6c0 0103 movt r1, #2051 ; 0x803
  3454. 80226d2: eb01 01c0 add.w r1, r1, r0, lsl #3
  3455. 80226d6: e9d1 0100 ldrd r0, r1, [r1]
  3456. 80226da: f7fd ff71 bl 80205c0 <__aeabi_dmul>
  3457. 80226de: e9cd 0106 strd r0, r1, [sp, #24]
  3458. 80226e2: f034 040f bics.w r4, r4, #15
  3459. 80226e6: f040 815f bne.w 80229a8 <_strtod_r+0x730>
  3460. 80226ea: f8dd 9018 ldr.w r9, [sp, #24]
  3461. 80226ee: f8dd a01c ldr.w sl, [sp, #28]
  3462. 80226f2: 940b str r4, [sp, #44] ; 0x2c
  3463. 80226f4: 9700 str r7, [sp, #0]
  3464. 80226f6: 4658 mov r0, fp
  3465. 80226f8: 4631 mov r1, r6
  3466. 80226fa: 9a0a ldr r2, [sp, #40] ; 0x28
  3467. 80226fc: 4643 mov r3, r8
  3468. 80226fe: f001 ff67 bl 80245d0 <__s2b>
  3469. 8022702: 9d09 ldr r5, [sp, #36] ; 0x24
  3470. 8022704: 2d00 cmp r5, #0
  3471. 8022706: 9011 str r0, [sp, #68] ; 0x44
  3472. 8022708: f2c0 8472 blt.w 8022ff0 <_strtod_r+0xd78>
  3473. 802270c: 2400 movs r4, #0
  3474. 802270e: 940d str r4, [sp, #52] ; 0x34
  3475. 8022710: 9d09 ldr r5, [sp, #36] ; 0x24
  3476. 8022712: 9c11 ldr r4, [sp, #68] ; 0x44
  3477. 8022714: ea25 75e5 bic.w r5, r5, r5, asr #31
  3478. 8022718: f8cd 9024 str.w r9, [sp, #36] ; 0x24
  3479. 802271c: 340c adds r4, #12
  3480. 802271e: 950e str r5, [sp, #56] ; 0x38
  3481. 8022720: 9413 str r4, [sp, #76] ; 0x4c
  3482. 8022722: f8cd a028 str.w sl, [sp, #40] ; 0x28
  3483. 8022726: e073 b.n 8022810 <_strtod_r+0x598>
  3484. 8022728: 0803b6f3 .word 0x0803b6f3
  3485. 802272c: 9b0f ldr r3, [sp, #60] ; 0x3c
  3486. 802272e: 2b00 cmp r3, #0
  3487. 8022730: f000 81a8 beq.w 8022a84 <_strtod_r+0x80c>
  3488. 8022734: f04f 0900 mov.w r9, #0
  3489. 8022738: 2500 movs r5, #0
  3490. 802273a: f8dd c01c ldr.w ip, [sp, #28]
  3491. 802273e: 2400 movs r4, #0
  3492. 8022740: f6c3 75f0 movt r5, #16368 ; 0x3ff0
  3493. 8022744: f6c3 79f0 movt r9, #16368 ; 0x3ff0
  3494. 8022748: f8cd 8030 str.w r8, [sp, #48] ; 0x30
  3495. 802274c: f04f 0800 mov.w r8, #0
  3496. 8022750: 4643 mov r3, r8
  3497. 8022752: f6c7 78f0 movt r8, #32752 ; 0x7ff0
  3498. 8022756: f6c7 73e0 movt r3, #32736 ; 0x7fe0
  3499. 802275a: ea0c 0808 and.w r8, ip, r8
  3500. 802275e: 4598 cmp r8, r3
  3501. 8022760: f000 81c5 beq.w 8022aee <_strtod_r+0x876>
  3502. 8022764: 9a0b ldr r2, [sp, #44] ; 0x2c
  3503. 8022766: f1b8 6fd4 cmp.w r8, #111149056 ; 0x6a00000
  3504. 802276a: bf8c ite hi
  3505. 802276c: 2300 movhi r3, #0
  3506. 802276e: 2301 movls r3, #1
  3507. 8022770: 2a00 cmp r2, #0
  3508. 8022772: bf08 it eq
  3509. 8022774: 2300 moveq r3, #0
  3510. 8022776: b1eb cbz r3, 80227b4 <_strtod_r+0x53c>
  3511. 8022778: 980c ldr r0, [sp, #48] ; 0x30
  3512. 802277a: 4649 mov r1, r9
  3513. 802277c: a388 add r3, pc, #544 ; (adr r3, 80229a0 <_strtod_r+0x728>)
  3514. 802277e: e9d3 2300 ldrd r2, r3, [r3]
  3515. 8022782: f7fe f999 bl 8020ab8 <__aeabi_dcmple>
  3516. 8022786: b188 cbz r0, 80227ac <_strtod_r+0x534>
  3517. 8022788: 980c ldr r0, [sp, #48] ; 0x30
  3518. 802278a: 4649 mov r1, r9
  3519. 802278c: f002 fbd6 bl 8024f3c <__aeabi_d2uiz>
  3520. 8022790: 2800 cmp r0, #0
  3521. 8022792: f000 8246 beq.w 8022c22 <_strtod_r+0x9aa>
  3522. 8022796: f7fd fe9d bl 80204d4 <__aeabi_ui2d>
  3523. 802279a: 4689 mov r9, r1
  3524. 802279c: 900c str r0, [sp, #48] ; 0x30
  3525. 802279e: 9c0f ldr r4, [sp, #60] ; 0x3c
  3526. 80227a0: f109 4300 add.w r3, r9, #2147483648 ; 0x80000000
  3527. 80227a4: b104 cbz r4, 80227a8 <_strtod_r+0x530>
  3528. 80227a6: 464b mov r3, r9
  3529. 80227a8: 9c0c ldr r4, [sp, #48] ; 0x30
  3530. 80227aa: 461d mov r5, r3
  3531. 80227ac: f105 63d6 add.w r3, r5, #112197632 ; 0x6b00000
  3532. 80227b0: ebc8 0503 rsb r5, r8, r3
  3533. 80227b4: 9809 ldr r0, [sp, #36] ; 0x24
  3534. 80227b6: 990a ldr r1, [sp, #40] ; 0x28
  3535. 80227b8: f002 f98a bl 8024ad0 <__ulp>
  3536. 80227bc: 4602 mov r2, r0
  3537. 80227be: 460b mov r3, r1
  3538. 80227c0: 4620 mov r0, r4
  3539. 80227c2: 4629 mov r1, r5
  3540. 80227c4: f7fd fefc bl 80205c0 <__aeabi_dmul>
  3541. 80227c8: 4602 mov r2, r0
  3542. 80227ca: 460b mov r3, r1
  3543. 80227cc: 9809 ldr r0, [sp, #36] ; 0x24
  3544. 80227ce: 990a ldr r1, [sp, #40] ; 0x28
  3545. 80227d0: f7fd fd44 bl 802025c <__adddf3>
  3546. 80227d4: e9cd 0106 strd r0, r1, [sp, #24]
  3547. 80227d8: 9c07 ldr r4, [sp, #28]
  3548. 80227da: 9009 str r0, [sp, #36] ; 0x24
  3549. 80227dc: 910a str r1, [sp, #40] ; 0x28
  3550. 80227de: 9d0b ldr r5, [sp, #44] ; 0x2c
  3551. 80227e0: b935 cbnz r5, 80227f0 <_strtod_r+0x578>
  3552. 80227e2: 2300 movs r3, #0
  3553. 80227e4: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  3554. 80227e8: 4023 ands r3, r4
  3555. 80227ea: 4598 cmp r8, r3
  3556. 80227ec: f000 81bc beq.w 8022b68 <_strtod_r+0x8f0>
  3557. 80227f0: 4658 mov r0, fp
  3558. 80227f2: 9918 ldr r1, [sp, #96] ; 0x60
  3559. 80227f4: f001 fe8c bl 8024510 <_Bfree>
  3560. 80227f8: 4658 mov r0, fp
  3561. 80227fa: 4651 mov r1, sl
  3562. 80227fc: f001 fe88 bl 8024510 <_Bfree>
  3563. 8022800: 4658 mov r0, fp
  3564. 8022802: 4639 mov r1, r7
  3565. 8022804: f001 fe84 bl 8024510 <_Bfree>
  3566. 8022808: 4658 mov r0, fp
  3567. 802280a: 4631 mov r1, r6
  3568. 802280c: f001 fe80 bl 8024510 <_Bfree>
  3569. 8022810: 9c11 ldr r4, [sp, #68] ; 0x44
  3570. 8022812: 4658 mov r0, fp
  3571. 8022814: ad16 add r5, sp, #88 ; 0x58
  3572. 8022816: 6861 ldr r1, [r4, #4]
  3573. 8022818: f001 fe44 bl 80244a4 <_Balloc>
  3574. 802281c: 6923 ldr r3, [r4, #16]
  3575. 802281e: 9913 ldr r1, [sp, #76] ; 0x4c
  3576. 8022820: 1c9a adds r2, r3, #2
  3577. 8022822: 0092 lsls r2, r2, #2
  3578. 8022824: 4682 mov sl, r0
  3579. 8022826: 300c adds r0, #12
  3580. 8022828: f7fe ff0c bl 8021644 <memcpy>
  3581. 802282c: 9a09 ldr r2, [sp, #36] ; 0x24
  3582. 802282e: 9b0a ldr r3, [sp, #40] ; 0x28
  3583. 8022830: a819 add r0, sp, #100 ; 0x64
  3584. 8022832: 9500 str r5, [sp, #0]
  3585. 8022834: 9001 str r0, [sp, #4]
  3586. 8022836: 4658 mov r0, fp
  3587. 8022838: f002 f9c4 bl 8024bc4 <__d2b>
  3588. 802283c: 2101 movs r1, #1
  3589. 802283e: 9018 str r0, [sp, #96] ; 0x60
  3590. 8022840: 4658 mov r0, fp
  3591. 8022842: f001 ff5d bl 8024700 <__i2b>
  3592. 8022846: 9a16 ldr r2, [sp, #88] ; 0x58
  3593. 8022848: 9b19 ldr r3, [sp, #100] ; 0x64
  3594. 802284a: f46f 717f mvn.w r1, #1020 ; 0x3fc
  3595. 802284e: 2a00 cmp r2, #0
  3596. 8022850: bfaa itet ge
  3597. 8022852: 9d0d ldrge r5, [sp, #52] ; 0x34
  3598. 8022854: 9c0e ldrlt r4, [sp, #56] ; 0x38
  3599. 8022856: 18ac addge r4, r5, r2
  3600. 8022858: 9d0b ldr r5, [sp, #44] ; 0x2c
  3601. 802285a: 4607 mov r7, r0
  3602. 802285c: bfb8 it lt
  3603. 802285e: ebc2 0004 rsblt r0, r2, r4
  3604. 8022862: ebc5 0202 rsb r2, r5, r2
  3605. 8022866: bfb8 it lt
  3606. 8022868: 9c0d ldrlt r4, [sp, #52] ; 0x34
  3607. 802286a: eb02 0503 add.w r5, r2, r3
  3608. 802286e: bfa8 it ge
  3609. 8022870: 980e ldrge r0, [sp, #56] ; 0x38
  3610. 8022872: 428d cmp r5, r1
  3611. 8022874: 990d ldr r1, [sp, #52] ; 0x34
  3612. 8022876: bfb4 ite lt
  3613. 8022878: f202 4333 addwlt r3, r2, #1075 ; 0x433
  3614. 802287c: f1c3 0336 rsbge r3, r3, #54 ; 0x36
  3615. 8022880: 18e6 adds r6, r4, r3
  3616. 8022882: 18c3 adds r3, r0, r3
  3617. 8022884: 980b ldr r0, [sp, #44] ; 0x2c
  3618. 8022886: 181d adds r5, r3, r0
  3619. 8022888: 42a6 cmp r6, r4
  3620. 802288a: bfb4 ite lt
  3621. 802288c: 4633 movlt r3, r6
  3622. 802288e: 4623 movge r3, r4
  3623. 8022890: 42ab cmp r3, r5
  3624. 8022892: bfa8 it ge
  3625. 8022894: 462b movge r3, r5
  3626. 8022896: 2b00 cmp r3, #0
  3627. 8022898: bfc2 ittt gt
  3628. 802289a: ebc3 0606 rsbgt r6, r3, r6
  3629. 802289e: ebc3 0505 rsbgt r5, r3, r5
  3630. 80228a2: ebc3 0404 rsbgt r4, r3, r4
  3631. 80228a6: b189 cbz r1, 80228cc <_strtod_r+0x654>
  3632. 80228a8: 460a mov r2, r1
  3633. 80228aa: 4658 mov r0, fp
  3634. 80228ac: 4639 mov r1, r7
  3635. 80228ae: f001 ffcf bl 8024850 <__pow5mult>
  3636. 80228b2: 9a18 ldr r2, [sp, #96] ; 0x60
  3637. 80228b4: 4607 mov r7, r0
  3638. 80228b6: 4658 mov r0, fp
  3639. 80228b8: 4639 mov r1, r7
  3640. 80228ba: f001 ff2b bl 8024714 <__multiply>
  3641. 80228be: 9918 ldr r1, [sp, #96] ; 0x60
  3642. 80228c0: 4680 mov r8, r0
  3643. 80228c2: 4658 mov r0, fp
  3644. 80228c4: f001 fe24 bl 8024510 <_Bfree>
  3645. 80228c8: f8cd 8060 str.w r8, [sp, #96] ; 0x60
  3646. 80228cc: 2e00 cmp r6, #0
  3647. 80228ce: dd05 ble.n 80228dc <_strtod_r+0x664>
  3648. 80228d0: 4658 mov r0, fp
  3649. 80228d2: 9918 ldr r1, [sp, #96] ; 0x60
  3650. 80228d4: 4632 mov r2, r6
  3651. 80228d6: f002 f80d bl 80248f4 <__lshift>
  3652. 80228da: 9018 str r0, [sp, #96] ; 0x60
  3653. 80228dc: 9a0e ldr r2, [sp, #56] ; 0x38
  3654. 80228de: b122 cbz r2, 80228ea <_strtod_r+0x672>
  3655. 80228e0: 4651 mov r1, sl
  3656. 80228e2: 4658 mov r0, fp
  3657. 80228e4: f001 ffb4 bl 8024850 <__pow5mult>
  3658. 80228e8: 4682 mov sl, r0
  3659. 80228ea: 2d00 cmp r5, #0
  3660. 80228ec: dd05 ble.n 80228fa <_strtod_r+0x682>
  3661. 80228ee: 4651 mov r1, sl
  3662. 80228f0: 4658 mov r0, fp
  3663. 80228f2: 462a mov r2, r5
  3664. 80228f4: f001 fffe bl 80248f4 <__lshift>
  3665. 80228f8: 4682 mov sl, r0
  3666. 80228fa: 2c00 cmp r4, #0
  3667. 80228fc: dd05 ble.n 802290a <_strtod_r+0x692>
  3668. 80228fe: 4639 mov r1, r7
  3669. 8022900: 4658 mov r0, fp
  3670. 8022902: 4622 mov r2, r4
  3671. 8022904: f001 fff6 bl 80248f4 <__lshift>
  3672. 8022908: 4607 mov r7, r0
  3673. 802290a: 9918 ldr r1, [sp, #96] ; 0x60
  3674. 802290c: 4652 mov r2, sl
  3675. 802290e: 4658 mov r0, fp
  3676. 8022910: f04f 0800 mov.w r8, #0
  3677. 8022914: f002 f866 bl 80249e4 <__mdiff>
  3678. 8022918: 4639 mov r1, r7
  3679. 802291a: 68c4 ldr r4, [r0, #12]
  3680. 802291c: 4606 mov r6, r0
  3681. 802291e: f8c0 800c str.w r8, [r0, #12]
  3682. 8022922: 940f str r4, [sp, #60] ; 0x3c
  3683. 8022924: f002 f840 bl 80249a8 <__mcmp>
  3684. 8022928: 4540 cmp r0, r8
  3685. 802292a: f2c0 8213 blt.w 8022d54 <_strtod_r+0xadc>
  3686. 802292e: f000 8261 beq.w 8022df4 <_strtod_r+0xb7c>
  3687. 8022932: 4630 mov r0, r6
  3688. 8022934: 4639 mov r1, r7
  3689. 8022936: f002 f9a3 bl 8024c80 <__ratio>
  3690. 802293a: 2200 movs r2, #0
  3691. 802293c: f04f 4380 mov.w r3, #1073741824 ; 0x40000000
  3692. 8022940: 4604 mov r4, r0
  3693. 8022942: 460d mov r5, r1
  3694. 8022944: f7fe f8b8 bl 8020ab8 <__aeabi_dcmple>
  3695. 8022948: 2800 cmp r0, #0
  3696. 802294a: f47f aeef bne.w 802272c <_strtod_r+0x4b4>
  3697. 802294e: 2300 movs r3, #0
  3698. 8022950: 4620 mov r0, r4
  3699. 8022952: f6c3 73e0 movt r3, #16352 ; 0x3fe0
  3700. 8022956: 4629 mov r1, r5
  3701. 8022958: 2200 movs r2, #0
  3702. 802295a: f7fd fe31 bl 80205c0 <__aeabi_dmul>
  3703. 802295e: 9c0f ldr r4, [sp, #60] ; 0x3c
  3704. 8022960: 900c str r0, [sp, #48] ; 0x30
  3705. 8022962: 4689 mov r9, r1
  3706. 8022964: f101 4300 add.w r3, r1, #2147483648 ; 0x80000000
  3707. 8022968: b104 cbz r4, 802296c <_strtod_r+0x6f4>
  3708. 802296a: 460b mov r3, r1
  3709. 802296c: 9c0c ldr r4, [sp, #48] ; 0x30
  3710. 802296e: 461d mov r5, r3
  3711. 8022970: f8dd c01c ldr.w ip, [sp, #28]
  3712. 8022974: e6ea b.n 802274c <_strtod_r+0x4d4>
  3713. 8022976: 4640 mov r0, r8
  3714. 8022978: 46a0 mov r8, r4
  3715. 802297a: 9009 str r0, [sp, #36] ; 0x24
  3716. 802297c: f1a5 0130 sub.w r1, r5, #48 ; 0x30
  3717. 8022980: 2909 cmp r1, #9
  3718. 8022982: d803 bhi.n 802298c <_strtod_r+0x714>
  3719. 8022984: 9a17 ldr r2, [sp, #92] ; 0x5c
  3720. 8022986: 3001 adds r0, #1
  3721. 8022988: 920a str r2, [sp, #40] ; 0x28
  3722. 802298a: e66f b.n 802266c <_strtod_r+0x3f4>
  3723. 802298c: 2101 movs r1, #1
  3724. 802298e: e50a b.n 80223a6 <_strtod_r+0x12e>
  3725. 8022990: f04f 0800 mov.w r8, #0
  3726. 8022994: 2101 movs r1, #1
  3727. 8022996: f8cd 8024 str.w r8, [sp, #36] ; 0x24
  3728. 802299a: e504 b.n 80223a6 <_strtod_r+0x12e>
  3729. 802299c: f3af 8000 nop.w
  3730. 80229a0: ffc00000 .word 0xffc00000
  3731. 80229a4: 41dfffff .word 0x41dfffff
  3732. 80229a8: f5b4 7f9a cmp.w r4, #308 ; 0x134
  3733. 80229ac: f300 8258 bgt.w 8022e60 <_strtod_r+0xbe8>
  3734. 80229b0: 1124 asrs r4, r4, #4
  3735. 80229b2: f643 5a00 movw sl, #15616 ; 0x3d00
  3736. 80229b6: 2c01 cmp r4, #1
  3737. 80229b8: f340 8398 ble.w 80230ec <_strtod_r+0xe74>
  3738. 80229bc: f6c0 0a03 movt sl, #2051 ; 0x803
  3739. 80229c0: e9dd 2306 ldrd r2, r3, [sp, #24]
  3740. 80229c4: f04f 0900 mov.w r9, #0
  3741. 80229c8: 4655 mov r5, sl
  3742. 80229ca: f014 0f01 tst.w r4, #1
  3743. 80229ce: 4610 mov r0, r2
  3744. 80229d0: 4619 mov r1, r3
  3745. 80229d2: ea4f 0464 mov.w r4, r4, asr #1
  3746. 80229d6: f109 0901 add.w r9, r9, #1
  3747. 80229da: d005 beq.n 80229e8 <_strtod_r+0x770>
  3748. 80229dc: e9d5 2300 ldrd r2, r3, [r5]
  3749. 80229e0: f7fd fdee bl 80205c0 <__aeabi_dmul>
  3750. 80229e4: 4602 mov r2, r0
  3751. 80229e6: 460b mov r3, r1
  3752. 80229e8: 3508 adds r5, #8
  3753. 80229ea: 2c01 cmp r4, #1
  3754. 80229ec: dced bgt.n 80229ca <_strtod_r+0x752>
  3755. 80229ee: 4610 mov r0, r2
  3756. 80229f0: 4619 mov r1, r3
  3757. 80229f2: e9cd 0106 strd r0, r1, [sp, #24]
  3758. 80229f6: 9907 ldr r1, [sp, #28]
  3759. 80229f8: eb0a 09c9 add.w r9, sl, r9, lsl #3
  3760. 80229fc: f1a1 7154 sub.w r1, r1, #55574528 ; 0x3500000
  3761. 8022a00: 9107 str r1, [sp, #28]
  3762. 8022a02: e9dd 2306 ldrd r2, r3, [sp, #24]
  3763. 8022a06: e9d9 0100 ldrd r0, r1, [r9]
  3764. 8022a0a: f7fd fdd9 bl 80205c0 <__aeabi_dmul>
  3765. 8022a0e: 2300 movs r3, #0
  3766. 8022a10: 2200 movs r2, #0
  3767. 8022a12: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  3768. 8022a16: f6c7 42a0 movt r2, #31904 ; 0x7ca0
  3769. 8022a1a: e9cd 0106 strd r0, r1, [sp, #24]
  3770. 8022a1e: 9907 ldr r1, [sp, #28]
  3771. 8022a20: 400b ands r3, r1
  3772. 8022a22: 4293 cmp r3, r2
  3773. 8022a24: f200 821c bhi.w 8022e60 <_strtod_r+0xbe8>
  3774. 8022a28: 2200 movs r2, #0
  3775. 8022a2a: f6c7 4290 movt r2, #31888 ; 0x7c90
  3776. 8022a2e: 4293 cmp r3, r2
  3777. 8022a30: f240 8305 bls.w 802303e <_strtod_r+0xdc6>
  3778. 8022a34: f64f 72ff movw r2, #65535 ; 0xffff
  3779. 8022a38: f04f 30ff mov.w r0, #4294967295
  3780. 8022a3c: 4615 mov r5, r2
  3781. 8022a3e: 2400 movs r4, #0
  3782. 8022a40: f6c7 75ef movt r5, #32751 ; 0x7fef
  3783. 8022a44: 940b str r4, [sp, #44] ; 0x2c
  3784. 8022a46: 9507 str r5, [sp, #28]
  3785. 8022a48: 4681 mov r9, r0
  3786. 8022a4a: 9006 str r0, [sp, #24]
  3787. 8022a4c: 46aa mov sl, r5
  3788. 8022a4e: e651 b.n 80226f4 <_strtod_r+0x47c>
  3789. 8022a50: 2301 movs r3, #1
  3790. 8022a52: 930a str r3, [sp, #40] ; 0x28
  3791. 8022a54: f10c 0302 add.w r3, ip, #2
  3792. 8022a58: 9317 str r3, [sp, #92] ; 0x5c
  3793. 8022a5a: f89c 5002 ldrb.w r5, [ip, #2]
  3794. 8022a5e: e4bc b.n 80223da <_strtod_r+0x162>
  3795. 8022a60: 48ab ldr r0, [pc, #684] ; (8022d10 <_strtod_r+0xa98>)
  3796. 8022a62: 9a17 ldr r2, [sp, #92] ; 0x5c
  3797. 8022a64: f810 1f01 ldrb.w r1, [r0, #1]!
  3798. 8022a68: 4613 mov r3, r2
  3799. 8022a6a: 2900 cmp r1, #0
  3800. 8022a6c: f000 8311 beq.w 8023092 <_strtod_r+0xe1a>
  3801. 8022a70: 785b ldrb r3, [r3, #1]
  3802. 8022a72: 3201 adds r2, #1
  3803. 8022a74: 2b40 cmp r3, #64 ; 0x40
  3804. 8022a76: dd02 ble.n 8022a7e <_strtod_r+0x806>
  3805. 8022a78: 2b5a cmp r3, #90 ; 0x5a
  3806. 8022a7a: bfd8 it le
  3807. 8022a7c: 3320 addle r3, #32
  3808. 8022a7e: 428b cmp r3, r1
  3809. 8022a80: d0f0 beq.n 8022a64 <_strtod_r+0x7ec>
  3810. 8022a82: e5b8 b.n 80225f6 <_strtod_r+0x37e>
  3811. 8022a84: 9b06 ldr r3, [sp, #24]
  3812. 8022a86: f8dd c01c ldr.w ip, [sp, #28]
  3813. 8022a8a: 2b00 cmp r3, #0
  3814. 8022a8c: f040 80a6 bne.w 8022bdc <_strtod_r+0x964>
  3815. 8022a90: f3cc 0313 ubfx r3, ip, #0, #20
  3816. 8022a94: bb03 cbnz r3, 8022ad8 <_strtod_r+0x860>
  3817. 8022a96: 2300 movs r3, #0
  3818. 8022a98: 4620 mov r0, r4
  3819. 8022a9a: 4629 mov r1, r5
  3820. 8022a9c: 2200 movs r2, #0
  3821. 8022a9e: f6c3 73f0 movt r3, #16368 ; 0x3ff0
  3822. 8022aa2: f8cd c010 str.w ip, [sp, #16]
  3823. 8022aa6: f7fd fffd bl 8020aa4 <__aeabi_dcmplt>
  3824. 8022aaa: f8dd c010 ldr.w ip, [sp, #16]
  3825. 8022aae: 2800 cmp r0, #0
  3826. 8022ab0: f040 8246 bne.w 8022f40 <_strtod_r+0xcc8>
  3827. 8022ab4: 2300 movs r3, #0
  3828. 8022ab6: 2200 movs r2, #0
  3829. 8022ab8: f6c3 73e0 movt r3, #16352 ; 0x3fe0
  3830. 8022abc: 4620 mov r0, r4
  3831. 8022abe: 4629 mov r1, r5
  3832. 8022ac0: f7fd fd7e bl 80205c0 <__aeabi_dmul>
  3833. 8022ac4: f8dd c010 ldr.w ip, [sp, #16]
  3834. 8022ac8: 4689 mov r9, r1
  3835. 8022aca: 4602 mov r2, r0
  3836. 8022acc: f101 4300 add.w r3, r1, #2147483648 ; 0x80000000
  3837. 8022ad0: 900c str r0, [sp, #48] ; 0x30
  3838. 8022ad2: 4614 mov r4, r2
  3839. 8022ad4: 461d mov r5, r3
  3840. 8022ad6: e639 b.n 802274c <_strtod_r+0x4d4>
  3841. 8022ad8: f04f 0900 mov.w r9, #0
  3842. 8022adc: 2500 movs r5, #0
  3843. 8022ade: f8cd 9030 str.w r9, [sp, #48] ; 0x30
  3844. 8022ae2: 2400 movs r4, #0
  3845. 8022ae4: f6cb 75f0 movt r5, #49136 ; 0xbff0
  3846. 8022ae8: f6c3 79f0 movt r9, #16368 ; 0x3ff0
  3847. 8022aec: e62e b.n 802274c <_strtod_r+0x4d4>
  3848. 8022aee: f1ac 7c54 sub.w ip, ip, #55574528 ; 0x3500000
  3849. 8022af2: 9a09 ldr r2, [sp, #36] ; 0x24
  3850. 8022af4: f8cd c01c str.w ip, [sp, #28]
  3851. 8022af8: 9b0a ldr r3, [sp, #40] ; 0x28
  3852. 8022afa: e9dd 0106 ldrd r0, r1, [sp, #24]
  3853. 8022afe: e9cd 4502 strd r4, r5, [sp, #8]
  3854. 8022b02: 4614 mov r4, r2
  3855. 8022b04: 461d mov r5, r3
  3856. 8022b06: e9cd 4514 strd r4, r5, [sp, #80] ; 0x50
  3857. 8022b0a: f001 ffe1 bl 8024ad0 <__ulp>
  3858. 8022b0e: 4602 mov r2, r0
  3859. 8022b10: 460b mov r3, r1
  3860. 8022b12: e9dd 0102 ldrd r0, r1, [sp, #8]
  3861. 8022b16: f7fd fd53 bl 80205c0 <__aeabi_dmul>
  3862. 8022b1a: 4602 mov r2, r0
  3863. 8022b1c: 460b mov r3, r1
  3864. 8022b1e: e9dd 0106 ldrd r0, r1, [sp, #24]
  3865. 8022b22: f7fd fb9b bl 802025c <__adddf3>
  3866. 8022b26: 2300 movs r3, #0
  3867. 8022b28: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  3868. 8022b2c: f64f 72ff movw r2, #65535 ; 0xffff
  3869. 8022b30: f6c7 429f movt r2, #31903 ; 0x7c9f
  3870. 8022b34: e9cd 0106 strd r0, r1, [sp, #24]
  3871. 8022b38: 9c07 ldr r4, [sp, #28]
  3872. 8022b3a: 4023 ands r3, r4
  3873. 8022b3c: 4293 cmp r3, r2
  3874. 8022b3e: d976 bls.n 8022c2e <_strtod_r+0x9b6>
  3875. 8022b40: f64f 73ff movw r3, #65535 ; 0xffff
  3876. 8022b44: 9d15 ldr r5, [sp, #84] ; 0x54
  3877. 8022b46: f6c7 73ef movt r3, #32751 ; 0x7fef
  3878. 8022b4a: 429d cmp r5, r3
  3879. 8022b4c: f000 8177 beq.w 8022e3e <_strtod_r+0xbc6>
  3880. 8022b50: f64f 71ff movw r1, #65535 ; 0xffff
  3881. 8022b54: f04f 33ff mov.w r3, #4294967295
  3882. 8022b58: 460a mov r2, r1
  3883. 8022b5a: 9306 str r3, [sp, #24]
  3884. 8022b5c: f6c7 72ef movt r2, #32751 ; 0x7fef
  3885. 8022b60: 9309 str r3, [sp, #36] ; 0x24
  3886. 8022b62: 9207 str r2, [sp, #28]
  3887. 8022b64: 920a str r2, [sp, #40] ; 0x28
  3888. 8022b66: e643 b.n 80227f0 <_strtod_r+0x578>
  3889. 8022b68: 4649 mov r1, r9
  3890. 8022b6a: 980c ldr r0, [sp, #48] ; 0x30
  3891. 8022b6c: f7fd ffc2 bl 8020af4 <__aeabi_d2iz>
  3892. 8022b70: f7fd fcc0 bl 80204f4 <__aeabi_i2d>
  3893. 8022b74: 4602 mov r2, r0
  3894. 8022b76: 460b mov r3, r1
  3895. 8022b78: 980c ldr r0, [sp, #48] ; 0x30
  3896. 8022b7a: 4649 mov r1, r9
  3897. 8022b7c: f7fd fb6c bl 8020258 <__aeabi_dsub>
  3898. 8022b80: 9d0f ldr r5, [sp, #60] ; 0x3c
  3899. 8022b82: 4680 mov r8, r0
  3900. 8022b84: 4689 mov r9, r1
  3901. 8022b86: 2d00 cmp r5, #0
  3902. 8022b88: d137 bne.n 8022bfa <_strtod_r+0x982>
  3903. 8022b8a: 9a06 ldr r2, [sp, #24]
  3904. 8022b8c: 2a00 cmp r2, #0
  3905. 8022b8e: d134 bne.n 8022bfa <_strtod_r+0x982>
  3906. 8022b90: f3c4 0413 ubfx r4, r4, #0, #20
  3907. 8022b94: 2c00 cmp r4, #0
  3908. 8022b96: d130 bne.n 8022bfa <_strtod_r+0x982>
  3909. 8022b98: a357 add r3, pc, #348 ; (adr r3, 8022cf8 <_strtod_r+0xa80>)
  3910. 8022b9a: e9d3 2300 ldrd r2, r3, [r3]
  3911. 8022b9e: f7fd ff81 bl 8020aa4 <__aeabi_dcmplt>
  3912. 8022ba2: 2800 cmp r0, #0
  3913. 8022ba4: f43f ae24 beq.w 80227f0 <_strtod_r+0x578>
  3914. 8022ba8: 4654 mov r4, sl
  3915. 8022baa: f8dd 9024 ldr.w r9, [sp, #36] ; 0x24
  3916. 8022bae: f8dd a028 ldr.w sl, [sp, #40] ; 0x28
  3917. 8022bb2: 4658 mov r0, fp
  3918. 8022bb4: 9918 ldr r1, [sp, #96] ; 0x60
  3919. 8022bb6: f001 fcab bl 8024510 <_Bfree>
  3920. 8022bba: 4658 mov r0, fp
  3921. 8022bbc: 4621 mov r1, r4
  3922. 8022bbe: f001 fca7 bl 8024510 <_Bfree>
  3923. 8022bc2: 4658 mov r0, fp
  3924. 8022bc4: 4639 mov r1, r7
  3925. 8022bc6: f001 fca3 bl 8024510 <_Bfree>
  3926. 8022bca: 4658 mov r0, fp
  3927. 8022bcc: 9911 ldr r1, [sp, #68] ; 0x44
  3928. 8022bce: f001 fc9f bl 8024510 <_Bfree>
  3929. 8022bd2: 4658 mov r0, fp
  3930. 8022bd4: 4631 mov r1, r6
  3931. 8022bd6: f001 fc9b bl 8024510 <_Bfree>
  3932. 8022bda: e49a b.n 8022512 <_strtod_r+0x29a>
  3933. 8022bdc: 2b01 cmp r3, #1
  3934. 8022bde: f47f af7b bne.w 8022ad8 <_strtod_r+0x860>
  3935. 8022be2: 4661 mov r1, ip
  3936. 8022be4: 2900 cmp r1, #0
  3937. 8022be6: f47f af77 bne.w 8022ad8 <_strtod_r+0x860>
  3938. 8022bea: 4654 mov r4, sl
  3939. 8022bec: f04f 0900 mov.w r9, #0
  3940. 8022bf0: 46ca mov sl, r9
  3941. 8022bf2: 2322 movs r3, #34 ; 0x22
  3942. 8022bf4: f8cb 3000 str.w r3, [fp]
  3943. 8022bf8: e7db b.n 8022bb2 <_strtod_r+0x93a>
  3944. 8022bfa: 4640 mov r0, r8
  3945. 8022bfc: 4649 mov r1, r9
  3946. 8022bfe: a340 add r3, pc, #256 ; (adr r3, 8022d00 <_strtod_r+0xa88>)
  3947. 8022c00: e9d3 2300 ldrd r2, r3, [r3]
  3948. 8022c04: f7fd ff4e bl 8020aa4 <__aeabi_dcmplt>
  3949. 8022c08: 2800 cmp r0, #0
  3950. 8022c0a: d1cd bne.n 8022ba8 <_strtod_r+0x930>
  3951. 8022c0c: 4640 mov r0, r8
  3952. 8022c0e: 4649 mov r1, r9
  3953. 8022c10: a33d add r3, pc, #244 ; (adr r3, 8022d08 <_strtod_r+0xa90>)
  3954. 8022c12: e9d3 2300 ldrd r2, r3, [r3]
  3955. 8022c16: f7fd ff63 bl 8020ae0 <__aeabi_dcmpgt>
  3956. 8022c1a: 2800 cmp r0, #0
  3957. 8022c1c: f43f ade8 beq.w 80227f0 <_strtod_r+0x578>
  3958. 8022c20: e7c2 b.n 8022ba8 <_strtod_r+0x930>
  3959. 8022c22: f04f 0900 mov.w r9, #0
  3960. 8022c26: 900c str r0, [sp, #48] ; 0x30
  3961. 8022c28: f6c3 79f0 movt r9, #16368 ; 0x3ff0
  3962. 8022c2c: e5b7 b.n 802279e <_strtod_r+0x526>
  3963. 8022c2e: 9906 ldr r1, [sp, #24]
  3964. 8022c30: f104 7454 add.w r4, r4, #55574528 ; 0x3500000
  3965. 8022c34: 9407 str r4, [sp, #28]
  3966. 8022c36: 940a str r4, [sp, #40] ; 0x28
  3967. 8022c38: 9109 str r1, [sp, #36] ; 0x24
  3968. 8022c3a: e5d0 b.n 80227de <_strtod_r+0x566>
  3969. 8022c3c: f8cd c05c str.w ip, [sp, #92] ; 0x5c
  3970. 8022c40: 2200 movs r2, #0
  3971. 8022c42: f1b8 0f00 cmp.w r8, #0
  3972. 8022c46: f47f ac0f bne.w 8022468 <_strtod_r+0x1f0>
  3973. 8022c4a: e495 b.n 8022578 <_strtod_r+0x300>
  3974. 8022c4c: 9d12 ldr r5, [sp, #72] ; 0x48
  3975. 8022c4e: f240 0400 movw r4, #0
  3976. 8022c52: f2c2 0400 movt r4, #8192 ; 0x2000
  3977. 8022c56: ab18 add r3, sp, #96 ; 0x60
  3978. 8022c58: 4658 mov r0, fp
  3979. 8022c5a: e88d 0028 stmia.w sp, {r3, r5}
  3980. 8022c5e: a917 add r1, sp, #92 ; 0x5c
  3981. 8022c60: 4622 mov r2, r4
  3982. 8022c62: ab19 add r3, sp, #100 ; 0x64
  3983. 8022c64: f000 fd1c bl 80236a0 <__gethex>
  3984. 8022c68: f010 0707 ands.w r7, r0, #7
  3985. 8022c6c: 4605 mov r5, r0
  3986. 8022c6e: bf04 itt eq
  3987. 8022c70: 46b9 moveq r9, r7
  3988. 8022c72: 46ca moveq sl, r9
  3989. 8022c74: f43f ac4d beq.w 8022512 <_strtod_r+0x29a>
  3990. 8022c78: 2f06 cmp r7, #6
  3991. 8022c7a: f000 816f beq.w 8022f5c <_strtod_r+0xce4>
  3992. 8022c7e: 9a18 ldr r2, [sp, #96] ; 0x60
  3993. 8022c80: b13a cbz r2, 8022c92 <_strtod_r+0xa1a>
  3994. 8022c82: 6821 ldr r1, [r4, #0]
  3995. 8022c84: a81a add r0, sp, #104 ; 0x68
  3996. 8022c86: f002 f845 bl 8024d14 <__copybits>
  3997. 8022c8a: 4658 mov r0, fp
  3998. 8022c8c: 9918 ldr r1, [sp, #96] ; 0x60
  3999. 8022c8e: f001 fc3f bl 8024510 <_Bfree>
  4000. 8022c92: 9b19 ldr r3, [sp, #100] ; 0x64
  4001. 8022c94: 2f06 cmp r7, #6
  4002. 8022c96: d80b bhi.n 8022cb0 <_strtod_r+0xa38>
  4003. 8022c98: e8df f007 tbb [pc, r7]
  4004. 8022c9c: 141b203c .word 0x141b203c
  4005. 8022ca0: 2004 .short 0x2004
  4006. 8022ca2: 3c .byte 0x3c
  4007. 8022ca3: 00 .byte 0x00
  4008. 8022ca4: f06f 4400 mvn.w r4, #2147483648 ; 0x80000000
  4009. 8022ca8: f04f 30ff mov.w r0, #4294967295
  4010. 8022cac: 9407 str r4, [sp, #28]
  4011. 8022cae: 9006 str r0, [sp, #24]
  4012. 8022cb0: 072b lsls r3, r5, #28
  4013. 8022cb2: f57f acb1 bpl.w 8022618 <_strtod_r+0x3a0>
  4014. 8022cb6: 9907 ldr r1, [sp, #28]
  4015. 8022cb8: f8dd 9018 ldr.w r9, [sp, #24]
  4016. 8022cbc: f041 4300 orr.w r3, r1, #2147483648 ; 0x80000000
  4017. 8022cc0: 469a mov sl, r3
  4018. 8022cc2: e426 b.n 8022512 <_strtod_r+0x29a>
  4019. 8022cc4: 2100 movs r1, #0
  4020. 8022cc6: 9106 str r1, [sp, #24]
  4021. 8022cc8: 460a mov r2, r1
  4022. 8022cca: f6c7 72f0 movt r2, #32752 ; 0x7ff0
  4023. 8022cce: 9207 str r2, [sp, #28]
  4024. 8022cd0: e7ee b.n 8022cb0 <_strtod_r+0xa38>
  4025. 8022cd2: 9b1a ldr r3, [sp, #104] ; 0x68
  4026. 8022cd4: 9c1b ldr r4, [sp, #108] ; 0x6c
  4027. 8022cd6: 9306 str r3, [sp, #24]
  4028. 8022cd8: 9407 str r4, [sp, #28]
  4029. 8022cda: e7e9 b.n 8022cb0 <_strtod_r+0xa38>
  4030. 8022cdc: 981a ldr r0, [sp, #104] ; 0x68
  4031. 8022cde: f203 4333 addw r3, r3, #1075 ; 0x433
  4032. 8022ce2: 9a1b ldr r2, [sp, #108] ; 0x6c
  4033. 8022ce4: f422 1280 bic.w r2, r2, #1048576 ; 0x100000
  4034. 8022ce8: 9006 str r0, [sp, #24]
  4035. 8022cea: ea42 5203 orr.w r2, r2, r3, lsl #20
  4036. 8022cee: 9207 str r2, [sp, #28]
  4037. 8022cf0: e7de b.n 8022cb0 <_strtod_r+0xa38>
  4038. 8022cf2: bf00 nop
  4039. 8022cf4: f3af 8000 nop.w
  4040. 8022cf8: 94a03595 .word 0x94a03595
  4041. 8022cfc: 3fcfffff .word 0x3fcfffff
  4042. 8022d00: 94a03595 .word 0x94a03595
  4043. 8022d04: 3fdfffff .word 0x3fdfffff
  4044. 8022d08: 35afe535 .word 0x35afe535
  4045. 8022d0c: 3fe00000 .word 0x3fe00000
  4046. 8022d10: 0803b6e7 .word 0x0803b6e7
  4047. 8022d14: 2100 movs r1, #0
  4048. 8022d16: 9107 str r1, [sp, #28]
  4049. 8022d18: 9106 str r1, [sp, #24]
  4050. 8022d1a: e7c9 b.n 8022cb0 <_strtod_r+0xa38>
  4051. 8022d1c: 46b0 mov r8, r6
  4052. 8022d1e: 4657 mov r7, sl
  4053. 8022d20: 4654 mov r4, sl
  4054. 8022d22: f7ff bb24 b.w 802236e <_strtod_r+0xf6>
  4055. 8022d26: 2300 movs r3, #0
  4056. 8022d28: 930a str r3, [sp, #40] ; 0x28
  4057. 8022d2a: e693 b.n 8022a54 <_strtod_r+0x7dc>
  4058. 8022d2c: f8dd 802c ldr.w r8, [sp, #44] ; 0x2c
  4059. 8022d30: eb08 0300 add.w r3, r8, r0
  4060. 8022d34: 3b01 subs r3, #1
  4061. 8022d36: 2b08 cmp r3, #8
  4062. 8022d38: f103 0801 add.w r8, r3, #1
  4063. 8022d3c: f300 8172 bgt.w 8023024 <_strtod_r+0xdac>
  4064. 8022d40: eb07 0787 add.w r7, r7, r7, lsl #2
  4065. 8022d44: 2000 movs r0, #0
  4066. 8022d46: eb01 0747 add.w r7, r1, r7, lsl #1
  4067. 8022d4a: 9d0a ldr r5, [sp, #40] ; 0x28
  4068. 8022d4c: 1c6b adds r3, r5, #1
  4069. 8022d4e: 9317 str r3, [sp, #92] ; 0x5c
  4070. 8022d50: 786d ldrb r5, [r5, #1]
  4071. 8022d52: e613 b.n 802297c <_strtod_r+0x704>
  4072. 8022d54: 9d0f ldr r5, [sp, #60] ; 0x3c
  4073. 8022d56: 4654 mov r4, sl
  4074. 8022d58: bb7d cbnz r5, 8022dba <_strtod_r+0xb42>
  4075. 8022d5a: 9806 ldr r0, [sp, #24]
  4076. 8022d5c: bb68 cbnz r0, 8022dba <_strtod_r+0xb42>
  4077. 8022d5e: 9a07 ldr r2, [sp, #28]
  4078. 8022d60: f3c2 0313 ubfx r3, r2, #0, #20
  4079. 8022d64: bb4b cbnz r3, 8022dba <_strtod_r+0xb42>
  4080. 8022d66: 4643 mov r3, r8
  4081. 8022d68: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  4082. 8022d6c: 4013 ands r3, r2
  4083. 8022d6e: f1b3 6fd6 cmp.w r3, #112197632 ; 0x6b00000
  4084. 8022d72: d922 bls.n 8022dba <_strtod_r+0xb42>
  4085. 8022d74: 6973 ldr r3, [r6, #20]
  4086. 8022d76: b913 cbnz r3, 8022d7e <_strtod_r+0xb06>
  4087. 8022d78: 6933 ldr r3, [r6, #16]
  4088. 8022d7a: 2b01 cmp r3, #1
  4089. 8022d7c: dd1d ble.n 8022dba <_strtod_r+0xb42>
  4090. 8022d7e: 4631 mov r1, r6
  4091. 8022d80: 2201 movs r2, #1
  4092. 8022d82: 4658 mov r0, fp
  4093. 8022d84: f001 fdb6 bl 80248f4 <__lshift>
  4094. 8022d88: 4639 mov r1, r7
  4095. 8022d8a: 4606 mov r6, r0
  4096. 8022d8c: f001 fe0c bl 80249a8 <__mcmp>
  4097. 8022d90: 2800 cmp r0, #0
  4098. 8022d92: dd12 ble.n 8022dba <_strtod_r+0xb42>
  4099. 8022d94: 9d0b ldr r5, [sp, #44] ; 0x2c
  4100. 8022d96: 2d00 cmp r5, #0
  4101. 8022d98: f040 8195 bne.w 80230c6 <_strtod_r+0xe4e>
  4102. 8022d9c: 9807 ldr r0, [sp, #28]
  4103. 8022d9e: f020 4300 bic.w r3, r0, #2147483648 ; 0x80000000
  4104. 8022da2: 0d1b lsrs r3, r3, #20
  4105. 8022da4: 051b lsls r3, r3, #20
  4106. 8022da6: f5a3 1380 sub.w r3, r3, #1048576 ; 0x100000
  4107. 8022daa: f04f 32ff mov.w r2, #4294967295
  4108. 8022dae: 9206 str r2, [sp, #24]
  4109. 8022db0: ea6f 5313 mvn.w r3, r3, lsr #20
  4110. 8022db4: ea6f 5303 mvn.w r3, r3, lsl #20
  4111. 8022db8: 9307 str r3, [sp, #28]
  4112. 8022dba: 9d0b ldr r5, [sp, #44] ; 0x2c
  4113. 8022dbc: 2d00 cmp r5, #0
  4114. 8022dbe: f000 80c8 beq.w 8022f52 <_strtod_r+0xcda>
  4115. 8022dc2: 2200 movs r2, #0
  4116. 8022dc4: 2300 movs r3, #0
  4117. 8022dc6: f6c3 1250 movt r2, #14672 ; 0x3950
  4118. 8022dca: 9314 str r3, [sp, #80] ; 0x50
  4119. 8022dcc: 9215 str r2, [sp, #84] ; 0x54
  4120. 8022dce: e9dd 0106 ldrd r0, r1, [sp, #24]
  4121. 8022dd2: e9dd 2314 ldrd r2, r3, [sp, #80] ; 0x50
  4122. 8022dd6: f7fd fbf3 bl 80205c0 <__aeabi_dmul>
  4123. 8022dda: e9cd 0106 strd r0, r1, [sp, #24]
  4124. 8022dde: 468a mov sl, r1
  4125. 8022de0: 9907 ldr r1, [sp, #28]
  4126. 8022de2: 4681 mov r9, r0
  4127. 8022de4: 2900 cmp r1, #0
  4128. 8022de6: f47f aee4 bne.w 8022bb2 <_strtod_r+0x93a>
  4129. 8022dea: 9a06 ldr r2, [sp, #24]
  4130. 8022dec: 2a00 cmp r2, #0
  4131. 8022dee: f47f aee0 bne.w 8022bb2 <_strtod_r+0x93a>
  4132. 8022df2: e6fe b.n 8022bf2 <_strtod_r+0x97a>
  4133. 8022df4: 9d0f ldr r5, [sp, #60] ; 0x3c
  4134. 8022df6: 4654 mov r4, sl
  4135. 8022df8: f8dd 9024 ldr.w r9, [sp, #36] ; 0x24
  4136. 8022dfc: f8dd a028 ldr.w sl, [sp, #40] ; 0x28
  4137. 8022e00: 2d00 cmp r5, #0
  4138. 8022e02: f000 80d3 beq.w 8022fac <_strtod_r+0xd34>
  4139. 8022e06: 9b07 ldr r3, [sp, #28]
  4140. 8022e08: f64f 72ff movw r2, #65535 ; 0xffff
  4141. 8022e0c: f2c0 020f movt r2, #15
  4142. 8022e10: f023 417f bic.w r1, r3, #4278190080 ; 0xff000000
  4143. 8022e14: f421 0170 bic.w r1, r1, #15728640 ; 0xf00000
  4144. 8022e18: 4291 cmp r1, r2
  4145. 8022e1a: 9906 ldr r1, [sp, #24]
  4146. 8022e1c: f000 8119 beq.w 8023052 <_strtod_r+0xdda>
  4147. 8022e20: 07cb lsls r3, r1, #31
  4148. 8022e22: d5ca bpl.n 8022dba <_strtod_r+0xb42>
  4149. 8022e24: 4648 mov r0, r9
  4150. 8022e26: 4651 mov r1, sl
  4151. 8022e28: f001 fe52 bl 8024ad0 <__ulp>
  4152. 8022e2c: 4602 mov r2, r0
  4153. 8022e2e: 460b mov r3, r1
  4154. 8022e30: 4648 mov r0, r9
  4155. 8022e32: 4651 mov r1, sl
  4156. 8022e34: f7fd fa12 bl 802025c <__adddf3>
  4157. 8022e38: e9cd 0106 strd r0, r1, [sp, #24]
  4158. 8022e3c: e7bd b.n 8022dba <_strtod_r+0xb42>
  4159. 8022e3e: 9814 ldr r0, [sp, #80] ; 0x50
  4160. 8022e40: 3001 adds r0, #1
  4161. 8022e42: f47f ae85 bne.w 8022b50 <_strtod_r+0x8d8>
  4162. 8022e46: 2000 movs r0, #0
  4163. 8022e48: 4654 mov r4, sl
  4164. 8022e4a: 4601 mov r1, r0
  4165. 8022e4c: 2322 movs r3, #34 ; 0x22
  4166. 8022e4e: f6c7 71f0 movt r1, #32752 ; 0x7ff0
  4167. 8022e52: f8cb 3000 str.w r3, [fp]
  4168. 8022e56: 9107 str r1, [sp, #28]
  4169. 8022e58: 4681 mov r9, r0
  4170. 8022e5a: 9006 str r0, [sp, #24]
  4171. 8022e5c: 468a mov sl, r1
  4172. 8022e5e: e6a8 b.n 8022bb2 <_strtod_r+0x93a>
  4173. 8022e60: 2300 movs r3, #0
  4174. 8022e62: 2500 movs r5, #0
  4175. 8022e64: 461c mov r4, r3
  4176. 8022e66: 9506 str r5, [sp, #24]
  4177. 8022e68: f6c7 74f0 movt r4, #32752 ; 0x7ff0
  4178. 8022e6c: 2322 movs r3, #34 ; 0x22
  4179. 8022e6e: 9407 str r4, [sp, #28]
  4180. 8022e70: 46a9 mov r9, r5
  4181. 8022e72: f8cb 3000 str.w r3, [fp]
  4182. 8022e76: 46a2 mov sl, r4
  4183. 8022e78: f7ff bb4b b.w 8022512 <_strtod_r+0x29a>
  4184. 8022e7c: f43f ac35 beq.w 80226ea <_strtod_r+0x472>
  4185. 8022e80: 4264 negs r4, r4
  4186. 8022e82: f014 020f ands.w r2, r4, #15
  4187. 8022e86: d00d beq.n 8022ea4 <_strtod_r+0xc2c>
  4188. 8022e88: f643 4310 movw r3, #15376 ; 0x3c10
  4189. 8022e8c: e9dd 0106 ldrd r0, r1, [sp, #24]
  4190. 8022e90: f6c0 0303 movt r3, #2051 ; 0x803
  4191. 8022e94: eb03 03c2 add.w r3, r3, r2, lsl #3
  4192. 8022e98: e9d3 2300 ldrd r2, r3, [r3]
  4193. 8022e9c: f7fd fcba bl 8020814 <__aeabi_ddiv>
  4194. 8022ea0: e9cd 0106 strd r0, r1, [sp, #24]
  4195. 8022ea4: 1124 asrs r4, r4, #4
  4196. 8022ea6: f43f ac20 beq.w 80226ea <_strtod_r+0x472>
  4197. 8022eaa: 2c1f cmp r4, #31
  4198. 8022eac: dc40 bgt.n 8022f30 <_strtod_r+0xcb8>
  4199. 8022eae: f014 0f10 tst.w r4, #16
  4200. 8022eb2: bf14 ite ne
  4201. 8022eb4: 256a movne r5, #106 ; 0x6a
  4202. 8022eb6: 2500 moveq r5, #0
  4203. 8022eb8: 2c00 cmp r4, #0
  4204. 8022eba: 950b str r5, [sp, #44] ; 0x2c
  4205. 8022ebc: dd17 ble.n 8022eee <_strtod_r+0xc76>
  4206. 8022ebe: f643 25d0 movw r5, #15056 ; 0x3ad0
  4207. 8022ec2: e9dd 2306 ldrd r2, r3, [sp, #24]
  4208. 8022ec6: f6c0 0503 movt r5, #2051 ; 0x803
  4209. 8022eca: f014 0f01 tst.w r4, #1
  4210. 8022ece: 4610 mov r0, r2
  4211. 8022ed0: 4619 mov r1, r3
  4212. 8022ed2: d005 beq.n 8022ee0 <_strtod_r+0xc68>
  4213. 8022ed4: e9d5 2300 ldrd r2, r3, [r5]
  4214. 8022ed8: f7fd fb72 bl 80205c0 <__aeabi_dmul>
  4215. 8022edc: 4602 mov r2, r0
  4216. 8022ede: 460b mov r3, r1
  4217. 8022ee0: 3508 adds r5, #8
  4218. 8022ee2: 1064 asrs r4, r4, #1
  4219. 8022ee4: d1f1 bne.n 8022eca <_strtod_r+0xc52>
  4220. 8022ee6: 4610 mov r0, r2
  4221. 8022ee8: 4619 mov r1, r3
  4222. 8022eea: e9cd 0106 strd r0, r1, [sp, #24]
  4223. 8022eee: 9c0b ldr r4, [sp, #44] ; 0x2c
  4224. 8022ef0: b18c cbz r4, 8022f16 <_strtod_r+0xc9e>
  4225. 8022ef2: 9a07 ldr r2, [sp, #28]
  4226. 8022ef4: f3c2 530a ubfx r3, r2, #20, #11
  4227. 8022ef8: f1c3 036b rsb r3, r3, #107 ; 0x6b
  4228. 8022efc: 2b00 cmp r3, #0
  4229. 8022efe: dd0a ble.n 8022f16 <_strtod_r+0xc9e>
  4230. 8022f00: 2b1f cmp r3, #31
  4231. 8022f02: f340 810a ble.w 802311a <_strtod_r+0xea2>
  4232. 8022f06: 2100 movs r1, #0
  4233. 8022f08: 2b34 cmp r3, #52 ; 0x34
  4234. 8022f0a: 9106 str r1, [sp, #24]
  4235. 8022f0c: f340 810d ble.w 802312a <_strtod_r+0xeb2>
  4236. 8022f10: f04f 725c mov.w r2, #57671680 ; 0x3700000
  4237. 8022f14: 9207 str r2, [sp, #28]
  4238. 8022f16: 9d06 ldr r5, [sp, #24]
  4239. 8022f18: 2200 movs r2, #0
  4240. 8022f1a: 9c07 ldr r4, [sp, #28]
  4241. 8022f1c: 2300 movs r3, #0
  4242. 8022f1e: 4628 mov r0, r5
  4243. 8022f20: 46a9 mov r9, r5
  4244. 8022f22: 4621 mov r1, r4
  4245. 8022f24: 46a2 mov sl, r4
  4246. 8022f26: f7fd fdb3 bl 8020a90 <__aeabi_dcmpeq>
  4247. 8022f2a: 2800 cmp r0, #0
  4248. 8022f2c: f43f abe2 beq.w 80226f4 <_strtod_r+0x47c>
  4249. 8022f30: f04f 0900 mov.w r9, #0
  4250. 8022f34: 2322 movs r3, #34 ; 0x22
  4251. 8022f36: 46ca mov sl, r9
  4252. 8022f38: f8cb 3000 str.w r3, [fp]
  4253. 8022f3c: f7ff bae9 b.w 8022512 <_strtod_r+0x29a>
  4254. 8022f40: 9a0f ldr r2, [sp, #60] ; 0x3c
  4255. 8022f42: 2300 movs r3, #0
  4256. 8022f44: 4699 mov r9, r3
  4257. 8022f46: f6cb 73e0 movt r3, #49120 ; 0xbfe0
  4258. 8022f4a: f6c3 79e0 movt r9, #16352 ; 0x3fe0
  4259. 8022f4e: 920c str r2, [sp, #48] ; 0x30
  4260. 8022f50: e5bf b.n 8022ad2 <_strtod_r+0x85a>
  4261. 8022f52: f8dd 9018 ldr.w r9, [sp, #24]
  4262. 8022f56: f8dd a01c ldr.w sl, [sp, #28]
  4263. 8022f5a: e62a b.n 8022bb2 <_strtod_r+0x93a>
  4264. 8022f5c: f04f 0900 mov.w r9, #0
  4265. 8022f60: 3601 adds r6, #1
  4266. 8022f62: 46ca mov sl, r9
  4267. 8022f64: 9617 str r6, [sp, #92] ; 0x5c
  4268. 8022f66: f7ff bad4 b.w 8022512 <_strtod_r+0x29a>
  4269. 8022f6a: 9c09 ldr r4, [sp, #36] ; 0x24
  4270. 8022f6c: f1c8 0325 rsb r3, r8, #37 ; 0x25
  4271. 8022f70: 429c cmp r4, r3
  4272. 8022f72: f73f ab9d bgt.w 80226b0 <_strtod_r+0x438>
  4273. 8022f76: f1c8 080f rsb r8, r8, #15
  4274. 8022f7a: f643 4410 movw r4, #15376 ; 0x3c10
  4275. 8022f7e: f6c0 0403 movt r4, #2051 ; 0x803
  4276. 8022f82: e9dd 2306 ldrd r2, r3, [sp, #24]
  4277. 8022f86: eb04 01c8 add.w r1, r4, r8, lsl #3
  4278. 8022f8a: e9d1 0100 ldrd r0, r1, [r1]
  4279. 8022f8e: f7fd fb17 bl 80205c0 <__aeabi_dmul>
  4280. 8022f92: 9d09 ldr r5, [sp, #36] ; 0x24
  4281. 8022f94: ebc8 0805 rsb r8, r8, r5
  4282. 8022f98: eb04 04c8 add.w r4, r4, r8, lsl #3
  4283. 8022f9c: e9d4 2300 ldrd r2, r3, [r4]
  4284. 8022fa0: f7fd fb0e bl 80205c0 <__aeabi_dmul>
  4285. 8022fa4: 4681 mov r9, r0
  4286. 8022fa6: 468a mov sl, r1
  4287. 8022fa8: f7ff bab3 b.w 8022512 <_strtod_r+0x29a>
  4288. 8022fac: 9907 ldr r1, [sp, #28]
  4289. 8022fae: f3c1 0313 ubfx r3, r1, #0, #20
  4290. 8022fb2: 2b00 cmp r3, #0
  4291. 8022fb4: d141 bne.n 802303a <_strtod_r+0xdc2>
  4292. 8022fb6: 9b06 ldr r3, [sp, #24]
  4293. 8022fb8: 2b00 cmp r3, #0
  4294. 8022fba: f43f aeeb beq.w 8022d94 <_strtod_r+0xb1c>
  4295. 8022fbe: 07da lsls r2, r3, #31
  4296. 8022fc0: f57f aefb bpl.w 8022dba <_strtod_r+0xb42>
  4297. 8022fc4: 4648 mov r0, r9
  4298. 8022fc6: 4651 mov r1, sl
  4299. 8022fc8: f001 fd82 bl 8024ad0 <__ulp>
  4300. 8022fcc: 4602 mov r2, r0
  4301. 8022fce: 460b mov r3, r1
  4302. 8022fd0: 4648 mov r0, r9
  4303. 8022fd2: 4651 mov r1, sl
  4304. 8022fd4: f7fd f940 bl 8020258 <__aeabi_dsub>
  4305. 8022fd8: 4602 mov r2, r0
  4306. 8022fda: 460b mov r3, r1
  4307. 8022fdc: e9cd 2306 strd r2, r3, [sp, #24]
  4308. 8022fe0: 2200 movs r2, #0
  4309. 8022fe2: 2300 movs r3, #0
  4310. 8022fe4: f7fd fd54 bl 8020a90 <__aeabi_dcmpeq>
  4311. 8022fe8: 2800 cmp r0, #0
  4312. 8022fea: f47f adff bne.w 8022bec <_strtod_r+0x974>
  4313. 8022fee: e6e4 b.n 8022dba <_strtod_r+0xb42>
  4314. 8022ff0: 9d09 ldr r5, [sp, #36] ; 0x24
  4315. 8022ff2: 426d negs r5, r5
  4316. 8022ff4: 950d str r5, [sp, #52] ; 0x34
  4317. 8022ff6: f7ff bb8b b.w 8022710 <_strtod_r+0x498>
  4318. 8022ffa: 9c09 ldr r4, [sp, #36] ; 0x24
  4319. 8022ffc: f114 0f16 cmn.w r4, #22
  4320. 8023000: f6ff ab56 blt.w 80226b0 <_strtod_r+0x438>
  4321. 8023004: f643 4310 movw r3, #15376 ; 0x3c10
  4322. 8023008: e9dd 0106 ldrd r0, r1, [sp, #24]
  4323. 802300c: f6c0 0303 movt r3, #2051 ; 0x803
  4324. 8023010: eba3 03c4 sub.w r3, r3, r4, lsl #3
  4325. 8023014: e9d3 2300 ldrd r2, r3, [r3]
  4326. 8023018: f7fd fbfc bl 8020814 <__aeabi_ddiv>
  4327. 802301c: 4681 mov r9, r0
  4328. 802301e: 468a mov sl, r1
  4329. 8023020: f7ff ba77 b.w 8022512 <_strtod_r+0x29a>
  4330. 8023024: 2000 movs r0, #0
  4331. 8023026: f1b8 0f10 cmp.w r8, #16
  4332. 802302a: f73f ae8e bgt.w 8022d4a <_strtod_r+0xad2>
  4333. 802302e: eb0a 0a8a add.w sl, sl, sl, lsl #2
  4334. 8023032: 2000 movs r0, #0
  4335. 8023034: eb01 0a4a add.w sl, r1, sl, lsl #1
  4336. 8023038: e687 b.n 8022d4a <_strtod_r+0xad2>
  4337. 802303a: 9b06 ldr r3, [sp, #24]
  4338. 802303c: e7bf b.n 8022fbe <_strtod_r+0xd46>
  4339. 802303e: f101 7154 add.w r1, r1, #55574528 ; 0x3500000
  4340. 8023042: 2400 movs r4, #0
  4341. 8023044: 9107 str r1, [sp, #28]
  4342. 8023046: 468a mov sl, r1
  4343. 8023048: 940b str r4, [sp, #44] ; 0x2c
  4344. 802304a: f8dd 9018 ldr.w r9, [sp, #24]
  4345. 802304e: f7ff bb51 b.w 80226f4 <_strtod_r+0x47c>
  4346. 8023052: 9d0b ldr r5, [sp, #44] ; 0x2c
  4347. 8023054: b1d5 cbz r5, 802308c <_strtod_r+0xe14>
  4348. 8023056: 2200 movs r2, #0
  4349. 8023058: f6c7 72f0 movt r2, #32752 ; 0x7ff0
  4350. 802305c: 401a ands r2, r3
  4351. 802305e: f1b2 6fd4 cmp.w r2, #111149056 ; 0x6a00000
  4352. 8023062: d813 bhi.n 802308c <_strtod_r+0xe14>
  4353. 8023064: 0d12 lsrs r2, r2, #20
  4354. 8023066: f04f 30ff mov.w r0, #4294967295
  4355. 802306a: f1c2 026b rsb r2, r2, #107 ; 0x6b
  4356. 802306e: fa00 f202 lsl.w r2, r0, r2
  4357. 8023072: 4291 cmp r1, r2
  4358. 8023074: f47f aed4 bne.w 8022e20 <_strtod_r+0xba8>
  4359. 8023078: 2200 movs r2, #0
  4360. 802307a: 2000 movs r0, #0
  4361. 802307c: f6c7 72f0 movt r2, #32752 ; 0x7ff0
  4362. 8023080: 9006 str r0, [sp, #24]
  4363. 8023082: 401a ands r2, r3
  4364. 8023084: f502 1280 add.w r2, r2, #1048576 ; 0x100000
  4365. 8023088: 9207 str r2, [sp, #28]
  4366. 802308a: e696 b.n 8022dba <_strtod_r+0xb42>
  4367. 802308c: f04f 32ff mov.w r2, #4294967295
  4368. 8023090: e7ef b.n 8023072 <_strtod_r+0xdfa>
  4369. 8023092: 4c2a ldr r4, [pc, #168] ; (802313c <_strtod_r+0xec4>)
  4370. 8023094: 4611 mov r1, r2
  4371. 8023096: 9217 str r2, [sp, #92] ; 0x5c
  4372. 8023098: f814 0f01 ldrb.w r0, [r4, #1]!
  4373. 802309c: 460b mov r3, r1
  4374. 802309e: b310 cbz r0, 80230e6 <_strtod_r+0xe6e>
  4375. 80230a0: 785b ldrb r3, [r3, #1]
  4376. 80230a2: 3101 adds r1, #1
  4377. 80230a4: 2b40 cmp r3, #64 ; 0x40
  4378. 80230a6: dd02 ble.n 80230ae <_strtod_r+0xe36>
  4379. 80230a8: 2b5a cmp r3, #90 ; 0x5a
  4380. 80230aa: bfd8 it le
  4381. 80230ac: 3320 addle r3, #32
  4382. 80230ae: 4283 cmp r3, r0
  4383. 80230b0: d0f2 beq.n 8023098 <_strtod_r+0xe20>
  4384. 80230b2: 3201 adds r2, #1
  4385. 80230b4: 9217 str r2, [sp, #92] ; 0x5c
  4386. 80230b6: 2500 movs r5, #0
  4387. 80230b8: 9506 str r5, [sp, #24]
  4388. 80230ba: 4628 mov r0, r5
  4389. 80230bc: f6c7 70f0 movt r0, #32752 ; 0x7ff0
  4390. 80230c0: 9007 str r0, [sp, #28]
  4391. 80230c2: f7ff baa9 b.w 8022618 <_strtod_r+0x3a0>
  4392. 80230c6: 9907 ldr r1, [sp, #28]
  4393. 80230c8: f021 4300 bic.w r3, r1, #2147483648 ; 0x80000000
  4394. 80230cc: 0d1b lsrs r3, r3, #20
  4395. 80230ce: 051b lsls r3, r3, #20
  4396. 80230d0: f1b3 6fd6 cmp.w r3, #112197632 ; 0x6b00000
  4397. 80230d4: f63f ae67 bhi.w 8022da6 <_strtod_r+0xb2e>
  4398. 80230d8: f1b3 7f5c cmp.w r3, #57671680 ; 0x3700000
  4399. 80230dc: f63f ae71 bhi.w 8022dc2 <_strtod_r+0xb4a>
  4400. 80230e0: e584 b.n 8022bec <_strtod_r+0x974>
  4401. 80230e2: 4643 mov r3, r8
  4402. 80230e4: e627 b.n 8022d36 <_strtod_r+0xabe>
  4403. 80230e6: 3101 adds r1, #1
  4404. 80230e8: 9117 str r1, [sp, #92] ; 0x5c
  4405. 80230ea: e7e4 b.n 80230b6 <_strtod_r+0xe3e>
  4406. 80230ec: f04f 0900 mov.w r9, #0
  4407. 80230f0: f6c0 0a03 movt sl, #2051 ; 0x803
  4408. 80230f4: e47f b.n 80229f6 <_strtod_r+0x77e>
  4409. 80230f6: a817 add r0, sp, #92 ; 0x5c
  4410. 80230f8: 4911 ldr r1, [pc, #68] ; (8023140 <_strtod_r+0xec8>)
  4411. 80230fa: aa1a add r2, sp, #104 ; 0x68
  4412. 80230fc: f000 fd7e bl 8023bfc <__hexnan>
  4413. 8023100: 2805 cmp r0, #5
  4414. 8023102: f47f aa83 bne.w 802260c <_strtod_r+0x394>
  4415. 8023106: 9b1b ldr r3, [sp, #108] ; 0x6c
  4416. 8023108: 9a1a ldr r2, [sp, #104] ; 0x68
  4417. 802310a: f043 43ff orr.w r3, r3, #2139095040 ; 0x7f800000
  4418. 802310e: f443 03e0 orr.w r3, r3, #7340032 ; 0x700000
  4419. 8023112: 9307 str r3, [sp, #28]
  4420. 8023114: 9206 str r2, [sp, #24]
  4421. 8023116: f7ff ba7f b.w 8022618 <_strtod_r+0x3a0>
  4422. 802311a: f04f 32ff mov.w r2, #4294967295
  4423. 802311e: 9c06 ldr r4, [sp, #24]
  4424. 8023120: fa02 f303 lsl.w r3, r2, r3
  4425. 8023124: 401c ands r4, r3
  4426. 8023126: 9406 str r4, [sp, #24]
  4427. 8023128: e6f5 b.n 8022f16 <_strtod_r+0xc9e>
  4428. 802312a: f04f 31ff mov.w r1, #4294967295
  4429. 802312e: 3b20 subs r3, #32
  4430. 8023130: fa01 f303 lsl.w r3, r1, r3
  4431. 8023134: 4013 ands r3, r2
  4432. 8023136: 9307 str r3, [sp, #28]
  4433. 8023138: e6ed b.n 8022f16 <_strtod_r+0xc9e>
  4434. 802313a: bf00 nop
  4435. 802313c: 0803b6eb .word 0x0803b6eb
  4436. 8023140: 20000014 .word 0x20000014
  4437. 08023144 <strtod>:
  4438. 8023144: f240 032c movw r3, #44 ; 0x2c
  4439. 8023148: 460a mov r2, r1
  4440. 802314a: f2c2 0300 movt r3, #8192 ; 0x2000
  4441. 802314e: 4601 mov r1, r0
  4442. 8023150: 6818 ldr r0, [r3, #0]
  4443. 8023152: f7ff b891 b.w 8022278 <_strtod_r>
  4444. 8023156: bf00 nop
  4445. 08023158 <strtof>:
  4446. 8023158: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  4447. 802315c: f240 062c movw r6, #44 ; 0x2c
  4448. 8023160: f2c2 0600 movt r6, #8192 ; 0x2000
  4449. 8023164: 460a mov r2, r1
  4450. 8023166: 4601 mov r1, r0
  4451. 8023168: f04f 0801 mov.w r8, #1
  4452. 802316c: 6830 ldr r0, [r6, #0]
  4453. 802316e: f7ff f883 bl 8022278 <_strtod_r>
  4454. 8023172: 460d mov r5, r1
  4455. 8023174: 4604 mov r4, r0
  4456. 8023176: f7fd fce5 bl 8020b44 <__aeabi_d2f>
  4457. 802317a: 2100 movs r1, #0
  4458. 802317c: 4607 mov r7, r0
  4459. 802317e: f001 ff41 bl 8025004 <__aeabi_fcmpeq>
  4460. 8023182: b908 cbnz r0, 8023188 <strtof+0x30>
  4461. 8023184: f04f 0800 mov.w r8, #0
  4462. 8023188: 4620 mov r0, r4
  4463. 802318a: 4629 mov r1, r5
  4464. 802318c: 2200 movs r2, #0
  4465. 802318e: 2300 movs r3, #0
  4466. 8023190: f04f 0901 mov.w r9, #1
  4467. 8023194: f7fd fc7c bl 8020a90 <__aeabi_dcmpeq>
  4468. 8023198: b108 cbz r0, 802319e <strtof+0x46>
  4469. 802319a: f04f 0900 mov.w r9, #0
  4470. 802319e: ea08 0809 and.w r8, r8, r9
  4471. 80231a2: f018 0fff tst.w r8, #255 ; 0xff
  4472. 80231a6: d116 bne.n 80231d6 <strtof+0x7e>
  4473. 80231a8: f64f 71ff movw r1, #65535 ; 0xffff
  4474. 80231ac: 4638 mov r0, r7
  4475. 80231ae: f6c7 717f movt r1, #32639 ; 0x7f7f
  4476. 80231b2: f001 ff4f bl 8025054 <__aeabi_fcmpgt>
  4477. 80231b6: b9a0 cbnz r0, 80231e2 <strtof+0x8a>
  4478. 80231b8: 4638 mov r0, r7
  4479. 80231ba: f46f 0100 mvn.w r1, #8388608 ; 0x800000
  4480. 80231be: f001 ff2b bl 8025018 <__aeabi_fcmplt>
  4481. 80231c2: b158 cbz r0, 80231dc <strtof+0x84>
  4482. 80231c4: 4620 mov r0, r4
  4483. 80231c6: 4629 mov r1, r5
  4484. 80231c8: f04f 32ff mov.w r2, #4294967295
  4485. 80231cc: f46f 1380 mvn.w r3, #1048576 ; 0x100000
  4486. 80231d0: f7fd fc68 bl 8020aa4 <__aeabi_dcmplt>
  4487. 80231d4: b910 cbnz r0, 80231dc <strtof+0x84>
  4488. 80231d6: 6833 ldr r3, [r6, #0]
  4489. 80231d8: 2222 movs r2, #34 ; 0x22
  4490. 80231da: 601a str r2, [r3, #0]
  4491. 80231dc: 4638 mov r0, r7
  4492. 80231de: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  4493. 80231e2: f64f 73ff movw r3, #65535 ; 0xffff
  4494. 80231e6: 4620 mov r0, r4
  4495. 80231e8: 4629 mov r1, r5
  4496. 80231ea: f04f 32ff mov.w r2, #4294967295
  4497. 80231ee: f6c7 73ef movt r3, #32751 ; 0x7fef
  4498. 80231f2: f7fd fc75 bl 8020ae0 <__aeabi_dcmpgt>
  4499. 80231f6: 2800 cmp r0, #0
  4500. 80231f8: d0ed beq.n 80231d6 <strtof+0x7e>
  4501. 80231fa: e7dd b.n 80231b8 <strtof+0x60>
  4502. 80231fc: f3af 8000 nop.w
  4503. 08023200 <_strtol_r>:
  4504. 8023200: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  4505. 8023204: f240 0428 movw r4, #40 ; 0x28
  4506. 8023208: f2c2 0400 movt r4, #8192 ; 0x2000
  4507. 802320c: b085 sub sp, #20
  4508. 802320e: 4699 mov r9, r3
  4509. 8023210: 460b mov r3, r1
  4510. 8023212: f8d4 8000 ldr.w r8, [r4]
  4511. 8023216: 9102 str r1, [sp, #8]
  4512. 8023218: 9003 str r0, [sp, #12]
  4513. 802321a: 461c mov r4, r3
  4514. 802321c: f814 5b01 ldrb.w r5, [r4], #1
  4515. 8023220: eb08 0105 add.w r1, r8, r5
  4516. 8023224: 4623 mov r3, r4
  4517. 8023226: 7849 ldrb r1, [r1, #1]
  4518. 8023228: f001 0108 and.w r1, r1, #8
  4519. 802322c: b2c9 uxtb r1, r1
  4520. 802322e: 2900 cmp r1, #0
  4521. 8023230: d1f3 bne.n 802321a <_strtol_r+0x1a>
  4522. 8023232: 2d2d cmp r5, #45 ; 0x2d
  4523. 8023234: d07b beq.n 802332e <_strtol_r+0x12e>
  4524. 8023236: 2d2b cmp r5, #43 ; 0x2b
  4525. 8023238: bf05 ittet eq
  4526. 802323a: 4624 moveq r4, r4
  4527. 802323c: 460b moveq r3, r1
  4528. 802323e: 460b movne r3, r1
  4529. 8023240: f814 5b01 ldrbeq.w r5, [r4], #1
  4530. 8023244: f039 0110 bics.w r1, r9, #16
  4531. 8023248: d112 bne.n 8023270 <_strtol_r+0x70>
  4532. 802324a: f1d9 0001 rsbs r0, r9, #1
  4533. 802324e: bf38 it cc
  4534. 8023250: 2000 movcc r0, #0
  4535. 8023252: 2d30 cmp r5, #48 ; 0x30
  4536. 8023254: d004 beq.n 8023260 <_strtol_r+0x60>
  4537. 8023256: b158 cbz r0, 8023270 <_strtol_r+0x70>
  4538. 8023258: f04f 090a mov.w r9, #10
  4539. 802325c: 46cb mov fp, r9
  4540. 802325e: e008 b.n 8023272 <_strtol_r+0x72>
  4541. 8023260: 7821 ldrb r1, [r4, #0]
  4542. 8023262: f001 01df and.w r1, r1, #223 ; 0xdf
  4543. 8023266: 2958 cmp r1, #88 ; 0x58
  4544. 8023268: d065 beq.n 8023336 <_strtol_r+0x136>
  4545. 802326a: b108 cbz r0, 8023270 <_strtol_r+0x70>
  4546. 802326c: f04f 0908 mov.w r9, #8
  4547. 8023270: 46cb mov fp, r9
  4548. 8023272: 2b00 cmp r3, #0
  4549. 8023274: 4659 mov r1, fp
  4550. 8023276: bf0c ite eq
  4551. 8023278: f06f 4600 mvneq.w r6, #2147483648 ; 0x80000000
  4552. 802327c: f04f 4600 movne.w r6, #2147483648 ; 0x80000000
  4553. 8023280: e88d 000c stmia.w sp, {r2, r3}
  4554. 8023284: 4630 mov r0, r6
  4555. 8023286: 2700 movs r7, #0
  4556. 8023288: f7fe f964 bl 8021554 <__aeabi_uidivmod>
  4557. 802328c: 4630 mov r0, r6
  4558. 802328e: 468a mov sl, r1
  4559. 8023290: 4659 mov r1, fp
  4560. 8023292: f7fe f831 bl 80212f8 <__aeabi_uidiv>
  4561. 8023296: 46bc mov ip, r7
  4562. 8023298: e89d 000c ldmia.w sp, {r2, r3}
  4563. 802329c: e016 b.n 80232cc <_strtol_r+0xcc>
  4564. 802329e: 3d30 subs r5, #48 ; 0x30
  4565. 80232a0: 45a9 cmp r9, r5
  4566. 80232a2: dd25 ble.n 80232f0 <_strtol_r+0xf0>
  4567. 80232a4: 4584 cmp ip, r0
  4568. 80232a6: bf94 ite ls
  4569. 80232a8: 2100 movls r1, #0
  4570. 80232aa: 2101 movhi r1, #1
  4571. 80232ac: ea51 77d7 orrs.w r7, r1, r7, lsr #31
  4572. 80232b0: d129 bne.n 8023306 <_strtol_r+0x106>
  4573. 80232b2: 4555 cmp r5, sl
  4574. 80232b4: bfd4 ite le
  4575. 80232b6: 2100 movle r1, #0
  4576. 80232b8: 2101 movgt r1, #1
  4577. 80232ba: 4584 cmp ip, r0
  4578. 80232bc: bf18 it ne
  4579. 80232be: 2100 movne r1, #0
  4580. 80232c0: bb09 cbnz r1, 8023306 <_strtol_r+0x106>
  4581. 80232c2: fb0b 5c0c mla ip, fp, ip, r5
  4582. 80232c6: 2701 movs r7, #1
  4583. 80232c8: f814 5b01 ldrb.w r5, [r4], #1
  4584. 80232cc: eb08 0105 add.w r1, r8, r5
  4585. 80232d0: 7849 ldrb r1, [r1, #1]
  4586. 80232d2: f001 0604 and.w r6, r1, #4
  4587. 80232d6: b2f6 uxtb r6, r6
  4588. 80232d8: 2e00 cmp r6, #0
  4589. 80232da: d1e0 bne.n 802329e <_strtol_r+0x9e>
  4590. 80232dc: f011 0103 ands.w r1, r1, #3
  4591. 80232e0: d006 beq.n 80232f0 <_strtol_r+0xf0>
  4592. 80232e2: 2901 cmp r1, #1
  4593. 80232e4: bf14 ite ne
  4594. 80232e6: 2157 movne r1, #87 ; 0x57
  4595. 80232e8: 2137 moveq r1, #55 ; 0x37
  4596. 80232ea: 1a6d subs r5, r5, r1
  4597. 80232ec: 45a9 cmp r9, r5
  4598. 80232ee: dcd9 bgt.n 80232a4 <_strtol_r+0xa4>
  4599. 80232f0: 1c79 adds r1, r7, #1
  4600. 80232f2: d00b beq.n 802330c <_strtol_r+0x10c>
  4601. 80232f4: b9c3 cbnz r3, 8023328 <_strtol_r+0x128>
  4602. 80232f6: 4660 mov r0, ip
  4603. 80232f8: b112 cbz r2, 8023300 <_strtol_r+0x100>
  4604. 80232fa: b997 cbnz r7, 8023322 <_strtol_r+0x122>
  4605. 80232fc: 9b02 ldr r3, [sp, #8]
  4606. 80232fe: 6013 str r3, [r2, #0]
  4607. 8023300: b005 add sp, #20
  4608. 8023302: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  4609. 8023306: f04f 37ff mov.w r7, #4294967295
  4610. 802330a: e7dd b.n 80232c8 <_strtol_r+0xc8>
  4611. 802330c: 9903 ldr r1, [sp, #12]
  4612. 802330e: 2b00 cmp r3, #0
  4613. 8023310: bf0c ite eq
  4614. 8023312: f06f 4000 mvneq.w r0, #2147483648 ; 0x80000000
  4615. 8023316: f04f 4000 movne.w r0, #2147483648 ; 0x80000000
  4616. 802331a: 2322 movs r3, #34 ; 0x22
  4617. 802331c: 600b str r3, [r1, #0]
  4618. 802331e: 2a00 cmp r2, #0
  4619. 8023320: d0ee beq.n 8023300 <_strtol_r+0x100>
  4620. 8023322: 3c01 subs r4, #1
  4621. 8023324: 9402 str r4, [sp, #8]
  4622. 8023326: e7e9 b.n 80232fc <_strtol_r+0xfc>
  4623. 8023328: f1cc 0c00 rsb ip, ip, #0
  4624. 802332c: e7e3 b.n 80232f6 <_strtol_r+0xf6>
  4625. 802332e: f814 5b01 ldrb.w r5, [r4], #1
  4626. 8023332: 2301 movs r3, #1
  4627. 8023334: e786 b.n 8023244 <_strtol_r+0x44>
  4628. 8023336: f04f 0910 mov.w r9, #16
  4629. 802333a: 7865 ldrb r5, [r4, #1]
  4630. 802333c: 46cb mov fp, r9
  4631. 802333e: 3402 adds r4, #2
  4632. 8023340: e797 b.n 8023272 <_strtol_r+0x72>
  4633. 8023342: bf00 nop
  4634. 08023344 <strtol>:
  4635. 8023344: b430 push {r4, r5}
  4636. 8023346: f240 042c movw r4, #44 ; 0x2c
  4637. 802334a: f2c2 0400 movt r4, #8192 ; 0x2000
  4638. 802334e: 460d mov r5, r1
  4639. 8023350: 4613 mov r3, r2
  4640. 8023352: 4601 mov r1, r0
  4641. 8023354: 462a mov r2, r5
  4642. 8023356: 6820 ldr r0, [r4, #0]
  4643. 8023358: bc30 pop {r4, r5}
  4644. 802335a: f7ff bf51 b.w 8023200 <_strtol_r>
  4645. 802335e: bf00 nop
  4646. 08023360 <_malloc_trim_r>:
  4647. 8023360: b5f8 push {r3, r4, r5, r6, r7, lr}
  4648. 8023362: f240 149c movw r4, #412 ; 0x19c
  4649. 8023366: f2c2 0400 movt r4, #8192 ; 0x2000
  4650. 802336a: 460f mov r7, r1
  4651. 802336c: 4605 mov r5, r0
  4652. 802336e: f001 f895 bl 802449c <__malloc_lock>
  4653. 8023372: 68a3 ldr r3, [r4, #8]
  4654. 8023374: 685e ldr r6, [r3, #4]
  4655. 8023376: f026 0603 bic.w r6, r6, #3
  4656. 802337a: f606 73ef addw r3, r6, #4079 ; 0xfef
  4657. 802337e: 1bdf subs r7, r3, r7
  4658. 8023380: 0b3f lsrs r7, r7, #12
  4659. 8023382: 3f01 subs r7, #1
  4660. 8023384: 033f lsls r7, r7, #12
  4661. 8023386: f5b7 5f80 cmp.w r7, #4096 ; 0x1000
  4662. 802338a: db07 blt.n 802339c <_malloc_trim_r+0x3c>
  4663. 802338c: 2100 movs r1, #0
  4664. 802338e: 4628 mov r0, r5
  4665. 8023390: f001 fd10 bl 8024db4 <_sbrk_r>
  4666. 8023394: 68a3 ldr r3, [r4, #8]
  4667. 8023396: 199b adds r3, r3, r6
  4668. 8023398: 4298 cmp r0, r3
  4669. 802339a: d004 beq.n 80233a6 <_malloc_trim_r+0x46>
  4670. 802339c: 4628 mov r0, r5
  4671. 802339e: f001 f87f bl 80244a0 <__malloc_unlock>
  4672. 80233a2: 2000 movs r0, #0
  4673. 80233a4: bdf8 pop {r3, r4, r5, r6, r7, pc}
  4674. 80233a6: 4279 negs r1, r7
  4675. 80233a8: 4628 mov r0, r5
  4676. 80233aa: f001 fd03 bl 8024db4 <_sbrk_r>
  4677. 80233ae: 3001 adds r0, #1
  4678. 80233b0: d010 beq.n 80233d4 <_malloc_trim_r+0x74>
  4679. 80233b2: f641 1318 movw r3, #6424 ; 0x1918
  4680. 80233b6: 68a1 ldr r1, [r4, #8]
  4681. 80233b8: f2c2 0300 movt r3, #8192 ; 0x2000
  4682. 80233bc: 1bf6 subs r6, r6, r7
  4683. 80233be: 4628 mov r0, r5
  4684. 80233c0: f046 0601 orr.w r6, r6, #1
  4685. 80233c4: 681a ldr r2, [r3, #0]
  4686. 80233c6: 604e str r6, [r1, #4]
  4687. 80233c8: 1bd7 subs r7, r2, r7
  4688. 80233ca: 601f str r7, [r3, #0]
  4689. 80233cc: f001 f868 bl 80244a0 <__malloc_unlock>
  4690. 80233d0: 2001 movs r0, #1
  4691. 80233d2: bdf8 pop {r3, r4, r5, r6, r7, pc}
  4692. 80233d4: 2100 movs r1, #0
  4693. 80233d6: 4628 mov r0, r5
  4694. 80233d8: f001 fcec bl 8024db4 <_sbrk_r>
  4695. 80233dc: 68a3 ldr r3, [r4, #8]
  4696. 80233de: 1ac2 subs r2, r0, r3
  4697. 80233e0: 2a0f cmp r2, #15
  4698. 80233e2: dddb ble.n 802339c <_malloc_trim_r+0x3c>
  4699. 80233e4: f240 54a4 movw r4, #1444 ; 0x5a4
  4700. 80233e8: f641 1118 movw r1, #6424 ; 0x1918
  4701. 80233ec: f2c2 0400 movt r4, #8192 ; 0x2000
  4702. 80233f0: f2c2 0100 movt r1, #8192 ; 0x2000
  4703. 80233f4: f042 0201 orr.w r2, r2, #1
  4704. 80233f8: 605a str r2, [r3, #4]
  4705. 80233fa: 6823 ldr r3, [r4, #0]
  4706. 80233fc: 1ac0 subs r0, r0, r3
  4707. 80233fe: 6008 str r0, [r1, #0]
  4708. 8023400: e7cc b.n 802339c <_malloc_trim_r+0x3c>
  4709. 8023402: bf00 nop
  4710. 08023404 <_free_r>:
  4711. 8023404: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  4712. 8023408: 460e mov r6, r1
  4713. 802340a: 4680 mov r8, r0
  4714. 802340c: 2900 cmp r1, #0
  4715. 802340e: d05c beq.n 80234ca <_free_r+0xc6>
  4716. 8023410: f001 f844 bl 802449c <__malloc_lock>
  4717. 8023414: f240 159c movw r5, #412 ; 0x19c
  4718. 8023418: f856 1c04 ldr.w r1, [r6, #-4]
  4719. 802341c: f2c2 0500 movt r5, #8192 ; 0x2000
  4720. 8023420: f1a6 0408 sub.w r4, r6, #8
  4721. 8023424: f021 0301 bic.w r3, r1, #1
  4722. 8023428: 68af ldr r7, [r5, #8]
  4723. 802342a: 18e2 adds r2, r4, r3
  4724. 802342c: 4297 cmp r7, r2
  4725. 802342e: 6850 ldr r0, [r2, #4]
  4726. 8023430: f020 0003 bic.w r0, r0, #3
  4727. 8023434: d067 beq.n 8023506 <_free_r+0x102>
  4728. 8023436: f011 0101 ands.w r1, r1, #1
  4729. 802343a: 6050 str r0, [r2, #4]
  4730. 802343c: d035 beq.n 80234aa <_free_r+0xa6>
  4731. 802343e: 2100 movs r1, #0
  4732. 8023440: 1816 adds r6, r2, r0
  4733. 8023442: 6876 ldr r6, [r6, #4]
  4734. 8023444: f016 0f01 tst.w r6, #1
  4735. 8023448: d106 bne.n 8023458 <_free_r+0x54>
  4736. 802344a: 181b adds r3, r3, r0
  4737. 802344c: 6890 ldr r0, [r2, #8]
  4738. 802344e: 2900 cmp r1, #0
  4739. 8023450: d04d beq.n 80234ee <_free_r+0xea>
  4740. 8023452: 68d2 ldr r2, [r2, #12]
  4741. 8023454: 60c2 str r2, [r0, #12]
  4742. 8023456: 6090 str r0, [r2, #8]
  4743. 8023458: f043 0201 orr.w r2, r3, #1
  4744. 802345c: 50e3 str r3, [r4, r3]
  4745. 802345e: 6062 str r2, [r4, #4]
  4746. 8023460: b9f1 cbnz r1, 80234a0 <_free_r+0x9c>
  4747. 8023462: f5b3 7f00 cmp.w r3, #512 ; 0x200
  4748. 8023466: d332 bcc.n 80234ce <_free_r+0xca>
  4749. 8023468: 0a5a lsrs r2, r3, #9
  4750. 802346a: 2a04 cmp r2, #4
  4751. 802346c: d86c bhi.n 8023548 <_free_r+0x144>
  4752. 802346e: 0998 lsrs r0, r3, #6
  4753. 8023470: 3038 adds r0, #56 ; 0x38
  4754. 8023472: 0041 lsls r1, r0, #1
  4755. 8023474: eb05 0581 add.w r5, r5, r1, lsl #2
  4756. 8023478: f240 119c movw r1, #412 ; 0x19c
  4757. 802347c: f2c2 0100 movt r1, #8192 ; 0x2000
  4758. 8023480: 68aa ldr r2, [r5, #8]
  4759. 8023482: 42aa cmp r2, r5
  4760. 8023484: d06b beq.n 802355e <_free_r+0x15a>
  4761. 8023486: 6851 ldr r1, [r2, #4]
  4762. 8023488: f021 0103 bic.w r1, r1, #3
  4763. 802348c: 428b cmp r3, r1
  4764. 802348e: d202 bcs.n 8023496 <_free_r+0x92>
  4765. 8023490: 6892 ldr r2, [r2, #8]
  4766. 8023492: 4295 cmp r5, r2
  4767. 8023494: d1f7 bne.n 8023486 <_free_r+0x82>
  4768. 8023496: 68d3 ldr r3, [r2, #12]
  4769. 8023498: 60e3 str r3, [r4, #12]
  4770. 802349a: 60a2 str r2, [r4, #8]
  4771. 802349c: 60d4 str r4, [r2, #12]
  4772. 802349e: 609c str r4, [r3, #8]
  4773. 80234a0: 4640 mov r0, r8
  4774. 80234a2: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  4775. 80234a6: f000 bffb b.w 80244a0 <__malloc_unlock>
  4776. 80234aa: f856 6c08 ldr.w r6, [r6, #-8]
  4777. 80234ae: f105 0c08 add.w ip, r5, #8
  4778. 80234b2: 1ba4 subs r4, r4, r6
  4779. 80234b4: 199b adds r3, r3, r6
  4780. 80234b6: 68a6 ldr r6, [r4, #8]
  4781. 80234b8: 4566 cmp r6, ip
  4782. 80234ba: d043 beq.n 8023544 <_free_r+0x140>
  4783. 80234bc: f8d4 c00c ldr.w ip, [r4, #12]
  4784. 80234c0: f8c6 c00c str.w ip, [r6, #12]
  4785. 80234c4: f8cc 6008 str.w r6, [ip, #8]
  4786. 80234c8: e7ba b.n 8023440 <_free_r+0x3c>
  4787. 80234ca: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  4788. 80234ce: 08db lsrs r3, r3, #3
  4789. 80234d0: 2101 movs r1, #1
  4790. 80234d2: 6868 ldr r0, [r5, #4]
  4791. 80234d4: eb05 02c3 add.w r2, r5, r3, lsl #3
  4792. 80234d8: 109b asrs r3, r3, #2
  4793. 80234da: fa01 f303 lsl.w r3, r1, r3
  4794. 80234de: 60e2 str r2, [r4, #12]
  4795. 80234e0: 6891 ldr r1, [r2, #8]
  4796. 80234e2: 4318 orrs r0, r3
  4797. 80234e4: 6068 str r0, [r5, #4]
  4798. 80234e6: 60a1 str r1, [r4, #8]
  4799. 80234e8: 60cc str r4, [r1, #12]
  4800. 80234ea: 6094 str r4, [r2, #8]
  4801. 80234ec: e7d8 b.n 80234a0 <_free_r+0x9c>
  4802. 80234ee: 4e29 ldr r6, [pc, #164] ; (8023594 <_free_r+0x190>)
  4803. 80234f0: 42b0 cmp r0, r6
  4804. 80234f2: d1ae bne.n 8023452 <_free_r+0x4e>
  4805. 80234f4: 616c str r4, [r5, #20]
  4806. 80234f6: f043 0201 orr.w r2, r3, #1
  4807. 80234fa: 612c str r4, [r5, #16]
  4808. 80234fc: 60e0 str r0, [r4, #12]
  4809. 80234fe: 60a0 str r0, [r4, #8]
  4810. 8023500: 6062 str r2, [r4, #4]
  4811. 8023502: 50e3 str r3, [r4, r3]
  4812. 8023504: e7cc b.n 80234a0 <_free_r+0x9c>
  4813. 8023506: 18c0 adds r0, r0, r3
  4814. 8023508: 07cb lsls r3, r1, #31
  4815. 802350a: d407 bmi.n 802351c <_free_r+0x118>
  4816. 802350c: f856 3c08 ldr.w r3, [r6, #-8]
  4817. 8023510: 1ae4 subs r4, r4, r3
  4818. 8023512: 18c0 adds r0, r0, r3
  4819. 8023514: 68a2 ldr r2, [r4, #8]
  4820. 8023516: 68e3 ldr r3, [r4, #12]
  4821. 8023518: 60d3 str r3, [r2, #12]
  4822. 802351a: 609a str r2, [r3, #8]
  4823. 802351c: f240 52a8 movw r2, #1448 ; 0x5a8
  4824. 8023520: f040 0301 orr.w r3, r0, #1
  4825. 8023524: f2c2 0200 movt r2, #8192 ; 0x2000
  4826. 8023528: 6063 str r3, [r4, #4]
  4827. 802352a: 60ac str r4, [r5, #8]
  4828. 802352c: 6813 ldr r3, [r2, #0]
  4829. 802352e: 4298 cmp r0, r3
  4830. 8023530: d3b6 bcc.n 80234a0 <_free_r+0x9c>
  4831. 8023532: f641 1314 movw r3, #6420 ; 0x1914
  4832. 8023536: 4640 mov r0, r8
  4833. 8023538: f2c2 0300 movt r3, #8192 ; 0x2000
  4834. 802353c: 6819 ldr r1, [r3, #0]
  4835. 802353e: f7ff ff0f bl 8023360 <_malloc_trim_r>
  4836. 8023542: e7ad b.n 80234a0 <_free_r+0x9c>
  4837. 8023544: 2101 movs r1, #1
  4838. 8023546: e77b b.n 8023440 <_free_r+0x3c>
  4839. 8023548: f102 005b add.w r0, r2, #91 ; 0x5b
  4840. 802354c: 0041 lsls r1, r0, #1
  4841. 802354e: 2a14 cmp r2, #20
  4842. 8023550: d990 bls.n 8023474 <_free_r+0x70>
  4843. 8023552: 2a54 cmp r2, #84 ; 0x54
  4844. 8023554: d80c bhi.n 8023570 <_free_r+0x16c>
  4845. 8023556: 0b18 lsrs r0, r3, #12
  4846. 8023558: 306e adds r0, #110 ; 0x6e
  4847. 802355a: 0041 lsls r1, r0, #1
  4848. 802355c: e78a b.n 8023474 <_free_r+0x70>
  4849. 802355e: 2601 movs r6, #1
  4850. 8023560: 684d ldr r5, [r1, #4]
  4851. 8023562: 1080 asrs r0, r0, #2
  4852. 8023564: 4613 mov r3, r2
  4853. 8023566: fa06 f000 lsl.w r0, r6, r0
  4854. 802356a: 4305 orrs r5, r0
  4855. 802356c: 604d str r5, [r1, #4]
  4856. 802356e: e793 b.n 8023498 <_free_r+0x94>
  4857. 8023570: f5b2 7faa cmp.w r2, #340 ; 0x154
  4858. 8023574: d803 bhi.n 802357e <_free_r+0x17a>
  4859. 8023576: 0bd8 lsrs r0, r3, #15
  4860. 8023578: 3077 adds r0, #119 ; 0x77
  4861. 802357a: 0041 lsls r1, r0, #1
  4862. 802357c: e77a b.n 8023474 <_free_r+0x70>
  4863. 802357e: f240 5154 movw r1, #1364 ; 0x554
  4864. 8023582: 428a cmp r2, r1
  4865. 8023584: d803 bhi.n 802358e <_free_r+0x18a>
  4866. 8023586: 0c98 lsrs r0, r3, #18
  4867. 8023588: 307c adds r0, #124 ; 0x7c
  4868. 802358a: 0041 lsls r1, r0, #1
  4869. 802358c: e772 b.n 8023474 <_free_r+0x70>
  4870. 802358e: 21fc movs r1, #252 ; 0xfc
  4871. 8023590: 207e movs r0, #126 ; 0x7e
  4872. 8023592: e76f b.n 8023474 <_free_r+0x70>
  4873. 8023594: 200001a4 .word 0x200001a4
  4874. 08023598 <rshift>:
  4875. 8023598: 6902 ldr r2, [r0, #16]
  4876. 802359a: 114b asrs r3, r1, #5
  4877. 802359c: e92d 01f0 stmdb sp!, {r4, r5, r6, r7, r8}
  4878. 80235a0: 4293 cmp r3, r2
  4879. 80235a2: f100 0714 add.w r7, r0, #20
  4880. 80235a6: da2d bge.n 8023604 <rshift+0x6c>
  4881. 80235a8: 3304 adds r3, #4
  4882. 80235aa: eb00 0282 add.w r2, r0, r2, lsl #2
  4883. 80235ae: 3214 adds r2, #20
  4884. 80235b0: f011 011f ands.w r1, r1, #31
  4885. 80235b4: eb00 0383 add.w r3, r0, r3, lsl #2
  4886. 80235b8: f103 0c04 add.w ip, r3, #4
  4887. 80235bc: d029 beq.n 8023612 <rshift+0x7a>
  4888. 80235be: 685c ldr r4, [r3, #4]
  4889. 80235c0: f10c 0304 add.w r3, ip, #4
  4890. 80235c4: 429a cmp r2, r3
  4891. 80235c6: f1c1 0820 rsb r8, r1, #32
  4892. 80235ca: fa24 f401 lsr.w r4, r4, r1
  4893. 80235ce: d938 bls.n 8023642 <rshift+0xaa>
  4894. 80235d0: 463d mov r5, r7
  4895. 80235d2: 681e ldr r6, [r3, #0]
  4896. 80235d4: fa06 f608 lsl.w r6, r6, r8
  4897. 80235d8: 4334 orrs r4, r6
  4898. 80235da: f845 4b04 str.w r4, [r5], #4
  4899. 80235de: f853 4b04 ldr.w r4, [r3], #4
  4900. 80235e2: 429a cmp r2, r3
  4901. 80235e4: fa24 f401 lsr.w r4, r4, r1
  4902. 80235e8: d8f3 bhi.n 80235d2 <rshift+0x3a>
  4903. 80235ea: ebcc 0302 rsb r3, ip, r2
  4904. 80235ee: 3b05 subs r3, #5
  4905. 80235f0: f023 0303 bic.w r3, r3, #3
  4906. 80235f4: 18c3 adds r3, r0, r3
  4907. 80235f6: 3318 adds r3, #24
  4908. 80235f8: 601c str r4, [r3, #0]
  4909. 80235fa: b1e4 cbz r4, 8023636 <rshift+0x9e>
  4910. 80235fc: 3304 adds r3, #4
  4911. 80235fe: 1bdf subs r7, r3, r7
  4912. 8023600: 10bf asrs r7, r7, #2
  4913. 8023602: e01a b.n 802363a <rshift+0xa2>
  4914. 8023604: 2300 movs r3, #0
  4915. 8023606: 6103 str r3, [r0, #16]
  4916. 8023608: 2300 movs r3, #0
  4917. 802360a: 6143 str r3, [r0, #20]
  4918. 802360c: e8bd 01f0 ldmia.w sp!, {r4, r5, r6, r7, r8}
  4919. 8023610: 4770 bx lr
  4920. 8023612: 4562 cmp r2, ip
  4921. 8023614: bf84 itt hi
  4922. 8023616: 4663 movhi r3, ip
  4923. 8023618: 4639 movhi r1, r7
  4924. 802361a: d9f3 bls.n 8023604 <rshift+0x6c>
  4925. 802361c: f853 4b04 ldr.w r4, [r3], #4
  4926. 8023620: 429a cmp r2, r3
  4927. 8023622: f841 4b04 str.w r4, [r1], #4
  4928. 8023626: d8f9 bhi.n 802361c <rshift+0x84>
  4929. 8023628: ea6f 030c mvn.w r3, ip
  4930. 802362c: 189b adds r3, r3, r2
  4931. 802362e: f023 0303 bic.w r3, r3, #3
  4932. 8023632: 18c3 adds r3, r0, r3
  4933. 8023634: 3318 adds r3, #24
  4934. 8023636: 1bdf subs r7, r3, r7
  4935. 8023638: 10bf asrs r7, r7, #2
  4936. 802363a: 6107 str r7, [r0, #16]
  4937. 802363c: 2f00 cmp r7, #0
  4938. 802363e: d1e5 bne.n 802360c <rshift+0x74>
  4939. 8023640: e7e2 b.n 8023608 <rshift+0x70>
  4940. 8023642: 463b mov r3, r7
  4941. 8023644: e7d8 b.n 80235f8 <rshift+0x60>
  4942. 8023646: bf00 nop
  4943. 08023648 <__hexdig_init>:
  4944. 8023648: f24b 7008 movw r0, #46856 ; 0xb708
  4945. 802364c: f644 63d8 movw r3, #20184 ; 0x4ed8
  4946. 8023650: f6c0 0003 movt r0, #2051 ; 0x803
  4947. 8023654: 2110 movs r1, #16
  4948. 8023656: 2230 movs r2, #48 ; 0x30
  4949. 8023658: f2c2 0301 movt r3, #8193 ; 0x2001
  4950. 802365c: 5499 strb r1, [r3, r2]
  4951. 802365e: 3101 adds r1, #1
  4952. 8023660: f810 2f01 ldrb.w r2, [r0, #1]!
  4953. 8023664: b2c9 uxtb r1, r1
  4954. 8023666: 2a00 cmp r2, #0
  4955. 8023668: d1f8 bne.n 802365c <__hexdig_init+0x14>
  4956. 802366a: f24b 7000 movw r0, #46848 ; 0xb700
  4957. 802366e: 211a movs r1, #26
  4958. 8023670: f6c0 0003 movt r0, #2051 ; 0x803
  4959. 8023674: 2261 movs r2, #97 ; 0x61
  4960. 8023676: 5499 strb r1, [r3, r2]
  4961. 8023678: 3101 adds r1, #1
  4962. 802367a: f810 2f01 ldrb.w r2, [r0, #1]!
  4963. 802367e: b2c9 uxtb r1, r1
  4964. 8023680: 2a00 cmp r2, #0
  4965. 8023682: d1f8 bne.n 8023676 <__hexdig_init+0x2e>
  4966. 8023684: f24b 60f8 movw r0, #46840 ; 0xb6f8
  4967. 8023688: 211a movs r1, #26
  4968. 802368a: f6c0 0003 movt r0, #2051 ; 0x803
  4969. 802368e: 2241 movs r2, #65 ; 0x41
  4970. 8023690: 5499 strb r1, [r3, r2]
  4971. 8023692: 3101 adds r1, #1
  4972. 8023694: f810 2f01 ldrb.w r2, [r0, #1]!
  4973. 8023698: b2c9 uxtb r1, r1
  4974. 802369a: 2a00 cmp r2, #0
  4975. 802369c: d1f8 bne.n 8023690 <__hexdig_init+0x48>
  4976. 802369e: 4770 bx lr
  4977. 080236a0 <__gethex>:
  4978. 80236a0: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  4979. 80236a4: b08b sub sp, #44 ; 0x2c
  4980. 80236a6: 4688 mov r8, r1
  4981. 80236a8: f644 66d8 movw r6, #20184 ; 0x4ed8
  4982. 80236ac: 9206 str r2, [sp, #24]
  4983. 80236ae: f2c2 0601 movt r6, #8193 ; 0x2001
  4984. 80236b2: 9309 str r3, [sp, #36] ; 0x24
  4985. 80236b4: 9007 str r0, [sp, #28]
  4986. 80236b6: f000 fbb9 bl 8023e2c <_localeconv_r>
  4987. 80236ba: 6800 ldr r0, [r0, #0]
  4988. 80236bc: 9002 str r0, [sp, #8]
  4989. 80236be: f7fe fa53 bl 8021b68 <strlen>
  4990. 80236c2: 9b02 ldr r3, [sp, #8]
  4991. 80236c4: 181a adds r2, r3, r0
  4992. 80236c6: f896 3030 ldrb.w r3, [r6, #48] ; 0x30
  4993. 80236ca: 9003 str r0, [sp, #12]
  4994. 80236cc: f812 ac01 ldrb.w sl, [r2, #-1]
  4995. 80236d0: 2b00 cmp r3, #0
  4996. 80236d2: f000 810e beq.w 80238f2 <__gethex+0x252>
  4997. 80236d6: f8d8 3000 ldr.w r3, [r8]
  4998. 80236da: 1c9d adds r5, r3, #2
  4999. 80236dc: 789a ldrb r2, [r3, #2]
  5000. 80236de: 2a30 cmp r2, #48 ; 0x30
  5001. 80236e0: f040 8200 bne.w 8023ae4 <__gethex+0x444>
  5002. 80236e4: 3303 adds r3, #3
  5003. 80236e6: 2700 movs r7, #0
  5004. 80236e8: 461d mov r5, r3
  5005. 80236ea: f813 2b01 ldrb.w r2, [r3], #1
  5006. 80236ee: 3701 adds r7, #1
  5007. 80236f0: 2a30 cmp r2, #48 ; 0x30
  5008. 80236f2: d0f9 beq.n 80236e8 <__gethex+0x48>
  5009. 80236f4: f816 b002 ldrb.w fp, [r6, r2]
  5010. 80236f8: f644 69d8 movw r9, #20184 ; 0x4ed8
  5011. 80236fc: f2c2 0901 movt r9, #8193 ; 0x2001
  5012. 8023700: f1bb 0f00 cmp.w fp, #0
  5013. 8023704: f000 80f8 beq.w 80238f8 <__gethex+0x258>
  5014. 8023708: 782b ldrb r3, [r5, #0]
  5015. 802370a: f04f 0b00 mov.w fp, #0
  5016. 802370e: f819 4003 ldrb.w r4, [r9, r3]
  5017. 8023712: 2c00 cmp r4, #0
  5018. 8023714: f000 8200 beq.w 8023b18 <__gethex+0x478>
  5019. 8023718: 1c6a adds r2, r5, #1
  5020. 802371a: 4614 mov r4, r2
  5021. 802371c: 3201 adds r2, #1
  5022. 802371e: 7823 ldrb r3, [r4, #0]
  5023. 8023720: 5cf3 ldrb r3, [r6, r3]
  5024. 8023722: 2b00 cmp r3, #0
  5025. 8023724: d1f9 bne.n 802371a <__gethex+0x7a>
  5026. 8023726: 4699 mov r9, r3
  5027. 8023728: 4620 mov r0, r4
  5028. 802372a: 9902 ldr r1, [sp, #8]
  5029. 802372c: 9a03 ldr r2, [sp, #12]
  5030. 802372e: f7fe fa7d bl 8021c2c <strncmp>
  5031. 8023732: b1e8 cbz r0, 8023770 <__gethex+0xd0>
  5032. 8023734: 7823 ldrb r3, [r4, #0]
  5033. 8023736: f1bb 0f00 cmp.w fp, #0
  5034. 802373a: f000 81c1 beq.w 8023ac0 <__gethex+0x420>
  5035. 802373e: ebc4 0b0b rsb fp, r4, fp
  5036. 8023742: ea4f 028b mov.w r2, fp, lsl #2
  5037. 8023746: 9205 str r2, [sp, #20]
  5038. 8023748: 2b50 cmp r3, #80 ; 0x50
  5039. 802374a: f000 809b beq.w 8023884 <__gethex+0x1e4>
  5040. 802374e: 2b70 cmp r3, #112 ; 0x70
  5041. 8023750: f000 8098 beq.w 8023884 <__gethex+0x1e4>
  5042. 8023754: 4622 mov r2, r4
  5043. 8023756: f8c8 2000 str.w r2, [r8]
  5044. 802375a: f1b9 0f00 cmp.w r9, #0
  5045. 802375e: d00d beq.n 802377c <__gethex+0xdc>
  5046. 8023760: 2f00 cmp r7, #0
  5047. 8023762: bf0c ite eq
  5048. 8023764: 2706 moveq r7, #6
  5049. 8023766: 2700 movne r7, #0
  5050. 8023768: 4638 mov r0, r7
  5051. 802376a: b00b add sp, #44 ; 0x2c
  5052. 802376c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  5053. 8023770: f1bb 0f00 cmp.w fp, #0
  5054. 8023774: f000 81be beq.w 8023af4 <__gethex+0x454>
  5055. 8023778: 7823 ldrb r3, [r4, #0]
  5056. 802377a: e7e0 b.n 802373e <__gethex+0x9e>
  5057. 802377c: 1b63 subs r3, r4, r5
  5058. 802377e: 4649 mov r1, r9
  5059. 8023780: 3b01 subs r3, #1
  5060. 8023782: 2b07 cmp r3, #7
  5061. 8023784: dd03 ble.n 802378e <__gethex+0xee>
  5062. 8023786: 105b asrs r3, r3, #1
  5063. 8023788: 3101 adds r1, #1
  5064. 802378a: 2b07 cmp r3, #7
  5065. 802378c: dcfb bgt.n 8023786 <__gethex+0xe6>
  5066. 802378e: 9807 ldr r0, [sp, #28]
  5067. 8023790: f000 fe88 bl 80244a4 <_Balloc>
  5068. 8023794: 42a5 cmp r5, r4
  5069. 8023796: f100 0314 add.w r3, r0, #20
  5070. 802379a: 9004 str r0, [sp, #16]
  5071. 802379c: 9308 str r3, [sp, #32]
  5072. 802379e: f080 81db bcs.w 8023b58 <__gethex+0x4b8>
  5073. 80237a2: 469b mov fp, r3
  5074. 80237a4: 9b03 ldr r3, [sp, #12]
  5075. 80237a6: f04f 0800 mov.w r8, #0
  5076. 80237aa: 4647 mov r7, r8
  5077. 80237ac: f1c3 0c01 rsb ip, r3, #1
  5078. 80237b0: e00f b.n 80237d2 <__gethex+0x132>
  5079. 80237b2: 2f20 cmp r7, #32
  5080. 80237b4: d05f beq.n 8023876 <__gethex+0x1d6>
  5081. 80237b6: 463a mov r2, r7
  5082. 80237b8: 3704 adds r7, #4
  5083. 80237ba: f814 3c01 ldrb.w r3, [r4, #-1]
  5084. 80237be: 464c mov r4, r9
  5085. 80237c0: 42a5 cmp r5, r4
  5086. 80237c2: 5cf3 ldrb r3, [r6, r3]
  5087. 80237c4: f003 030f and.w r3, r3, #15
  5088. 80237c8: fa03 f302 lsl.w r3, r3, r2
  5089. 80237cc: ea48 0803 orr.w r8, r8, r3
  5090. 80237d0: d219 bcs.n 8023806 <__gethex+0x166>
  5091. 80237d2: f814 3c01 ldrb.w r3, [r4, #-1]
  5092. 80237d6: f104 39ff add.w r9, r4, #4294967295
  5093. 80237da: 4553 cmp r3, sl
  5094. 80237dc: d1e9 bne.n 80237b2 <__gethex+0x112>
  5095. 80237de: eb09 030c add.w r3, r9, ip
  5096. 80237e2: 429d cmp r5, r3
  5097. 80237e4: d8e5 bhi.n 80237b2 <__gethex+0x112>
  5098. 80237e6: 4618 mov r0, r3
  5099. 80237e8: 9902 ldr r1, [sp, #8]
  5100. 80237ea: 9a03 ldr r2, [sp, #12]
  5101. 80237ec: 9301 str r3, [sp, #4]
  5102. 80237ee: f8cd c000 str.w ip, [sp]
  5103. 80237f2: f7fe fa1b bl 8021c2c <strncmp>
  5104. 80237f6: 9b01 ldr r3, [sp, #4]
  5105. 80237f8: f8dd c000 ldr.w ip, [sp]
  5106. 80237fc: 2800 cmp r0, #0
  5107. 80237fe: d1d8 bne.n 80237b2 <__gethex+0x112>
  5108. 8023800: 461c mov r4, r3
  5109. 8023802: 42a5 cmp r5, r4
  5110. 8023804: d3e5 bcc.n 80237d2 <__gethex+0x132>
  5111. 8023806: 9b08 ldr r3, [sp, #32]
  5112. 8023808: 4640 mov r0, r8
  5113. 802380a: f84b 8b04 str.w r8, [fp], #4
  5114. 802380e: 9904 ldr r1, [sp, #16]
  5115. 8023810: ebc3 0b0b rsb fp, r3, fp
  5116. 8023814: ea4f 03ab mov.w r3, fp, asr #2
  5117. 8023818: 610b str r3, [r1, #16]
  5118. 802381a: 015d lsls r5, r3, #5
  5119. 802381c: f000 ff24 bl 8024668 <__hi0bits>
  5120. 8023820: 9a06 ldr r2, [sp, #24]
  5121. 8023822: 6814 ldr r4, [r2, #0]
  5122. 8023824: 1a28 subs r0, r5, r0
  5123. 8023826: 42a0 cmp r0, r4
  5124. 8023828: f300 8125 bgt.w 8023a76 <__gethex+0x3d6>
  5125. 802382c: f2c0 814b blt.w 8023ac6 <__gethex+0x426>
  5126. 8023830: 2500 movs r5, #0
  5127. 8023832: 9806 ldr r0, [sp, #24]
  5128. 8023834: 9905 ldr r1, [sp, #20]
  5129. 8023836: 6883 ldr r3, [r0, #8]
  5130. 8023838: 4299 cmp r1, r3
  5131. 802383a: f300 80f6 bgt.w 8023a2a <__gethex+0x38a>
  5132. 802383e: 9806 ldr r0, [sp, #24]
  5133. 8023840: 9905 ldr r1, [sp, #20]
  5134. 8023842: 6843 ldr r3, [r0, #4]
  5135. 8023844: 4299 cmp r1, r3
  5136. 8023846: f280 8100 bge.w 8023a4a <__gethex+0x3aa>
  5137. 802384a: 1a5e subs r6, r3, r1
  5138. 802384c: 42b4 cmp r4, r6
  5139. 802384e: dc76 bgt.n 802393e <__gethex+0x29e>
  5140. 8023850: 68c2 ldr r2, [r0, #12]
  5141. 8023852: 2a02 cmp r2, #2
  5142. 8023854: f000 816f beq.w 8023b36 <__gethex+0x496>
  5143. 8023858: 2a03 cmp r2, #3
  5144. 802385a: f000 8198 beq.w 8023b8e <__gethex+0x4ee>
  5145. 802385e: 2a01 cmp r2, #1
  5146. 8023860: f000 8186 beq.w 8023b70 <__gethex+0x4d0>
  5147. 8023864: 9807 ldr r0, [sp, #28]
  5148. 8023866: 2750 movs r7, #80 ; 0x50
  5149. 8023868: 9904 ldr r1, [sp, #16]
  5150. 802386a: f000 fe51 bl 8024510 <_Bfree>
  5151. 802386e: 9814 ldr r0, [sp, #80] ; 0x50
  5152. 8023870: 2300 movs r3, #0
  5153. 8023872: 6003 str r3, [r0, #0]
  5154. 8023874: e778 b.n 8023768 <__gethex+0xc8>
  5155. 8023876: f84b 8b04 str.w r8, [fp], #4
  5156. 802387a: f04f 0800 mov.w r8, #0
  5157. 802387e: 2704 movs r7, #4
  5158. 8023880: 4642 mov r2, r8
  5159. 8023882: e79a b.n 80237ba <__gethex+0x11a>
  5160. 8023884: 7863 ldrb r3, [r4, #1]
  5161. 8023886: 2b2b cmp r3, #43 ; 0x2b
  5162. 8023888: f000 80f2 beq.w 8023a70 <__gethex+0x3d0>
  5163. 802388c: 2b2d cmp r3, #45 ; 0x2d
  5164. 802388e: f000 80ea beq.w 8023a66 <__gethex+0x3c6>
  5165. 8023892: 1c60 adds r0, r4, #1
  5166. 8023894: f04f 0b00 mov.w fp, #0
  5167. 8023898: 5cf1 ldrb r1, [r6, r3]
  5168. 802389a: f644 63d8 movw r3, #20184 ; 0x4ed8
  5169. 802389e: f2c2 0301 movt r3, #8193 ; 0x2001
  5170. 80238a2: 2900 cmp r1, #0
  5171. 80238a4: f43f af56 beq.w 8023754 <__gethex+0xb4>
  5172. 80238a8: 2919 cmp r1, #25
  5173. 80238aa: f73f af53 bgt.w 8023754 <__gethex+0xb4>
  5174. 80238ae: f890 c001 ldrb.w ip, [r0, #1]
  5175. 80238b2: 3910 subs r1, #16
  5176. 80238b4: 1c42 adds r2, r0, #1
  5177. 80238b6: f813 300c ldrb.w r3, [r3, ip]
  5178. 80238ba: b193 cbz r3, 80238e2 <__gethex+0x242>
  5179. 80238bc: 2b19 cmp r3, #25
  5180. 80238be: dc10 bgt.n 80238e2 <__gethex+0x242>
  5181. 80238c0: 3002 adds r0, #2
  5182. 80238c2: e001 b.n 80238c8 <__gethex+0x228>
  5183. 80238c4: 2b19 cmp r3, #25
  5184. 80238c6: dc0c bgt.n 80238e2 <__gethex+0x242>
  5185. 80238c8: 4602 mov r2, r0
  5186. 80238ca: eb01 0181 add.w r1, r1, r1, lsl #2
  5187. 80238ce: 3001 adds r0, #1
  5188. 80238d0: f892 c000 ldrb.w ip, [r2]
  5189. 80238d4: eb03 0141 add.w r1, r3, r1, lsl #1
  5190. 80238d8: 3910 subs r1, #16
  5191. 80238da: f816 300c ldrb.w r3, [r6, ip]
  5192. 80238de: 2b00 cmp r3, #0
  5193. 80238e0: d1f0 bne.n 80238c4 <__gethex+0x224>
  5194. 80238e2: f1bb 0f00 cmp.w fp, #0
  5195. 80238e6: d000 beq.n 80238ea <__gethex+0x24a>
  5196. 80238e8: 4249 negs r1, r1
  5197. 80238ea: 9b05 ldr r3, [sp, #20]
  5198. 80238ec: 185b adds r3, r3, r1
  5199. 80238ee: 9305 str r3, [sp, #20]
  5200. 80238f0: e731 b.n 8023756 <__gethex+0xb6>
  5201. 80238f2: f7ff fea9 bl 8023648 <__hexdig_init>
  5202. 80238f6: e6ee b.n 80236d6 <__gethex+0x36>
  5203. 80238f8: 4628 mov r0, r5
  5204. 80238fa: 9902 ldr r1, [sp, #8]
  5205. 80238fc: 9a03 ldr r2, [sp, #12]
  5206. 80238fe: f7fe f995 bl 8021c2c <strncmp>
  5207. 8023902: 2800 cmp r0, #0
  5208. 8023904: f040 809a bne.w 8023a3c <__gethex+0x39c>
  5209. 8023908: 9803 ldr r0, [sp, #12]
  5210. 802390a: 182c adds r4, r5, r0
  5211. 802390c: 5c2b ldrb r3, [r5, r0]
  5212. 802390e: f819 2003 ldrb.w r2, [r9, r3]
  5213. 8023912: 2a00 cmp r2, #0
  5214. 8023914: f000 80e8 beq.w 8023ae8 <__gethex+0x448>
  5215. 8023918: 2b30 cmp r3, #48 ; 0x30
  5216. 802391a: f040 8108 bne.w 8023b2e <__gethex+0x48e>
  5217. 802391e: 1c63 adds r3, r4, #1
  5218. 8023920: 461d mov r5, r3
  5219. 8023922: f813 2b01 ldrb.w r2, [r3], #1
  5220. 8023926: 2a30 cmp r2, #48 ; 0x30
  5221. 8023928: d0fa beq.n 8023920 <__gethex+0x280>
  5222. 802392a: 5cb3 ldrb r3, [r6, r2]
  5223. 802392c: 2b00 cmp r3, #0
  5224. 802392e: f040 80ff bne.w 8023b30 <__gethex+0x490>
  5225. 8023932: f04f 0901 mov.w r9, #1
  5226. 8023936: 46a3 mov fp, r4
  5227. 8023938: 464f mov r7, r9
  5228. 802393a: 462c mov r4, r5
  5229. 802393c: e6f4 b.n 8023728 <__gethex+0x88>
  5230. 802393e: 1e77 subs r7, r6, #1
  5231. 8023940: 2d00 cmp r5, #0
  5232. 8023942: f040 80e7 bne.w 8023b14 <__gethex+0x474>
  5233. 8023946: 2f00 cmp r7, #0
  5234. 8023948: dd04 ble.n 8023954 <__gethex+0x2b4>
  5235. 802394a: 9804 ldr r0, [sp, #16]
  5236. 802394c: 4639 mov r1, r7
  5237. 802394e: f001 fa05 bl 8024d5c <__any_on>
  5238. 8023952: 4605 mov r5, r0
  5239. 8023954: 9908 ldr r1, [sp, #32]
  5240. 8023956: 117b asrs r3, r7, #5
  5241. 8023958: 2201 movs r2, #1
  5242. 802395a: f007 071f and.w r7, r7, #31
  5243. 802395e: 9804 ldr r0, [sp, #16]
  5244. 8023960: 1ba4 subs r4, r4, r6
  5245. 8023962: f851 3023 ldr.w r3, [r1, r3, lsl #2]
  5246. 8023966: fa02 f207 lsl.w r2, r2, r7
  5247. 802396a: 4631 mov r1, r6
  5248. 802396c: 421a tst r2, r3
  5249. 802396e: bf18 it ne
  5250. 8023970: f045 0502 orrne.w r5, r5, #2
  5251. 8023974: f7ff fe10 bl 8023598 <rshift>
  5252. 8023978: 9b06 ldr r3, [sp, #24]
  5253. 802397a: 2702 movs r7, #2
  5254. 802397c: 685b ldr r3, [r3, #4]
  5255. 802397e: 9305 str r3, [sp, #20]
  5256. 8023980: 2d00 cmp r5, #0
  5257. 8023982: d069 beq.n 8023a58 <__gethex+0x3b8>
  5258. 8023984: 9806 ldr r0, [sp, #24]
  5259. 8023986: 68c3 ldr r3, [r0, #12]
  5260. 8023988: 2b02 cmp r3, #2
  5261. 802398a: f000 80ea beq.w 8023b62 <__gethex+0x4c2>
  5262. 802398e: 2b03 cmp r3, #3
  5263. 8023990: d05d beq.n 8023a4e <__gethex+0x3ae>
  5264. 8023992: 2b01 cmp r3, #1
  5265. 8023994: d15e bne.n 8023a54 <__gethex+0x3b4>
  5266. 8023996: 07aa lsls r2, r5, #30
  5267. 8023998: d55c bpl.n 8023a54 <__gethex+0x3b4>
  5268. 802399a: 9908 ldr r1, [sp, #32]
  5269. 802399c: 680b ldr r3, [r1, #0]
  5270. 802399e: 432b orrs r3, r5
  5271. 80239a0: 07db lsls r3, r3, #31
  5272. 80239a2: d557 bpl.n 8023a54 <__gethex+0x3b4>
  5273. 80239a4: 9b04 ldr r3, [sp, #16]
  5274. 80239a6: 2600 movs r6, #0
  5275. 80239a8: 9904 ldr r1, [sp, #16]
  5276. 80239aa: 691d ldr r5, [r3, #16]
  5277. 80239ac: 9b08 ldr r3, [sp, #32]
  5278. 80239ae: eb01 0085 add.w r0, r1, r5, lsl #2
  5279. 80239b2: 3014 adds r0, #20
  5280. 80239b4: 4619 mov r1, r3
  5281. 80239b6: f853 2b04 ldr.w r2, [r3], #4
  5282. 80239ba: f1b2 3fff cmp.w r2, #4294967295
  5283. 80239be: f040 80eb bne.w 8023b98 <__gethex+0x4f8>
  5284. 80239c2: 4298 cmp r0, r3
  5285. 80239c4: f843 6c04 str.w r6, [r3, #-4]
  5286. 80239c8: d8f4 bhi.n 80239b4 <__gethex+0x314>
  5287. 80239ca: 9a04 ldr r2, [sp, #16]
  5288. 80239cc: 6893 ldr r3, [r2, #8]
  5289. 80239ce: 429d cmp r5, r3
  5290. 80239d0: bfb8 it lt
  5291. 80239d2: 462b movlt r3, r5
  5292. 80239d4: f280 80f9 bge.w 8023bca <__gethex+0x52a>
  5293. 80239d8: 9904 ldr r1, [sp, #16]
  5294. 80239da: eb01 0283 add.w r2, r1, r3, lsl #2
  5295. 80239de: 3301 adds r3, #1
  5296. 80239e0: 610b str r3, [r1, #16]
  5297. 80239e2: 2301 movs r3, #1
  5298. 80239e4: 6153 str r3, [r2, #20]
  5299. 80239e6: 2f02 cmp r7, #2
  5300. 80239e8: f000 80d9 beq.w 8023b9e <__gethex+0x4fe>
  5301. 80239ec: 9904 ldr r1, [sp, #16]
  5302. 80239ee: 690b ldr r3, [r1, #16]
  5303. 80239f0: 429d cmp r5, r3
  5304. 80239f2: db0e blt.n 8023a12 <__gethex+0x372>
  5305. 80239f4: f014 041f ands.w r4, r4, #31
  5306. 80239f8: f000 80ac beq.w 8023b54 <__gethex+0x4b4>
  5307. 80239fc: 9b04 ldr r3, [sp, #16]
  5308. 80239fe: eb03 0585 add.w r5, r3, r5, lsl #2
  5309. 8023a02: 6928 ldr r0, [r5, #16]
  5310. 8023a04: f000 fe30 bl 8024668 <__hi0bits>
  5311. 8023a08: f1c4 0320 rsb r3, r4, #32
  5312. 8023a0c: 4298 cmp r0, r3
  5313. 8023a0e: f280 80a1 bge.w 8023b54 <__gethex+0x4b4>
  5314. 8023a12: 9804 ldr r0, [sp, #16]
  5315. 8023a14: 2101 movs r1, #1
  5316. 8023a16: f7ff fdbf bl 8023598 <rshift>
  5317. 8023a1a: 9a06 ldr r2, [sp, #24]
  5318. 8023a1c: 9805 ldr r0, [sp, #20]
  5319. 8023a1e: 6893 ldr r3, [r2, #8]
  5320. 8023a20: 3001 adds r0, #1
  5321. 8023a22: 9005 str r0, [sp, #20]
  5322. 8023a24: 4298 cmp r0, r3
  5323. 8023a26: f340 8095 ble.w 8023b54 <__gethex+0x4b4>
  5324. 8023a2a: 9807 ldr r0, [sp, #28]
  5325. 8023a2c: 27a3 movs r7, #163 ; 0xa3
  5326. 8023a2e: 9904 ldr r1, [sp, #16]
  5327. 8023a30: f000 fd6e bl 8024510 <_Bfree>
  5328. 8023a34: 9a14 ldr r2, [sp, #80] ; 0x50
  5329. 8023a36: 2300 movs r3, #0
  5330. 8023a38: 6013 str r3, [r2, #0]
  5331. 8023a3a: e695 b.n 8023768 <__gethex+0xc8>
  5332. 8023a3c: 782b ldrb r3, [r5, #0]
  5333. 8023a3e: 462c mov r4, r5
  5334. 8023a40: f8cd b014 str.w fp, [sp, #20]
  5335. 8023a44: f04f 0901 mov.w r9, #1
  5336. 8023a48: e67e b.n 8023748 <__gethex+0xa8>
  5337. 8023a4a: 2701 movs r7, #1
  5338. 8023a4c: e798 b.n 8023980 <__gethex+0x2e0>
  5339. 8023a4e: 9b15 ldr r3, [sp, #84] ; 0x54
  5340. 8023a50: 2b00 cmp r3, #0
  5341. 8023a52: d1a7 bne.n 80239a4 <__gethex+0x304>
  5342. 8023a54: f047 0710 orr.w r7, r7, #16
  5343. 8023a58: 9b04 ldr r3, [sp, #16]
  5344. 8023a5a: 9814 ldr r0, [sp, #80] ; 0x50
  5345. 8023a5c: 6003 str r3, [r0, #0]
  5346. 8023a5e: 9b05 ldr r3, [sp, #20]
  5347. 8023a60: 9809 ldr r0, [sp, #36] ; 0x24
  5348. 8023a62: 6003 str r3, [r0, #0]
  5349. 8023a64: e680 b.n 8023768 <__gethex+0xc8>
  5350. 8023a66: f04f 0b01 mov.w fp, #1
  5351. 8023a6a: 78a3 ldrb r3, [r4, #2]
  5352. 8023a6c: 1ca0 adds r0, r4, #2
  5353. 8023a6e: e713 b.n 8023898 <__gethex+0x1f8>
  5354. 8023a70: f04f 0b00 mov.w fp, #0
  5355. 8023a74: e7f9 b.n 8023a6a <__gethex+0x3ca>
  5356. 8023a76: 1b06 subs r6, r0, r4
  5357. 8023a78: 9804 ldr r0, [sp, #16]
  5358. 8023a7a: 4631 mov r1, r6
  5359. 8023a7c: f001 f96e bl 8024d5c <__any_on>
  5360. 8023a80: 4605 mov r5, r0
  5361. 8023a82: b1a8 cbz r0, 8023ab0 <__gethex+0x410>
  5362. 8023a84: 1e73 subs r3, r6, #1
  5363. 8023a86: 9804 ldr r0, [sp, #16]
  5364. 8023a88: 2501 movs r5, #1
  5365. 8023a8a: f003 011f and.w r1, r3, #31
  5366. 8023a8e: 115a asrs r2, r3, #5
  5367. 8023a90: fa05 f101 lsl.w r1, r5, r1
  5368. 8023a94: eb00 0282 add.w r2, r0, r2, lsl #2
  5369. 8023a98: 6952 ldr r2, [r2, #20]
  5370. 8023a9a: 4211 tst r1, r2
  5371. 8023a9c: d008 beq.n 8023ab0 <__gethex+0x410>
  5372. 8023a9e: 42ab cmp r3, r5
  5373. 8023aa0: dd05 ble.n 8023aae <__gethex+0x40e>
  5374. 8023aa2: 9804 ldr r0, [sp, #16]
  5375. 8023aa4: 1eb1 subs r1, r6, #2
  5376. 8023aa6: f001 f959 bl 8024d5c <__any_on>
  5377. 8023aaa: 2503 movs r5, #3
  5378. 8023aac: b900 cbnz r0, 8023ab0 <__gethex+0x410>
  5379. 8023aae: 2502 movs r5, #2
  5380. 8023ab0: 9804 ldr r0, [sp, #16]
  5381. 8023ab2: 4631 mov r1, r6
  5382. 8023ab4: f7ff fd70 bl 8023598 <rshift>
  5383. 8023ab8: 9b05 ldr r3, [sp, #20]
  5384. 8023aba: 199b adds r3, r3, r6
  5385. 8023abc: 9305 str r3, [sp, #20]
  5386. 8023abe: e6b8 b.n 8023832 <__gethex+0x192>
  5387. 8023ac0: f8cd b014 str.w fp, [sp, #20]
  5388. 8023ac4: e640 b.n 8023748 <__gethex+0xa8>
  5389. 8023ac6: 1a25 subs r5, r4, r0
  5390. 8023ac8: 9904 ldr r1, [sp, #16]
  5391. 8023aca: 462a mov r2, r5
  5392. 8023acc: 9807 ldr r0, [sp, #28]
  5393. 8023ace: f000 ff11 bl 80248f4 <__lshift>
  5394. 8023ad2: 9b05 ldr r3, [sp, #20]
  5395. 8023ad4: 1b5b subs r3, r3, r5
  5396. 8023ad6: 2500 movs r5, #0
  5397. 8023ad8: 9305 str r3, [sp, #20]
  5398. 8023ada: 9004 str r0, [sp, #16]
  5399. 8023adc: f100 0314 add.w r3, r0, #20
  5400. 8023ae0: 9308 str r3, [sp, #32]
  5401. 8023ae2: e6a6 b.n 8023832 <__gethex+0x192>
  5402. 8023ae4: 2700 movs r7, #0
  5403. 8023ae6: e605 b.n 80236f4 <__gethex+0x54>
  5404. 8023ae8: 9205 str r2, [sp, #20]
  5405. 8023aea: f04f 0901 mov.w r9, #1
  5406. 8023aee: e62b b.n 8023748 <__gethex+0xa8>
  5407. 8023af0: 462c mov r4, r5
  5408. 8023af2: 4681 mov r9, r0
  5409. 8023af4: 9903 ldr r1, [sp, #12]
  5410. 8023af6: eb04 0b01 add.w fp, r4, r1
  5411. 8023afa: 5c63 ldrb r3, [r4, r1]
  5412. 8023afc: 5cf2 ldrb r2, [r6, r3]
  5413. 8023afe: 2a00 cmp r2, #0
  5414. 8023b00: d07a beq.n 8023bf8 <__gethex+0x558>
  5415. 8023b02: f10b 0201 add.w r2, fp, #1
  5416. 8023b06: 4614 mov r4, r2
  5417. 8023b08: f812 3b01 ldrb.w r3, [r2], #1
  5418. 8023b0c: 5cf1 ldrb r1, [r6, r3]
  5419. 8023b0e: 2900 cmp r1, #0
  5420. 8023b10: d1f9 bne.n 8023b06 <__gethex+0x466>
  5421. 8023b12: e614 b.n 802373e <__gethex+0x9e>
  5422. 8023b14: 2501 movs r5, #1
  5423. 8023b16: e71d b.n 8023954 <__gethex+0x2b4>
  5424. 8023b18: 4628 mov r0, r5
  5425. 8023b1a: 9902 ldr r1, [sp, #8]
  5426. 8023b1c: 9a03 ldr r2, [sp, #12]
  5427. 8023b1e: f7fe f885 bl 8021c2c <strncmp>
  5428. 8023b22: 2800 cmp r0, #0
  5429. 8023b24: d0e4 beq.n 8023af0 <__gethex+0x450>
  5430. 8023b26: 46a1 mov r9, r4
  5431. 8023b28: 462c mov r4, r5
  5432. 8023b2a: 46cb mov fp, r9
  5433. 8023b2c: e602 b.n 8023734 <__gethex+0x94>
  5434. 8023b2e: 4625 mov r5, r4
  5435. 8023b30: 46a3 mov fp, r4
  5436. 8023b32: 2701 movs r7, #1
  5437. 8023b34: e5f0 b.n 8023718 <__gethex+0x78>
  5438. 8023b36: 9815 ldr r0, [sp, #84] ; 0x54
  5439. 8023b38: 2800 cmp r0, #0
  5440. 8023b3a: f47f ae93 bne.w 8023864 <__gethex+0x1c4>
  5441. 8023b3e: 9a09 ldr r2, [sp, #36] ; 0x24
  5442. 8023b40: 2762 movs r7, #98 ; 0x62
  5443. 8023b42: 9804 ldr r0, [sp, #16]
  5444. 8023b44: 9908 ldr r1, [sp, #32]
  5445. 8023b46: 6013 str r3, [r2, #0]
  5446. 8023b48: 2301 movs r3, #1
  5447. 8023b4a: 9a14 ldr r2, [sp, #80] ; 0x50
  5448. 8023b4c: 6103 str r3, [r0, #16]
  5449. 8023b4e: 600b str r3, [r1, #0]
  5450. 8023b50: 6010 str r0, [r2, #0]
  5451. 8023b52: e609 b.n 8023768 <__gethex+0xc8>
  5452. 8023b54: 2721 movs r7, #33 ; 0x21
  5453. 8023b56: e77f b.n 8023a58 <__gethex+0x3b8>
  5454. 8023b58: f8dd b020 ldr.w fp, [sp, #32]
  5455. 8023b5c: f04f 0800 mov.w r8, #0
  5456. 8023b60: e651 b.n 8023806 <__gethex+0x166>
  5457. 8023b62: 9a15 ldr r2, [sp, #84] ; 0x54
  5458. 8023b64: f1c2 0301 rsb r3, r2, #1
  5459. 8023b68: 2b00 cmp r3, #0
  5460. 8023b6a: f43f af73 beq.w 8023a54 <__gethex+0x3b4>
  5461. 8023b6e: e719 b.n 80239a4 <__gethex+0x304>
  5462. 8023b70: 42a6 cmp r6, r4
  5463. 8023b72: f47f ae77 bne.w 8023864 <__gethex+0x1c4>
  5464. 8023b76: 2c01 cmp r4, #1
  5465. 8023b78: dde1 ble.n 8023b3e <__gethex+0x49e>
  5466. 8023b7a: 9804 ldr r0, [sp, #16]
  5467. 8023b7c: 1e61 subs r1, r4, #1
  5468. 8023b7e: f001 f8ed bl 8024d5c <__any_on>
  5469. 8023b82: 2800 cmp r0, #0
  5470. 8023b84: f43f ae6e beq.w 8023864 <__gethex+0x1c4>
  5471. 8023b88: 9a06 ldr r2, [sp, #24]
  5472. 8023b8a: 6853 ldr r3, [r2, #4]
  5473. 8023b8c: e7d7 b.n 8023b3e <__gethex+0x49e>
  5474. 8023b8e: 9915 ldr r1, [sp, #84] ; 0x54
  5475. 8023b90: 2900 cmp r1, #0
  5476. 8023b92: f43f ae67 beq.w 8023864 <__gethex+0x1c4>
  5477. 8023b96: e7d2 b.n 8023b3e <__gethex+0x49e>
  5478. 8023b98: 3201 adds r2, #1
  5479. 8023b9a: 600a str r2, [r1, #0]
  5480. 8023b9c: e723 b.n 80239e6 <__gethex+0x346>
  5481. 8023b9e: 9a06 ldr r2, [sp, #24]
  5482. 8023ba0: 2722 movs r7, #34 ; 0x22
  5483. 8023ba2: 6813 ldr r3, [r2, #0]
  5484. 8023ba4: 3b01 subs r3, #1
  5485. 8023ba6: 42a3 cmp r3, r4
  5486. 8023ba8: f47f af56 bne.w 8023a58 <__gethex+0x3b8>
  5487. 8023bac: 1163 asrs r3, r4, #5
  5488. 8023bae: 9804 ldr r0, [sp, #16]
  5489. 8023bb0: 2201 movs r2, #1
  5490. 8023bb2: f004 041f and.w r4, r4, #31
  5491. 8023bb6: eb00 0383 add.w r3, r0, r3, lsl #2
  5492. 8023bba: fa02 f204 lsl.w r2, r2, r4
  5493. 8023bbe: 695b ldr r3, [r3, #20]
  5494. 8023bc0: 421a tst r2, r3
  5495. 8023bc2: bf14 ite ne
  5496. 8023bc4: 2721 movne r7, #33 ; 0x21
  5497. 8023bc6: 2722 moveq r7, #34 ; 0x22
  5498. 8023bc8: e746 b.n 8023a58 <__gethex+0x3b8>
  5499. 8023bca: 6851 ldr r1, [r2, #4]
  5500. 8023bcc: 9807 ldr r0, [sp, #28]
  5501. 8023bce: 3101 adds r1, #1
  5502. 8023bd0: f000 fc68 bl 80244a4 <_Balloc>
  5503. 8023bd4: 4606 mov r6, r0
  5504. 8023bd6: 9804 ldr r0, [sp, #16]
  5505. 8023bd8: f100 010c add.w r1, r0, #12
  5506. 8023bdc: 6903 ldr r3, [r0, #16]
  5507. 8023bde: f106 000c add.w r0, r6, #12
  5508. 8023be2: 1c9a adds r2, r3, #2
  5509. 8023be4: 0092 lsls r2, r2, #2
  5510. 8023be6: f7fd fd2d bl 8021644 <memcpy>
  5511. 8023bea: 9904 ldr r1, [sp, #16]
  5512. 8023bec: 9807 ldr r0, [sp, #28]
  5513. 8023bee: 9604 str r6, [sp, #16]
  5514. 8023bf0: f000 fc8e bl 8024510 <_Bfree>
  5515. 8023bf4: 6933 ldr r3, [r6, #16]
  5516. 8023bf6: e6ef b.n 80239d8 <__gethex+0x338>
  5517. 8023bf8: 465c mov r4, fp
  5518. 8023bfa: e5a0 b.n 802373e <__gethex+0x9e>
  5519. 08023bfc <__hexnan>:
  5520. 8023bfc: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  5521. 8023c00: f644 68d8 movw r8, #20184 ; 0x4ed8
  5522. 8023c04: f2c2 0801 movt r8, #8193 ; 0x2001
  5523. 8023c08: b085 sub sp, #20
  5524. 8023c0a: 460c mov r4, r1
  5525. 8023c0c: 4692 mov sl, r2
  5526. 8023c0e: f898 3030 ldrb.w r3, [r8, #48] ; 0x30
  5527. 8023c12: 9002 str r0, [sp, #8]
  5528. 8023c14: 2b00 cmp r3, #0
  5529. 8023c16: f000 80ad beq.w 8023d74 <__hexnan+0x178>
  5530. 8023c1a: 6823 ldr r3, [r4, #0]
  5531. 8023c1c: 115a asrs r2, r3, #5
  5532. 8023c1e: f013 031f ands.w r3, r3, #31
  5533. 8023c22: 9303 str r3, [sp, #12]
  5534. 8023c24: eb0a 0282 add.w r2, sl, r2, lsl #2
  5535. 8023c28: 9200 str r2, [sp, #0]
  5536. 8023c2a: d001 beq.n 8023c30 <__hexnan+0x34>
  5537. 8023c2c: 3204 adds r2, #4
  5538. 8023c2e: 9200 str r2, [sp, #0]
  5539. 8023c30: 9a00 ldr r2, [sp, #0]
  5540. 8023c32: 2300 movs r3, #0
  5541. 8023c34: 4699 mov r9, r3
  5542. 8023c36: 9900 ldr r1, [sp, #0]
  5543. 8023c38: 46cb mov fp, r9
  5544. 8023c3a: 464e mov r6, r9
  5545. 8023c3c: f842 3c04 str.w r3, [r2, #-4]
  5546. 8023c40: 3904 subs r1, #4
  5547. 8023c42: 9b02 ldr r3, [sp, #8]
  5548. 8023c44: 9101 str r1, [sp, #4]
  5549. 8023c46: f8dd c004 ldr.w ip, [sp, #4]
  5550. 8023c4a: 6819 ldr r1, [r3, #0]
  5551. 8023c4c: 4664 mov r4, ip
  5552. 8023c4e: 784b ldrb r3, [r1, #1]
  5553. 8023c50: 2b00 cmp r3, #0
  5554. 8023c52: d033 beq.n 8023cbc <__hexnan+0xc0>
  5555. 8023c54: f818 2003 ldrb.w r2, [r8, r3]
  5556. 8023c58: 2a00 cmp r2, #0
  5557. 8023c5a: d16f bne.n 8023d3c <__hexnan+0x140>
  5558. 8023c5c: 2b20 cmp r3, #32
  5559. 8023c5e: f200 8083 bhi.w 8023d68 <__hexnan+0x16c>
  5560. 8023c62: 455e cmp r6, fp
  5561. 8023c64: dd26 ble.n 8023cb4 <__hexnan+0xb8>
  5562. 8023c66: f1b9 0f07 cmp.w r9, #7
  5563. 8023c6a: bfcc ite gt
  5564. 8023c6c: 2300 movgt r3, #0
  5565. 8023c6e: 2301 movle r3, #1
  5566. 8023c70: 4564 cmp r4, ip
  5567. 8023c72: bf28 it cs
  5568. 8023c74: 2300 movcs r3, #0
  5569. 8023c76: b193 cbz r3, 8023c9e <__hexnan+0xa2>
  5570. 8023c78: f1c9 0908 rsb r9, r9, #8
  5571. 8023c7c: 6822 ldr r2, [r4, #0]
  5572. 8023c7e: 4623 mov r3, r4
  5573. 8023c80: ea4f 0989 mov.w r9, r9, lsl #2
  5574. 8023c84: f1c9 0720 rsb r7, r9, #32
  5575. 8023c88: 6858 ldr r0, [r3, #4]
  5576. 8023c8a: fa00 f507 lsl.w r5, r0, r7
  5577. 8023c8e: 4315 orrs r5, r2
  5578. 8023c90: fa20 f209 lsr.w r2, r0, r9
  5579. 8023c94: 601d str r5, [r3, #0]
  5580. 8023c96: f843 2f04 str.w r2, [r3, #4]!
  5581. 8023c9a: 459c cmp ip, r3
  5582. 8023c9c: d8f4 bhi.n 8023c88 <__hexnan+0x8c>
  5583. 8023c9e: 4554 cmp r4, sl
  5584. 8023ca0: bf98 it ls
  5585. 8023ca2: f04f 0908 movls.w r9, #8
  5586. 8023ca6: d905 bls.n 8023cb4 <__hexnan+0xb8>
  5587. 8023ca8: 2200 movs r2, #0
  5588. 8023caa: 3c04 subs r4, #4
  5589. 8023cac: 6022 str r2, [r4, #0]
  5590. 8023cae: 46b3 mov fp, r6
  5591. 8023cb0: 46a4 mov ip, r4
  5592. 8023cb2: 4691 mov r9, r2
  5593. 8023cb4: 3101 adds r1, #1
  5594. 8023cb6: 784b ldrb r3, [r1, #1]
  5595. 8023cb8: 2b00 cmp r3, #0
  5596. 8023cba: d1cb bne.n 8023c54 <__hexnan+0x58>
  5597. 8023cbc: 2e00 cmp r6, #0
  5598. 8023cbe: d055 beq.n 8023d6c <__hexnan+0x170>
  5599. 8023cc0: f1b9 0f07 cmp.w r9, #7
  5600. 8023cc4: bfcc ite gt
  5601. 8023cc6: 2300 movgt r3, #0
  5602. 8023cc8: 2301 movle r3, #1
  5603. 8023cca: 4564 cmp r4, ip
  5604. 8023ccc: bf28 it cs
  5605. 8023cce: 2300 movcs r3, #0
  5606. 8023cd0: b193 cbz r3, 8023cf8 <__hexnan+0xfc>
  5607. 8023cd2: f1c9 0908 rsb r9, r9, #8
  5608. 8023cd6: 6822 ldr r2, [r4, #0]
  5609. 8023cd8: 4623 mov r3, r4
  5610. 8023cda: ea4f 0989 mov.w r9, r9, lsl #2
  5611. 8023cde: f1c9 0520 rsb r5, r9, #32
  5612. 8023ce2: 6859 ldr r1, [r3, #4]
  5613. 8023ce4: fa01 f005 lsl.w r0, r1, r5
  5614. 8023ce8: 4310 orrs r0, r2
  5615. 8023cea: fa21 f209 lsr.w r2, r1, r9
  5616. 8023cee: 6018 str r0, [r3, #0]
  5617. 8023cf0: f843 2f04 str.w r2, [r3, #4]!
  5618. 8023cf4: 4563 cmp r3, ip
  5619. 8023cf6: d3f4 bcc.n 8023ce2 <__hexnan+0xe6>
  5620. 8023cf8: 45a2 cmp sl, r4
  5621. 8023cfa: d23e bcs.n 8023d7a <__hexnan+0x17e>
  5622. 8023cfc: 9801 ldr r0, [sp, #4]
  5623. 8023cfe: 4652 mov r2, sl
  5624. 8023d00: f854 1b04 ldr.w r1, [r4], #4
  5625. 8023d04: 4613 mov r3, r2
  5626. 8023d06: 42a0 cmp r0, r4
  5627. 8023d08: f843 1b04 str.w r1, [r3], #4
  5628. 8023d0c: 461a mov r2, r3
  5629. 8023d0e: d2f7 bcs.n 8023d00 <__hexnan+0x104>
  5630. 8023d10: 9901 ldr r1, [sp, #4]
  5631. 8023d12: 2200 movs r2, #0
  5632. 8023d14: f843 2b04 str.w r2, [r3], #4
  5633. 8023d18: 4299 cmp r1, r3
  5634. 8023d1a: d2fb bcs.n 8023d14 <__hexnan+0x118>
  5635. 8023d1c: 9900 ldr r1, [sp, #0]
  5636. 8023d1e: f851 3c04 ldr.w r3, [r1, #-4]
  5637. 8023d22: b94b cbnz r3, 8023d38 <__hexnan+0x13c>
  5638. 8023d24: 9b01 ldr r3, [sp, #4]
  5639. 8023d26: 459a cmp sl, r3
  5640. 8023d28: d102 bne.n 8023d30 <__hexnan+0x134>
  5641. 8023d2a: e038 b.n 8023d9e <__hexnan+0x1a2>
  5642. 8023d2c: 459a cmp sl, r3
  5643. 8023d2e: d037 beq.n 8023da0 <__hexnan+0x1a4>
  5644. 8023d30: f853 2d04 ldr.w r2, [r3, #-4]!
  5645. 8023d34: 2a00 cmp r2, #0
  5646. 8023d36: d0f9 beq.n 8023d2c <__hexnan+0x130>
  5647. 8023d38: 2005 movs r0, #5
  5648. 8023d3a: e018 b.n 8023d6e <__hexnan+0x172>
  5649. 8023d3c: f109 0901 add.w r9, r9, #1
  5650. 8023d40: 3601 adds r6, #1
  5651. 8023d42: f1b9 0f08 cmp.w r9, #8
  5652. 8023d46: dc07 bgt.n 8023d58 <__hexnan+0x15c>
  5653. 8023d48: 6823 ldr r3, [r4, #0]
  5654. 8023d4a: 011b lsls r3, r3, #4
  5655. 8023d4c: f002 020f and.w r2, r2, #15
  5656. 8023d50: 3101 adds r1, #1
  5657. 8023d52: 431a orrs r2, r3
  5658. 8023d54: 6022 str r2, [r4, #0]
  5659. 8023d56: e7ae b.n 8023cb6 <__hexnan+0xba>
  5660. 8023d58: 4554 cmp r4, sl
  5661. 8023d5a: d9ab bls.n 8023cb4 <__hexnan+0xb8>
  5662. 8023d5c: 2300 movs r3, #0
  5663. 8023d5e: 3c04 subs r4, #4
  5664. 8023d60: 6023 str r3, [r4, #0]
  5665. 8023d62: f04f 0901 mov.w r9, #1
  5666. 8023d66: e7f1 b.n 8023d4c <__hexnan+0x150>
  5667. 8023d68: 2b29 cmp r3, #41 ; 0x29
  5668. 8023d6a: d01d beq.n 8023da8 <__hexnan+0x1ac>
  5669. 8023d6c: 2004 movs r0, #4
  5670. 8023d6e: b005 add sp, #20
  5671. 8023d70: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  5672. 8023d74: f7ff fc68 bl 8023648 <__hexdig_init>
  5673. 8023d78: e74f b.n 8023c1a <__hexnan+0x1e>
  5674. 8023d7a: 9a03 ldr r2, [sp, #12]
  5675. 8023d7c: 2a00 cmp r2, #0
  5676. 8023d7e: d0cd beq.n 8023d1c <__hexnan+0x120>
  5677. 8023d80: 9a00 ldr r2, [sp, #0]
  5678. 8023d82: 9903 ldr r1, [sp, #12]
  5679. 8023d84: f852 3c04 ldr.w r3, [r2, #-4]
  5680. 8023d88: f1c1 0220 rsb r2, r1, #32
  5681. 8023d8c: f04f 31ff mov.w r1, #4294967295
  5682. 8023d90: fa21 f202 lsr.w r2, r1, r2
  5683. 8023d94: 4013 ands r3, r2
  5684. 8023d96: 9a00 ldr r2, [sp, #0]
  5685. 8023d98: f842 3c04 str.w r3, [r2, #-4]
  5686. 8023d9c: e7c1 b.n 8023d22 <__hexnan+0x126>
  5687. 8023d9e: 4653 mov r3, sl
  5688. 8023da0: 2201 movs r2, #1
  5689. 8023da2: 2005 movs r0, #5
  5690. 8023da4: 601a str r2, [r3, #0]
  5691. 8023da6: e7e2 b.n 8023d6e <__hexnan+0x172>
  5692. 8023da8: 9b02 ldr r3, [sp, #8]
  5693. 8023daa: 3102 adds r1, #2
  5694. 8023dac: 6019 str r1, [r3, #0]
  5695. 8023dae: 2e00 cmp r6, #0
  5696. 8023db0: d186 bne.n 8023cc0 <__hexnan+0xc4>
  5697. 8023db2: e7db b.n 8023d6c <__hexnan+0x170>
  5698. 08023db4 <_setlocale_r>:
  5699. 8023db4: b510 push {r4, lr}
  5700. 8023db6: 4614 mov r4, r2
  5701. 8023db8: b13a cbz r2, 8023dca <_setlocale_r+0x16>
  5702. 8023dba: f24b 7118 movw r1, #46872 ; 0xb718
  5703. 8023dbe: 4610 mov r0, r2
  5704. 8023dc0: f6c0 0103 movt r1, #2051 ; 0x803
  5705. 8023dc4: f7fd fd84 bl 80218d0 <strcmp>
  5706. 8023dc8: b920 cbnz r0, 8023dd4 <_setlocale_r+0x20>
  5707. 8023dca: f24b 7014 movw r0, #46868 ; 0xb714
  5708. 8023dce: f6c0 0003 movt r0, #2051 ; 0x803
  5709. 8023dd2: bd10 pop {r4, pc}
  5710. 8023dd4: f24b 7114 movw r1, #46868 ; 0xb714
  5711. 8023dd8: 4620 mov r0, r4
  5712. 8023dda: f6c0 0103 movt r1, #2051 ; 0x803
  5713. 8023dde: f7fd fd77 bl 80218d0 <strcmp>
  5714. 8023de2: 2800 cmp r0, #0
  5715. 8023de4: d0f1 beq.n 8023dca <_setlocale_r+0x16>
  5716. 8023de6: f24b 7120 movw r1, #46880 ; 0xb720
  5717. 8023dea: 4620 mov r0, r4
  5718. 8023dec: f6c0 0103 movt r1, #2051 ; 0x803
  5719. 8023df0: f7fd fd6e bl 80218d0 <strcmp>
  5720. 8023df4: f24b 7314 movw r3, #46868 ; 0xb714
  5721. 8023df8: f6c0 0303 movt r3, #2051 ; 0x803
  5722. 8023dfc: 2800 cmp r0, #0
  5723. 8023dfe: bf0c ite eq
  5724. 8023e00: 4618 moveq r0, r3
  5725. 8023e02: 2000 movne r0, #0
  5726. 8023e04: bd10 pop {r4, pc}
  5727. 8023e06: bf00 nop
  5728. 08023e08 <__locale_charset>:
  5729. 8023e08: f240 1020 movw r0, #288 ; 0x120
  5730. 8023e0c: f2c2 0000 movt r0, #8192 ; 0x2000
  5731. 8023e10: 4770 bx lr
  5732. 8023e12: bf00 nop
  5733. 08023e14 <__locale_mb_cur_max>:
  5734. 8023e14: f240 1320 movw r3, #288 ; 0x120
  5735. 8023e18: f2c2 0300 movt r3, #8192 ; 0x2000
  5736. 8023e1c: 6a18 ldr r0, [r3, #32]
  5737. 8023e1e: 4770 bx lr
  5738. 08023e20 <__locale_msgcharset>:
  5739. 8023e20: 4800 ldr r0, [pc, #0] ; (8023e24 <__locale_msgcharset+0x4>)
  5740. 8023e22: 4770 bx lr
  5741. 8023e24: 20000144 .word 0x20000144
  5742. 08023e28 <__locale_cjk_lang>:
  5743. 8023e28: 2000 movs r0, #0
  5744. 8023e2a: 4770 bx lr
  5745. 08023e2c <_localeconv_r>:
  5746. 8023e2c: 4800 ldr r0, [pc, #0] ; (8023e30 <_localeconv_r+0x4>)
  5747. 8023e2e: 4770 bx lr
  5748. 8023e30: 20000164 .word 0x20000164
  5749. 08023e34 <setlocale>:
  5750. 8023e34: f240 032c movw r3, #44 ; 0x2c
  5751. 8023e38: 460a mov r2, r1
  5752. 8023e3a: f2c2 0300 movt r3, #8192 ; 0x2000
  5753. 8023e3e: 4601 mov r1, r0
  5754. 8023e40: 6818 ldr r0, [r3, #0]
  5755. 8023e42: f7ff bfb7 b.w 8023db4 <_setlocale_r>
  5756. 8023e46: bf00 nop
  5757. 08023e48 <localeconv>:
  5758. 8023e48: 4800 ldr r0, [pc, #0] ; (8023e4c <localeconv+0x4>)
  5759. 8023e4a: 4770 bx lr
  5760. 8023e4c: 20000164 .word 0x20000164
  5761. 08023e50 <malloc>:
  5762. 8023e50: f240 032c movw r3, #44 ; 0x2c
  5763. 8023e54: 4601 mov r1, r0
  5764. 8023e56: f2c2 0300 movt r3, #8192 ; 0x2000
  5765. 8023e5a: 6818 ldr r0, [r3, #0]
  5766. 8023e5c: f000 b808 b.w 8023e70 <_malloc_r>
  5767. 08023e60 <free>:
  5768. 8023e60: f240 032c movw r3, #44 ; 0x2c
  5769. 8023e64: 4601 mov r1, r0
  5770. 8023e66: f2c2 0300 movt r3, #8192 ; 0x2000
  5771. 8023e6a: 6818 ldr r0, [r3, #0]
  5772. 8023e6c: f7ff baca b.w 8023404 <_free_r>
  5773. 08023e70 <_malloc_r>:
  5774. 8023e70: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  5775. 8023e74: f101 040b add.w r4, r1, #11
  5776. 8023e78: 2c16 cmp r4, #22
  5777. 8023e7a: b083 sub sp, #12
  5778. 8023e7c: 4607 mov r7, r0
  5779. 8023e7e: d930 bls.n 8023ee2 <_malloc_r+0x72>
  5780. 8023e80: f024 0407 bic.w r4, r4, #7
  5781. 8023e84: 0fe3 lsrs r3, r4, #31
  5782. 8023e86: 428c cmp r4, r1
  5783. 8023e88: bf2c ite cs
  5784. 8023e8a: 4619 movcs r1, r3
  5785. 8023e8c: f043 0101 orrcc.w r1, r3, #1
  5786. 8023e90: 2900 cmp r1, #0
  5787. 8023e92: d12f bne.n 8023ef4 <_malloc_r+0x84>
  5788. 8023e94: 4638 mov r0, r7
  5789. 8023e96: f000 fb01 bl 802449c <__malloc_lock>
  5790. 8023e9a: f5b4 7ffc cmp.w r4, #504 ; 0x1f8
  5791. 8023e9e: d22e bcs.n 8023efe <_malloc_r+0x8e>
  5792. 8023ea0: ea4f 0cd4 mov.w ip, r4, lsr #3
  5793. 8023ea4: f240 169c movw r6, #412 ; 0x19c
  5794. 8023ea8: f2c2 0600 movt r6, #8192 ; 0x2000
  5795. 8023eac: eb06 02cc add.w r2, r6, ip, lsl #3
  5796. 8023eb0: 68d3 ldr r3, [r2, #12]
  5797. 8023eb2: 4293 cmp r3, r2
  5798. 8023eb4: f000 8211 beq.w 80242da <_malloc_r+0x46a>
  5799. 8023eb8: 6859 ldr r1, [r3, #4]
  5800. 8023eba: f103 0808 add.w r8, r3, #8
  5801. 8023ebe: 68da ldr r2, [r3, #12]
  5802. 8023ec0: 4638 mov r0, r7
  5803. 8023ec2: f021 0403 bic.w r4, r1, #3
  5804. 8023ec6: 6899 ldr r1, [r3, #8]
  5805. 8023ec8: 191b adds r3, r3, r4
  5806. 8023eca: 685c ldr r4, [r3, #4]
  5807. 8023ecc: 60ca str r2, [r1, #12]
  5808. 8023ece: f044 0401 orr.w r4, r4, #1
  5809. 8023ed2: 6091 str r1, [r2, #8]
  5810. 8023ed4: 605c str r4, [r3, #4]
  5811. 8023ed6: f000 fae3 bl 80244a0 <__malloc_unlock>
  5812. 8023eda: 4640 mov r0, r8
  5813. 8023edc: b003 add sp, #12
  5814. 8023ede: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  5815. 8023ee2: 2300 movs r3, #0
  5816. 8023ee4: 2410 movs r4, #16
  5817. 8023ee6: 428c cmp r4, r1
  5818. 8023ee8: bf2c ite cs
  5819. 8023eea: 4619 movcs r1, r3
  5820. 8023eec: f043 0101 orrcc.w r1, r3, #1
  5821. 8023ef0: 2900 cmp r1, #0
  5822. 8023ef2: d0cf beq.n 8023e94 <_malloc_r+0x24>
  5823. 8023ef4: 230c movs r3, #12
  5824. 8023ef6: f04f 0800 mov.w r8, #0
  5825. 8023efa: 603b str r3, [r7, #0]
  5826. 8023efc: e7ed b.n 8023eda <_malloc_r+0x6a>
  5827. 8023efe: ea5f 2c54 movs.w ip, r4, lsr #9
  5828. 8023f02: bf04 itt eq
  5829. 8023f04: ea4f 0cd4 moveq.w ip, r4, lsr #3
  5830. 8023f08: ea4f 054c moveq.w r5, ip, lsl #1
  5831. 8023f0c: f040 808f bne.w 802402e <_malloc_r+0x1be>
  5832. 8023f10: f240 169c movw r6, #412 ; 0x19c
  5833. 8023f14: f2c2 0600 movt r6, #8192 ; 0x2000
  5834. 8023f18: eb06 0585 add.w r5, r6, r5, lsl #2
  5835. 8023f1c: 68eb ldr r3, [r5, #12]
  5836. 8023f1e: 429d cmp r5, r3
  5837. 8023f20: d106 bne.n 8023f30 <_malloc_r+0xc0>
  5838. 8023f22: e00d b.n 8023f40 <_malloc_r+0xd0>
  5839. 8023f24: 2a00 cmp r2, #0
  5840. 8023f26: f280 8155 bge.w 80241d4 <_malloc_r+0x364>
  5841. 8023f2a: 68db ldr r3, [r3, #12]
  5842. 8023f2c: 429d cmp r5, r3
  5843. 8023f2e: d007 beq.n 8023f40 <_malloc_r+0xd0>
  5844. 8023f30: 6859 ldr r1, [r3, #4]
  5845. 8023f32: f021 0103 bic.w r1, r1, #3
  5846. 8023f36: 1b0a subs r2, r1, r4
  5847. 8023f38: 2a0f cmp r2, #15
  5848. 8023f3a: ddf3 ble.n 8023f24 <_malloc_r+0xb4>
  5849. 8023f3c: f10c 3cff add.w ip, ip, #4294967295
  5850. 8023f40: f10c 0c01 add.w ip, ip, #1
  5851. 8023f44: f240 129c movw r2, #412 ; 0x19c
  5852. 8023f48: 6933 ldr r3, [r6, #16]
  5853. 8023f4a: f2c2 0200 movt r2, #8192 ; 0x2000
  5854. 8023f4e: f102 0e08 add.w lr, r2, #8
  5855. 8023f52: 4573 cmp r3, lr
  5856. 8023f54: bf08 it eq
  5857. 8023f56: f8d2 9004 ldreq.w r9, [r2, #4]
  5858. 8023f5a: d022 beq.n 8023fa2 <_malloc_r+0x132>
  5859. 8023f5c: 6858 ldr r0, [r3, #4]
  5860. 8023f5e: f020 0003 bic.w r0, r0, #3
  5861. 8023f62: 1b01 subs r1, r0, r4
  5862. 8023f64: 290f cmp r1, #15
  5863. 8023f66: f300 8184 bgt.w 8024272 <_malloc_r+0x402>
  5864. 8023f6a: 2900 cmp r1, #0
  5865. 8023f6c: f8c2 e014 str.w lr, [r2, #20]
  5866. 8023f70: f8c2 e010 str.w lr, [r2, #16]
  5867. 8023f74: da66 bge.n 8024044 <_malloc_r+0x1d4>
  5868. 8023f76: f5b0 7f00 cmp.w r0, #512 ; 0x200
  5869. 8023f7a: f080 814e bcs.w 802421a <_malloc_r+0x3aa>
  5870. 8023f7e: 08c1 lsrs r1, r0, #3
  5871. 8023f80: f04f 0801 mov.w r8, #1
  5872. 8023f84: eb02 00c1 add.w r0, r2, r1, lsl #3
  5873. 8023f88: 1089 asrs r1, r1, #2
  5874. 8023f8a: fa08 f801 lsl.w r8, r8, r1
  5875. 8023f8e: 6851 ldr r1, [r2, #4]
  5876. 8023f90: 6885 ldr r5, [r0, #8]
  5877. 8023f92: 60d8 str r0, [r3, #12]
  5878. 8023f94: ea48 0901 orr.w r9, r8, r1
  5879. 8023f98: f8c2 9004 str.w r9, [r2, #4]
  5880. 8023f9c: 609d str r5, [r3, #8]
  5881. 8023f9e: 60eb str r3, [r5, #12]
  5882. 8023fa0: 6083 str r3, [r0, #8]
  5883. 8023fa2: 2201 movs r2, #1
  5884. 8023fa4: ea4f 03ac mov.w r3, ip, asr #2
  5885. 8023fa8: fa02 f303 lsl.w r3, r2, r3
  5886. 8023fac: 454b cmp r3, r9
  5887. 8023fae: d854 bhi.n 802405a <_malloc_r+0x1ea>
  5888. 8023fb0: ea19 0f03 tst.w r9, r3
  5889. 8023fb4: d10d bne.n 8023fd2 <_malloc_r+0x162>
  5890. 8023fb6: 4093 lsls r3, r2
  5891. 8023fb8: f02c 0c03 bic.w ip, ip, #3
  5892. 8023fbc: ea19 0f03 tst.w r9, r3
  5893. 8023fc0: f10c 0c04 add.w ip, ip, #4
  5894. 8023fc4: d105 bne.n 8023fd2 <_malloc_r+0x162>
  5895. 8023fc6: 005b lsls r3, r3, #1
  5896. 8023fc8: f10c 0c04 add.w ip, ip, #4
  5897. 8023fcc: ea19 0f03 tst.w r9, r3
  5898. 8023fd0: d0f9 beq.n 8023fc6 <_malloc_r+0x156>
  5899. 8023fd2: eb06 09cc add.w r9, r6, ip, lsl #3
  5900. 8023fd6: 46e0 mov r8, ip
  5901. 8023fd8: 4648 mov r0, r9
  5902. 8023fda: 68c2 ldr r2, [r0, #12]
  5903. 8023fdc: 4290 cmp r0, r2
  5904. 8023fde: d107 bne.n 8023ff0 <_malloc_r+0x180>
  5905. 8023fe0: e15b b.n 802429a <_malloc_r+0x42a>
  5906. 8023fe2: 2900 cmp r1, #0
  5907. 8023fe4: f280 8183 bge.w 80242ee <_malloc_r+0x47e>
  5908. 8023fe8: 68d2 ldr r2, [r2, #12]
  5909. 8023fea: 4290 cmp r0, r2
  5910. 8023fec: f000 8155 beq.w 802429a <_malloc_r+0x42a>
  5911. 8023ff0: 6855 ldr r5, [r2, #4]
  5912. 8023ff2: f025 0503 bic.w r5, r5, #3
  5913. 8023ff6: 1b29 subs r1, r5, r4
  5914. 8023ff8: 290f cmp r1, #15
  5915. 8023ffa: ddf2 ble.n 8023fe2 <_malloc_r+0x172>
  5916. 8023ffc: 4690 mov r8, r2
  5917. 8023ffe: 1913 adds r3, r2, r4
  5918. 8024000: 68d5 ldr r5, [r2, #12]
  5919. 8024002: f044 0001 orr.w r0, r4, #1
  5920. 8024006: f858 4f08 ldr.w r4, [r8, #8]!
  5921. 802400a: f041 0c01 orr.w ip, r1, #1
  5922. 802400e: 6050 str r0, [r2, #4]
  5923. 8024010: 4638 mov r0, r7
  5924. 8024012: f8c3 c004 str.w ip, [r3, #4]
  5925. 8024016: 60e5 str r5, [r4, #12]
  5926. 8024018: 60ac str r4, [r5, #8]
  5927. 802401a: 6173 str r3, [r6, #20]
  5928. 802401c: 6133 str r3, [r6, #16]
  5929. 802401e: f8c3 e00c str.w lr, [r3, #12]
  5930. 8024022: f8c3 e008 str.w lr, [r3, #8]
  5931. 8024026: 5059 str r1, [r3, r1]
  5932. 8024028: f000 fa3a bl 80244a0 <__malloc_unlock>
  5933. 802402c: e755 b.n 8023eda <_malloc_r+0x6a>
  5934. 802402e: f1bc 0f04 cmp.w ip, #4
  5935. 8024032: f200 80de bhi.w 80241f2 <_malloc_r+0x382>
  5936. 8024036: ea4f 1c94 mov.w ip, r4, lsr #6
  5937. 802403a: f10c 0c38 add.w ip, ip, #56 ; 0x38
  5938. 802403e: ea4f 054c mov.w r5, ip, lsl #1
  5939. 8024042: e765 b.n 8023f10 <_malloc_r+0xa0>
  5940. 8024044: 181a adds r2, r3, r0
  5941. 8024046: f103 0808 add.w r8, r3, #8
  5942. 802404a: 4638 mov r0, r7
  5943. 802404c: 6853 ldr r3, [r2, #4]
  5944. 802404e: f043 0301 orr.w r3, r3, #1
  5945. 8024052: 6053 str r3, [r2, #4]
  5946. 8024054: f000 fa24 bl 80244a0 <__malloc_unlock>
  5947. 8024058: e73f b.n 8023eda <_malloc_r+0x6a>
  5948. 802405a: 68b5 ldr r5, [r6, #8]
  5949. 802405c: 686b ldr r3, [r5, #4]
  5950. 802405e: f023 0a03 bic.w sl, r3, #3
  5951. 8024062: 4554 cmp r4, sl
  5952. 8024064: d804 bhi.n 8024070 <_malloc_r+0x200>
  5953. 8024066: ebc4 030a rsb r3, r4, sl
  5954. 802406a: 2b0f cmp r3, #15
  5955. 802406c: f300 80a4 bgt.w 80241b8 <_malloc_r+0x348>
  5956. 8024070: f641 1914 movw r9, #6420 ; 0x1914
  5957. 8024074: f8d6 1408 ldr.w r1, [r6, #1032] ; 0x408
  5958. 8024078: f2c2 0900 movt r9, #8192 ; 0x2000
  5959. 802407c: eb05 020a add.w r2, r5, sl
  5960. 8024080: 3101 adds r1, #1
  5961. 8024082: f8d9 3000 ldr.w r3, [r9]
  5962. 8024086: 4423 add r3, r4
  5963. 8024088: bf08 it eq
  5964. 802408a: f103 0b10 addeq.w fp, r3, #16
  5965. 802408e: d006 beq.n 802409e <_malloc_r+0x22e>
  5966. 8024090: f503 5380 add.w r3, r3, #4096 ; 0x1000
  5967. 8024094: 330f adds r3, #15
  5968. 8024096: f423 637f bic.w r3, r3, #4080 ; 0xff0
  5969. 802409a: f023 0b0f bic.w fp, r3, #15
  5970. 802409e: 4638 mov r0, r7
  5971. 80240a0: 4659 mov r1, fp
  5972. 80240a2: 9201 str r2, [sp, #4]
  5973. 80240a4: f000 fe86 bl 8024db4 <_sbrk_r>
  5974. 80240a8: 9a01 ldr r2, [sp, #4]
  5975. 80240aa: 1c41 adds r1, r0, #1
  5976. 80240ac: 4680 mov r8, r0
  5977. 80240ae: f000 8168 beq.w 8024382 <_malloc_r+0x512>
  5978. 80240b2: 4282 cmp r2, r0
  5979. 80240b4: f200 8131 bhi.w 802431a <_malloc_r+0x4aa>
  5980. 80240b8: f8d9 3004 ldr.w r3, [r9, #4]
  5981. 80240bc: 4542 cmp r2, r8
  5982. 80240be: 445b add r3, fp
  5983. 80240c0: f8c9 3004 str.w r3, [r9, #4]
  5984. 80240c4: f000 8166 beq.w 8024394 <_malloc_r+0x524>
  5985. 80240c8: f8d6 1408 ldr.w r1, [r6, #1032] ; 0x408
  5986. 80240cc: f240 109c movw r0, #412 ; 0x19c
  5987. 80240d0: f2c2 0000 movt r0, #8192 ; 0x2000
  5988. 80240d4: 3101 adds r1, #1
  5989. 80240d6: bf17 itett ne
  5990. 80240d8: ebc2 0208 rsbne r2, r2, r8
  5991. 80240dc: f8c0 8408 streq.w r8, [r0, #1032] ; 0x408
  5992. 80240e0: 189b addne r3, r3, r2
  5993. 80240e2: f8c9 3004 strne.w r3, [r9, #4]
  5994. 80240e6: f018 0307 ands.w r3, r8, #7
  5995. 80240ea: 4638 mov r0, r7
  5996. 80240ec: bf1f itttt ne
  5997. 80240ee: f1c3 0208 rsbne r2, r3, #8
  5998. 80240f2: f5c3 5380 rsbne r3, r3, #4096 ; 0x1000
  5999. 80240f6: 4490 addne r8, r2
  6000. 80240f8: f103 0208 addne.w r2, r3, #8
  6001. 80240fc: eb08 030b add.w r3, r8, fp
  6002. 8024100: bf08 it eq
  6003. 8024102: f44f 5280 moveq.w r2, #4096 ; 0x1000
  6004. 8024106: 051b lsls r3, r3, #20
  6005. 8024108: 0d1b lsrs r3, r3, #20
  6006. 802410a: ebc3 0b02 rsb fp, r3, r2
  6007. 802410e: 4659 mov r1, fp
  6008. 8024110: f000 fe50 bl 8024db4 <_sbrk_r>
  6009. 8024114: 1c43 adds r3, r0, #1
  6010. 8024116: f000 8149 beq.w 80243ac <_malloc_r+0x53c>
  6011. 802411a: ebc8 0100 rsb r1, r8, r0
  6012. 802411e: 4459 add r1, fp
  6013. 8024120: f041 0101 orr.w r1, r1, #1
  6014. 8024124: f8d9 3004 ldr.w r3, [r9, #4]
  6015. 8024128: 42b5 cmp r5, r6
  6016. 802412a: f641 1214 movw r2, #6420 ; 0x1914
  6017. 802412e: f8c6 8008 str.w r8, [r6, #8]
  6018. 8024132: 445b add r3, fp
  6019. 8024134: f2c2 0200 movt r2, #8192 ; 0x2000
  6020. 8024138: f8c8 1004 str.w r1, [r8, #4]
  6021. 802413c: f8c9 3004 str.w r3, [r9, #4]
  6022. 8024140: d018 beq.n 8024174 <_malloc_r+0x304>
  6023. 8024142: f1ba 0f0f cmp.w sl, #15
  6024. 8024146: f240 810b bls.w 8024360 <_malloc_r+0x4f0>
  6025. 802414a: f1aa 000c sub.w r0, sl, #12
  6026. 802414e: 6869 ldr r1, [r5, #4]
  6027. 8024150: f020 0007 bic.w r0, r0, #7
  6028. 8024154: f04f 0c05 mov.w ip, #5
  6029. 8024158: eb05 0e00 add.w lr, r5, r0
  6030. 802415c: 280f cmp r0, #15
  6031. 802415e: f001 0101 and.w r1, r1, #1
  6032. 8024162: ea40 0101 orr.w r1, r0, r1
  6033. 8024166: 6069 str r1, [r5, #4]
  6034. 8024168: f8ce c004 str.w ip, [lr, #4]
  6035. 802416c: f8ce c008 str.w ip, [lr, #8]
  6036. 8024170: f200 8120 bhi.w 80243b4 <_malloc_r+0x544>
  6037. 8024174: f641 1214 movw r2, #6420 ; 0x1914
  6038. 8024178: f8d9 102c ldr.w r1, [r9, #44] ; 0x2c
  6039. 802417c: f2c2 0200 movt r2, #8192 ; 0x2000
  6040. 8024180: 68b5 ldr r5, [r6, #8]
  6041. 8024182: 428b cmp r3, r1
  6042. 8024184: f8d9 1030 ldr.w r1, [r9, #48] ; 0x30
  6043. 8024188: bf88 it hi
  6044. 802418a: 62d3 strhi r3, [r2, #44] ; 0x2c
  6045. 802418c: f641 1214 movw r2, #6420 ; 0x1914
  6046. 8024190: f2c2 0200 movt r2, #8192 ; 0x2000
  6047. 8024194: 428b cmp r3, r1
  6048. 8024196: bf88 it hi
  6049. 8024198: 6313 strhi r3, [r2, #48] ; 0x30
  6050. 802419a: 686a ldr r2, [r5, #4]
  6051. 802419c: f022 0203 bic.w r2, r2, #3
  6052. 80241a0: 4294 cmp r4, r2
  6053. 80241a2: ebc4 0302 rsb r3, r4, r2
  6054. 80241a6: d801 bhi.n 80241ac <_malloc_r+0x33c>
  6055. 80241a8: 2b0f cmp r3, #15
  6056. 80241aa: dc05 bgt.n 80241b8 <_malloc_r+0x348>
  6057. 80241ac: 4638 mov r0, r7
  6058. 80241ae: f04f 0800 mov.w r8, #0
  6059. 80241b2: f000 f975 bl 80244a0 <__malloc_unlock>
  6060. 80241b6: e690 b.n 8023eda <_malloc_r+0x6a>
  6061. 80241b8: 192a adds r2, r5, r4
  6062. 80241ba: f043 0301 orr.w r3, r3, #1
  6063. 80241be: f044 0401 orr.w r4, r4, #1
  6064. 80241c2: 4638 mov r0, r7
  6065. 80241c4: 606c str r4, [r5, #4]
  6066. 80241c6: f105 0808 add.w r8, r5, #8
  6067. 80241ca: 6053 str r3, [r2, #4]
  6068. 80241cc: 60b2 str r2, [r6, #8]
  6069. 80241ce: f000 f967 bl 80244a0 <__malloc_unlock>
  6070. 80241d2: e682 b.n 8023eda <_malloc_r+0x6a>
  6071. 80241d4: 1859 adds r1, r3, r1
  6072. 80241d6: 68da ldr r2, [r3, #12]
  6073. 80241d8: 689c ldr r4, [r3, #8]
  6074. 80241da: 4638 mov r0, r7
  6075. 80241dc: 684d ldr r5, [r1, #4]
  6076. 80241de: f103 0808 add.w r8, r3, #8
  6077. 80241e2: f045 0501 orr.w r5, r5, #1
  6078. 80241e6: 60e2 str r2, [r4, #12]
  6079. 80241e8: 6094 str r4, [r2, #8]
  6080. 80241ea: 604d str r5, [r1, #4]
  6081. 80241ec: f000 f958 bl 80244a0 <__malloc_unlock>
  6082. 80241f0: e673 b.n 8023eda <_malloc_r+0x6a>
  6083. 80241f2: f1bc 0f14 cmp.w ip, #20
  6084. 80241f6: bf9c itt ls
  6085. 80241f8: f10c 0c5b addls.w ip, ip, #91 ; 0x5b
  6086. 80241fc: ea4f 054c movls.w r5, ip, lsl #1
  6087. 8024200: f67f ae86 bls.w 8023f10 <_malloc_r+0xa0>
  6088. 8024204: f1bc 0f54 cmp.w ip, #84 ; 0x54
  6089. 8024208: f200 8093 bhi.w 8024332 <_malloc_r+0x4c2>
  6090. 802420c: ea4f 3c14 mov.w ip, r4, lsr #12
  6091. 8024210: f10c 0c6e add.w ip, ip, #110 ; 0x6e
  6092. 8024214: ea4f 054c mov.w r5, ip, lsl #1
  6093. 8024218: e67a b.n 8023f10 <_malloc_r+0xa0>
  6094. 802421a: 0a42 lsrs r2, r0, #9
  6095. 802421c: 2a04 cmp r2, #4
  6096. 802421e: d975 bls.n 802430c <_malloc_r+0x49c>
  6097. 8024220: 2a14 cmp r2, #20
  6098. 8024222: bf9c itt ls
  6099. 8024224: f102 095b addls.w r9, r2, #91 ; 0x5b
  6100. 8024228: ea4f 0549 movls.w r5, r9, lsl #1
  6101. 802422c: d908 bls.n 8024240 <_malloc_r+0x3d0>
  6102. 802422e: 2a54 cmp r2, #84 ; 0x54
  6103. 8024230: f200 80c9 bhi.w 80243c6 <_malloc_r+0x556>
  6104. 8024234: ea4f 3910 mov.w r9, r0, lsr #12
  6105. 8024238: f109 096e add.w r9, r9, #110 ; 0x6e
  6106. 802423c: ea4f 0549 mov.w r5, r9, lsl #1
  6107. 8024240: eb06 0585 add.w r5, r6, r5, lsl #2
  6108. 8024244: f240 189c movw r8, #412 ; 0x19c
  6109. 8024248: f2c2 0800 movt r8, #8192 ; 0x2000
  6110. 802424c: 68aa ldr r2, [r5, #8]
  6111. 802424e: 42aa cmp r2, r5
  6112. 8024250: d079 beq.n 8024346 <_malloc_r+0x4d6>
  6113. 8024252: 6851 ldr r1, [r2, #4]
  6114. 8024254: f021 0103 bic.w r1, r1, #3
  6115. 8024258: 4288 cmp r0, r1
  6116. 802425a: d202 bcs.n 8024262 <_malloc_r+0x3f2>
  6117. 802425c: 6892 ldr r2, [r2, #8]
  6118. 802425e: 4295 cmp r5, r2
  6119. 8024260: d1f7 bne.n 8024252 <_malloc_r+0x3e2>
  6120. 8024262: 68d0 ldr r0, [r2, #12]
  6121. 8024264: f8d6 9004 ldr.w r9, [r6, #4]
  6122. 8024268: 60d8 str r0, [r3, #12]
  6123. 802426a: 609a str r2, [r3, #8]
  6124. 802426c: 60d3 str r3, [r2, #12]
  6125. 802426e: 6083 str r3, [r0, #8]
  6126. 8024270: e697 b.n 8023fa2 <_malloc_r+0x132>
  6127. 8024272: 191d adds r5, r3, r4
  6128. 8024274: f041 0601 orr.w r6, r1, #1
  6129. 8024278: 6155 str r5, [r2, #20]
  6130. 802427a: f044 0401 orr.w r4, r4, #1
  6131. 802427e: 6115 str r5, [r2, #16]
  6132. 8024280: 4638 mov r0, r7
  6133. 8024282: 605c str r4, [r3, #4]
  6134. 8024284: f103 0808 add.w r8, r3, #8
  6135. 8024288: f8c5 e00c str.w lr, [r5, #12]
  6136. 802428c: f8c5 e008 str.w lr, [r5, #8]
  6137. 8024290: 606e str r6, [r5, #4]
  6138. 8024292: 5069 str r1, [r5, r1]
  6139. 8024294: f000 f904 bl 80244a0 <__malloc_unlock>
  6140. 8024298: e61f b.n 8023eda <_malloc_r+0x6a>
  6141. 802429a: f108 0801 add.w r8, r8, #1
  6142. 802429e: 3008 adds r0, #8
  6143. 80242a0: f018 0f03 tst.w r8, #3
  6144. 80242a4: f47f ae99 bne.w 8023fda <_malloc_r+0x16a>
  6145. 80242a8: 464a mov r2, r9
  6146. 80242aa: f01c 0f03 tst.w ip, #3
  6147. 80242ae: f1a2 0108 sub.w r1, r2, #8
  6148. 80242b2: f10c 3cff add.w ip, ip, #4294967295
  6149. 80242b6: f000 809e beq.w 80243f6 <_malloc_r+0x586>
  6150. 80242ba: 6812 ldr r2, [r2, #0]
  6151. 80242bc: 428a cmp r2, r1
  6152. 80242be: d0f4 beq.n 80242aa <_malloc_r+0x43a>
  6153. 80242c0: 6872 ldr r2, [r6, #4]
  6154. 80242c2: 005b lsls r3, r3, #1
  6155. 80242c4: 4293 cmp r3, r2
  6156. 80242c6: f63f aec8 bhi.w 802405a <_malloc_r+0x1ea>
  6157. 80242ca: 2b00 cmp r3, #0
  6158. 80242cc: f43f aec5 beq.w 802405a <_malloc_r+0x1ea>
  6159. 80242d0: 421a tst r2, r3
  6160. 80242d2: f000 8095 beq.w 8024400 <_malloc_r+0x590>
  6161. 80242d6: 46c4 mov ip, r8
  6162. 80242d8: e67b b.n 8023fd2 <_malloc_r+0x162>
  6163. 80242da: f103 0208 add.w r2, r3, #8
  6164. 80242de: 695b ldr r3, [r3, #20]
  6165. 80242e0: 429a cmp r2, r3
  6166. 80242e2: bf08 it eq
  6167. 80242e4: f10c 0c02 addeq.w ip, ip, #2
  6168. 80242e8: f43f ae2c beq.w 8023f44 <_malloc_r+0xd4>
  6169. 80242ec: e5e4 b.n 8023eb8 <_malloc_r+0x48>
  6170. 80242ee: 4690 mov r8, r2
  6171. 80242f0: 1955 adds r5, r2, r5
  6172. 80242f2: 68d3 ldr r3, [r2, #12]
  6173. 80242f4: 4638 mov r0, r7
  6174. 80242f6: f858 2f08 ldr.w r2, [r8, #8]!
  6175. 80242fa: 6869 ldr r1, [r5, #4]
  6176. 80242fc: 60d3 str r3, [r2, #12]
  6177. 80242fe: f041 0101 orr.w r1, r1, #1
  6178. 8024302: 609a str r2, [r3, #8]
  6179. 8024304: 6069 str r1, [r5, #4]
  6180. 8024306: f000 f8cb bl 80244a0 <__malloc_unlock>
  6181. 802430a: e5e6 b.n 8023eda <_malloc_r+0x6a>
  6182. 802430c: ea4f 1990 mov.w r9, r0, lsr #6
  6183. 8024310: f109 0938 add.w r9, r9, #56 ; 0x38
  6184. 8024314: ea4f 0549 mov.w r5, r9, lsl #1
  6185. 8024318: e792 b.n 8024240 <_malloc_r+0x3d0>
  6186. 802431a: 42b5 cmp r5, r6
  6187. 802431c: f240 139c movw r3, #412 ; 0x19c
  6188. 8024320: f2c2 0300 movt r3, #8192 ; 0x2000
  6189. 8024324: f43f aec8 beq.w 80240b8 <_malloc_r+0x248>
  6190. 8024328: 689d ldr r5, [r3, #8]
  6191. 802432a: 686a ldr r2, [r5, #4]
  6192. 802432c: f022 0203 bic.w r2, r2, #3
  6193. 8024330: e736 b.n 80241a0 <_malloc_r+0x330>
  6194. 8024332: f5bc 7faa cmp.w ip, #340 ; 0x154
  6195. 8024336: d819 bhi.n 802436c <_malloc_r+0x4fc>
  6196. 8024338: ea4f 3cd4 mov.w ip, r4, lsr #15
  6197. 802433c: f10c 0c77 add.w ip, ip, #119 ; 0x77
  6198. 8024340: ea4f 054c mov.w r5, ip, lsl #1
  6199. 8024344: e5e4 b.n 8023f10 <_malloc_r+0xa0>
  6200. 8024346: 2501 movs r5, #1
  6201. 8024348: f8d8 1004 ldr.w r1, [r8, #4]
  6202. 802434c: ea4f 09a9 mov.w r9, r9, asr #2
  6203. 8024350: 4610 mov r0, r2
  6204. 8024352: fa05 f509 lsl.w r5, r5, r9
  6205. 8024356: ea45 0901 orr.w r9, r5, r1
  6206. 802435a: f8c8 9004 str.w r9, [r8, #4]
  6207. 802435e: e783 b.n 8024268 <_malloc_r+0x3f8>
  6208. 8024360: 2301 movs r3, #1
  6209. 8024362: 4645 mov r5, r8
  6210. 8024364: f8c8 3004 str.w r3, [r8, #4]
  6211. 8024368: 2200 movs r2, #0
  6212. 802436a: e719 b.n 80241a0 <_malloc_r+0x330>
  6213. 802436c: f240 5354 movw r3, #1364 ; 0x554
  6214. 8024370: 459c cmp ip, r3
  6215. 8024372: d80b bhi.n 802438c <_malloc_r+0x51c>
  6216. 8024374: ea4f 4c94 mov.w ip, r4, lsr #18
  6217. 8024378: f10c 0c7c add.w ip, ip, #124 ; 0x7c
  6218. 802437c: ea4f 054c mov.w r5, ip, lsl #1
  6219. 8024380: e5c6 b.n 8023f10 <_malloc_r+0xa0>
  6220. 8024382: 68b5 ldr r5, [r6, #8]
  6221. 8024384: 686a ldr r2, [r5, #4]
  6222. 8024386: f022 0203 bic.w r2, r2, #3
  6223. 802438a: e709 b.n 80241a0 <_malloc_r+0x330>
  6224. 802438c: 25fc movs r5, #252 ; 0xfc
  6225. 802438e: f04f 0c7e mov.w ip, #126 ; 0x7e
  6226. 8024392: e5bd b.n 8023f10 <_malloc_r+0xa0>
  6227. 8024394: 0511 lsls r1, r2, #20
  6228. 8024396: 0d09 lsrs r1, r1, #20
  6229. 8024398: 2900 cmp r1, #0
  6230. 802439a: f47f ae95 bne.w 80240c8 <_malloc_r+0x258>
  6231. 802439e: 68b2 ldr r2, [r6, #8]
  6232. 80243a0: eb0b 010a add.w r1, fp, sl
  6233. 80243a4: f041 0101 orr.w r1, r1, #1
  6234. 80243a8: 6051 str r1, [r2, #4]
  6235. 80243aa: e6e3 b.n 8024174 <_malloc_r+0x304>
  6236. 80243ac: 2101 movs r1, #1
  6237. 80243ae: f04f 0b00 mov.w fp, #0
  6238. 80243b2: e6b7 b.n 8024124 <_malloc_r+0x2b4>
  6239. 80243b4: 4638 mov r0, r7
  6240. 80243b6: f105 0108 add.w r1, r5, #8
  6241. 80243ba: 9201 str r2, [sp, #4]
  6242. 80243bc: f7ff f822 bl 8023404 <_free_r>
  6243. 80243c0: 9a01 ldr r2, [sp, #4]
  6244. 80243c2: 6853 ldr r3, [r2, #4]
  6245. 80243c4: e6d6 b.n 8024174 <_malloc_r+0x304>
  6246. 80243c6: f5b2 7faa cmp.w r2, #340 ; 0x154
  6247. 80243ca: d806 bhi.n 80243da <_malloc_r+0x56a>
  6248. 80243cc: ea4f 39d0 mov.w r9, r0, lsr #15
  6249. 80243d0: f109 0977 add.w r9, r9, #119 ; 0x77
  6250. 80243d4: ea4f 0549 mov.w r5, r9, lsl #1
  6251. 80243d8: e732 b.n 8024240 <_malloc_r+0x3d0>
  6252. 80243da: f240 5154 movw r1, #1364 ; 0x554
  6253. 80243de: 25fc movs r5, #252 ; 0xfc
  6254. 80243e0: 428a cmp r2, r1
  6255. 80243e2: f04f 097e mov.w r9, #126 ; 0x7e
  6256. 80243e6: bf9e ittt ls
  6257. 80243e8: ea4f 4990 movls.w r9, r0, lsr #18
  6258. 80243ec: f109 097c addls.w r9, r9, #124 ; 0x7c
  6259. 80243f0: ea4f 0549 movls.w r5, r9, lsl #1
  6260. 80243f4: e724 b.n 8024240 <_malloc_r+0x3d0>
  6261. 80243f6: 6872 ldr r2, [r6, #4]
  6262. 80243f8: ea22 0203 bic.w r2, r2, r3
  6263. 80243fc: 6072 str r2, [r6, #4]
  6264. 80243fe: e760 b.n 80242c2 <_malloc_r+0x452>
  6265. 8024400: 005b lsls r3, r3, #1
  6266. 8024402: f108 0804 add.w r8, r8, #4
  6267. 8024406: e763 b.n 80242d0 <_malloc_r+0x460>
  6268. 08024408 <memchr>:
  6269. 8024408: 0783 lsls r3, r0, #30
  6270. 802440a: b2c9 uxtb r1, r1
  6271. 802440c: b470 push {r4, r5, r6}
  6272. 802440e: d040 beq.n 8024492 <memchr+0x8a>
  6273. 8024410: 1e54 subs r4, r2, #1
  6274. 8024412: 2a00 cmp r2, #0
  6275. 8024414: d03f beq.n 8024496 <memchr+0x8e>
  6276. 8024416: 7803 ldrb r3, [r0, #0]
  6277. 8024418: 428b cmp r3, r1
  6278. 802441a: d021 beq.n 8024460 <memchr+0x58>
  6279. 802441c: 1c43 adds r3, r0, #1
  6280. 802441e: e004 b.n 802442a <memchr+0x22>
  6281. 8024420: b304 cbz r4, 8024464 <memchr+0x5c>
  6282. 8024422: 7802 ldrb r2, [r0, #0]
  6283. 8024424: 3c01 subs r4, #1
  6284. 8024426: 428a cmp r2, r1
  6285. 8024428: d01a beq.n 8024460 <memchr+0x58>
  6286. 802442a: f013 0f03 tst.w r3, #3
  6287. 802442e: 4618 mov r0, r3
  6288. 8024430: f103 0301 add.w r3, r3, #1
  6289. 8024434: d1f4 bne.n 8024420 <memchr+0x18>
  6290. 8024436: 2c03 cmp r4, #3
  6291. 8024438: d816 bhi.n 8024468 <memchr+0x60>
  6292. 802443a: 1e65 subs r5, r4, #1
  6293. 802443c: b194 cbz r4, 8024464 <memchr+0x5c>
  6294. 802443e: 7803 ldrb r3, [r0, #0]
  6295. 8024440: 428b cmp r3, r1
  6296. 8024442: d00d beq.n 8024460 <memchr+0x58>
  6297. 8024444: 1c42 adds r2, r0, #1
  6298. 8024446: 2300 movs r3, #0
  6299. 8024448: e002 b.n 8024450 <memchr+0x48>
  6300. 802444a: 7804 ldrb r4, [r0, #0]
  6301. 802444c: 428c cmp r4, r1
  6302. 802444e: d007 beq.n 8024460 <memchr+0x58>
  6303. 8024450: 429d cmp r5, r3
  6304. 8024452: 4610 mov r0, r2
  6305. 8024454: f103 0301 add.w r3, r3, #1
  6306. 8024458: f102 0201 add.w r2, r2, #1
  6307. 802445c: d1f5 bne.n 802444a <memchr+0x42>
  6308. 802445e: 2000 movs r0, #0
  6309. 8024460: bc70 pop {r4, r5, r6}
  6310. 8024462: 4770 bx lr
  6311. 8024464: 4620 mov r0, r4
  6312. 8024466: e7fb b.n 8024460 <memchr+0x58>
  6313. 8024468: ea41 2601 orr.w r6, r1, r1, lsl #8
  6314. 802446c: ea46 4606 orr.w r6, r6, r6, lsl #16
  6315. 8024470: 4602 mov r2, r0
  6316. 8024472: 3004 adds r0, #4
  6317. 8024474: 6813 ldr r3, [r2, #0]
  6318. 8024476: 4073 eors r3, r6
  6319. 8024478: f1a3 3501 sub.w r5, r3, #16843009 ; 0x1010101
  6320. 802447c: ea25 0303 bic.w r3, r5, r3
  6321. 8024480: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  6322. 8024484: d103 bne.n 802448e <memchr+0x86>
  6323. 8024486: 3c04 subs r4, #4
  6324. 8024488: 2c03 cmp r4, #3
  6325. 802448a: d8f1 bhi.n 8024470 <memchr+0x68>
  6326. 802448c: e7d5 b.n 802443a <memchr+0x32>
  6327. 802448e: 4610 mov r0, r2
  6328. 8024490: e7d3 b.n 802443a <memchr+0x32>
  6329. 8024492: 4614 mov r4, r2
  6330. 8024494: e7cf b.n 8024436 <memchr+0x2e>
  6331. 8024496: 4610 mov r0, r2
  6332. 8024498: e7e2 b.n 8024460 <memchr+0x58>
  6333. 802449a: bf00 nop
  6334. 0802449c <__malloc_lock>:
  6335. 802449c: 4770 bx lr
  6336. 802449e: bf00 nop
  6337. 080244a0 <__malloc_unlock>:
  6338. 80244a0: 4770 bx lr
  6339. 80244a2: bf00 nop
  6340. 080244a4 <_Balloc>:
  6341. 80244a4: b570 push {r4, r5, r6, lr}
  6342. 80244a6: 4606 mov r6, r0
  6343. 80244a8: 6a44 ldr r4, [r0, #36] ; 0x24
  6344. 80244aa: 460d mov r5, r1
  6345. 80244ac: b15c cbz r4, 80244c6 <_Balloc+0x22>
  6346. 80244ae: 68e2 ldr r2, [r4, #12]
  6347. 80244b0: b19a cbz r2, 80244da <_Balloc+0x36>
  6348. 80244b2: f852 0025 ldr.w r0, [r2, r5, lsl #2]
  6349. 80244b6: b1e0 cbz r0, 80244f2 <_Balloc+0x4e>
  6350. 80244b8: 6801 ldr r1, [r0, #0]
  6351. 80244ba: f842 1025 str.w r1, [r2, r5, lsl #2]
  6352. 80244be: 2200 movs r2, #0
  6353. 80244c0: 6102 str r2, [r0, #16]
  6354. 80244c2: 60c2 str r2, [r0, #12]
  6355. 80244c4: bd70 pop {r4, r5, r6, pc}
  6356. 80244c6: 2010 movs r0, #16
  6357. 80244c8: f7ff fcc2 bl 8023e50 <malloc>
  6358. 80244cc: 2300 movs r3, #0
  6359. 80244ce: 4604 mov r4, r0
  6360. 80244d0: 6270 str r0, [r6, #36] ; 0x24
  6361. 80244d2: 6043 str r3, [r0, #4]
  6362. 80244d4: 6083 str r3, [r0, #8]
  6363. 80244d6: 6003 str r3, [r0, #0]
  6364. 80244d8: 60c3 str r3, [r0, #12]
  6365. 80244da: 2221 movs r2, #33 ; 0x21
  6366. 80244dc: 4630 mov r0, r6
  6367. 80244de: 2104 movs r1, #4
  6368. 80244e0: f000 fcfc bl 8024edc <_calloc_r>
  6369. 80244e4: 6a73 ldr r3, [r6, #36] ; 0x24
  6370. 80244e6: 60e0 str r0, [r4, #12]
  6371. 80244e8: 68da ldr r2, [r3, #12]
  6372. 80244ea: 2a00 cmp r2, #0
  6373. 80244ec: d1e1 bne.n 80244b2 <_Balloc+0xe>
  6374. 80244ee: 2000 movs r0, #0
  6375. 80244f0: bd70 pop {r4, r5, r6, pc}
  6376. 80244f2: 2301 movs r3, #1
  6377. 80244f4: 4630 mov r0, r6
  6378. 80244f6: 4619 mov r1, r3
  6379. 80244f8: fa03 f405 lsl.w r4, r3, r5
  6380. 80244fc: 1d62 adds r2, r4, #5
  6381. 80244fe: 0092 lsls r2, r2, #2
  6382. 8024500: f000 fcec bl 8024edc <_calloc_r>
  6383. 8024504: 2800 cmp r0, #0
  6384. 8024506: d0f2 beq.n 80244ee <_Balloc+0x4a>
  6385. 8024508: 6045 str r5, [r0, #4]
  6386. 802450a: 6084 str r4, [r0, #8]
  6387. 802450c: e7d7 b.n 80244be <_Balloc+0x1a>
  6388. 802450e: bf00 nop
  6389. 08024510 <_Bfree>:
  6390. 8024510: b530 push {r4, r5, lr}
  6391. 8024512: 4604 mov r4, r0
  6392. 8024514: 6a45 ldr r5, [r0, #36] ; 0x24
  6393. 8024516: b083 sub sp, #12
  6394. 8024518: b155 cbz r5, 8024530 <_Bfree+0x20>
  6395. 802451a: b139 cbz r1, 802452c <_Bfree+0x1c>
  6396. 802451c: 6a63 ldr r3, [r4, #36] ; 0x24
  6397. 802451e: 684a ldr r2, [r1, #4]
  6398. 8024520: 68db ldr r3, [r3, #12]
  6399. 8024522: f853 0022 ldr.w r0, [r3, r2, lsl #2]
  6400. 8024526: 6008 str r0, [r1, #0]
  6401. 8024528: f843 1022 str.w r1, [r3, r2, lsl #2]
  6402. 802452c: b003 add sp, #12
  6403. 802452e: bd30 pop {r4, r5, pc}
  6404. 8024530: 2010 movs r0, #16
  6405. 8024532: 9101 str r1, [sp, #4]
  6406. 8024534: f7ff fc8c bl 8023e50 <malloc>
  6407. 8024538: 9901 ldr r1, [sp, #4]
  6408. 802453a: 6260 str r0, [r4, #36] ; 0x24
  6409. 802453c: 6045 str r5, [r0, #4]
  6410. 802453e: 6085 str r5, [r0, #8]
  6411. 8024540: 6005 str r5, [r0, #0]
  6412. 8024542: 60c5 str r5, [r0, #12]
  6413. 8024544: e7e9 b.n 802451a <_Bfree+0xa>
  6414. 8024546: bf00 nop
  6415. 08024548 <__multadd>:
  6416. 8024548: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  6417. 802454c: 4688 mov r8, r1
  6418. 802454e: f8d1 a010 ldr.w sl, [r1, #16]
  6419. 8024552: b082 sub sp, #8
  6420. 8024554: 4681 mov r9, r0
  6421. 8024556: f101 0514 add.w r5, r1, #20
  6422. 802455a: 2400 movs r4, #0
  6423. 802455c: 682f ldr r7, [r5, #0]
  6424. 802455e: 3401 adds r4, #1
  6425. 8024560: b2be uxth r6, r7
  6426. 8024562: 0c3f lsrs r7, r7, #16
  6427. 8024564: fb02 3606 mla r6, r2, r6, r3
  6428. 8024568: fb02 f307 mul.w r3, r2, r7
  6429. 802456c: eb03 4316 add.w r3, r3, r6, lsr #16
  6430. 8024570: b2b6 uxth r6, r6
  6431. 8024572: eb06 4603 add.w r6, r6, r3, lsl #16
  6432. 8024576: 0c1b lsrs r3, r3, #16
  6433. 8024578: 45a2 cmp sl, r4
  6434. 802457a: f845 6b04 str.w r6, [r5], #4
  6435. 802457e: dced bgt.n 802455c <__multadd+0x14>
  6436. 8024580: b153 cbz r3, 8024598 <__multadd+0x50>
  6437. 8024582: f8d8 2008 ldr.w r2, [r8, #8]
  6438. 8024586: 4592 cmp sl, r2
  6439. 8024588: da0a bge.n 80245a0 <__multadd+0x58>
  6440. 802458a: eb08 028a add.w r2, r8, sl, lsl #2
  6441. 802458e: f10a 0101 add.w r1, sl, #1
  6442. 8024592: f8c8 1010 str.w r1, [r8, #16]
  6443. 8024596: 6153 str r3, [r2, #20]
  6444. 8024598: 4640 mov r0, r8
  6445. 802459a: b002 add sp, #8
  6446. 802459c: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  6447. 80245a0: f8d8 1004 ldr.w r1, [r8, #4]
  6448. 80245a4: 4648 mov r0, r9
  6449. 80245a6: 9301 str r3, [sp, #4]
  6450. 80245a8: 3101 adds r1, #1
  6451. 80245aa: f7ff ff7b bl 80244a4 <_Balloc>
  6452. 80245ae: f8d8 2010 ldr.w r2, [r8, #16]
  6453. 80245b2: f108 010c add.w r1, r8, #12
  6454. 80245b6: 3202 adds r2, #2
  6455. 80245b8: 0092 lsls r2, r2, #2
  6456. 80245ba: 4604 mov r4, r0
  6457. 80245bc: 300c adds r0, #12
  6458. 80245be: f7fd f841 bl 8021644 <memcpy>
  6459. 80245c2: 4641 mov r1, r8
  6460. 80245c4: 4648 mov r0, r9
  6461. 80245c6: 46a0 mov r8, r4
  6462. 80245c8: f7ff ffa2 bl 8024510 <_Bfree>
  6463. 80245cc: 9b01 ldr r3, [sp, #4]
  6464. 80245ce: e7dc b.n 802458a <__multadd+0x42>
  6465. 080245d0 <__s2b>:
  6466. 80245d0: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  6467. 80245d4: f648 6539 movw r5, #36409 ; 0x8e39
  6468. 80245d8: 461f mov r7, r3
  6469. 80245da: f6c3 05e3 movt r5, #14563 ; 0x38e3
  6470. 80245de: 3308 adds r3, #8
  6471. 80245e0: 4606 mov r6, r0
  6472. 80245e2: 460c mov r4, r1
  6473. 80245e4: 4690 mov r8, r2
  6474. 80245e6: fb85 1003 smull r1, r0, r5, r3
  6475. 80245ea: 17db asrs r3, r3, #31
  6476. 80245ec: ebc3 0060 rsb r0, r3, r0, asr #1
  6477. 80245f0: 2801 cmp r0, #1
  6478. 80245f2: dd37 ble.n 8024664 <__s2b+0x94>
  6479. 80245f4: 2501 movs r5, #1
  6480. 80245f6: 2100 movs r1, #0
  6481. 80245f8: 006d lsls r5, r5, #1
  6482. 80245fa: 3101 adds r1, #1
  6483. 80245fc: 42a8 cmp r0, r5
  6484. 80245fe: dcfb bgt.n 80245f8 <__s2b+0x28>
  6485. 8024600: 4630 mov r0, r6
  6486. 8024602: f7ff ff4f bl 80244a4 <_Balloc>
  6487. 8024606: 9b08 ldr r3, [sp, #32]
  6488. 8024608: 6143 str r3, [r0, #20]
  6489. 802460a: 2301 movs r3, #1
  6490. 802460c: f1b8 0f09 cmp.w r8, #9
  6491. 8024610: 4601 mov r1, r0
  6492. 8024612: 6103 str r3, [r0, #16]
  6493. 8024614: dd22 ble.n 802465c <__s2b+0x8c>
  6494. 8024616: f104 0909 add.w r9, r4, #9
  6495. 802461a: 4444 add r4, r8
  6496. 802461c: 464d mov r5, r9
  6497. 802461e: f815 3b01 ldrb.w r3, [r5], #1
  6498. 8024622: 220a movs r2, #10
  6499. 8024624: 4630 mov r0, r6
  6500. 8024626: 3b30 subs r3, #48 ; 0x30
  6501. 8024628: f7ff ff8e bl 8024548 <__multadd>
  6502. 802462c: 42a5 cmp r5, r4
  6503. 802462e: 4601 mov r1, r0
  6504. 8024630: d1f5 bne.n 802461e <__s2b+0x4e>
  6505. 8024632: eb09 0408 add.w r4, r9, r8
  6506. 8024636: 3c08 subs r4, #8
  6507. 8024638: 4547 cmp r7, r8
  6508. 802463a: dd0c ble.n 8024656 <__s2b+0x86>
  6509. 802463c: ebc8 0707 rsb r7, r8, r7
  6510. 8024640: 19e7 adds r7, r4, r7
  6511. 8024642: f814 3b01 ldrb.w r3, [r4], #1
  6512. 8024646: 220a movs r2, #10
  6513. 8024648: 4630 mov r0, r6
  6514. 802464a: 3b30 subs r3, #48 ; 0x30
  6515. 802464c: f7ff ff7c bl 8024548 <__multadd>
  6516. 8024650: 42bc cmp r4, r7
  6517. 8024652: 4601 mov r1, r0
  6518. 8024654: d1f5 bne.n 8024642 <__s2b+0x72>
  6519. 8024656: 4608 mov r0, r1
  6520. 8024658: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  6521. 802465c: 340a adds r4, #10
  6522. 802465e: f04f 0809 mov.w r8, #9
  6523. 8024662: e7e9 b.n 8024638 <__s2b+0x68>
  6524. 8024664: 2100 movs r1, #0
  6525. 8024666: e7cb b.n 8024600 <__s2b+0x30>
  6526. 08024668 <__hi0bits>:
  6527. 8024668: 4603 mov r3, r0
  6528. 802466a: 2000 movs r0, #0
  6529. 802466c: 0c1a lsrs r2, r3, #16
  6530. 802466e: d101 bne.n 8024674 <__hi0bits+0xc>
  6531. 8024670: 041b lsls r3, r3, #16
  6532. 8024672: 2010 movs r0, #16
  6533. 8024674: f013 4f7f tst.w r3, #4278190080 ; 0xff000000
  6534. 8024678: d101 bne.n 802467e <__hi0bits+0x16>
  6535. 802467a: 3008 adds r0, #8
  6536. 802467c: 021b lsls r3, r3, #8
  6537. 802467e: f013 4f70 tst.w r3, #4026531840 ; 0xf0000000
  6538. 8024682: d101 bne.n 8024688 <__hi0bits+0x20>
  6539. 8024684: 3004 adds r0, #4
  6540. 8024686: 011b lsls r3, r3, #4
  6541. 8024688: f013 4f40 tst.w r3, #3221225472 ; 0xc0000000
  6542. 802468c: d101 bne.n 8024692 <__hi0bits+0x2a>
  6543. 802468e: 3002 adds r0, #2
  6544. 8024690: 009b lsls r3, r3, #2
  6545. 8024692: 2b00 cmp r3, #0
  6546. 8024694: db02 blt.n 802469c <__hi0bits+0x34>
  6547. 8024696: 005b lsls r3, r3, #1
  6548. 8024698: d401 bmi.n 802469e <__hi0bits+0x36>
  6549. 802469a: 2020 movs r0, #32
  6550. 802469c: 4770 bx lr
  6551. 802469e: 3001 adds r0, #1
  6552. 80246a0: 4770 bx lr
  6553. 80246a2: bf00 nop
  6554. 080246a4 <__lo0bits>:
  6555. 80246a4: 6803 ldr r3, [r0, #0]
  6556. 80246a6: 4602 mov r2, r0
  6557. 80246a8: f013 0007 ands.w r0, r3, #7
  6558. 80246ac: d007 beq.n 80246be <__lo0bits+0x1a>
  6559. 80246ae: 07d9 lsls r1, r3, #31
  6560. 80246b0: d41f bmi.n 80246f2 <__lo0bits+0x4e>
  6561. 80246b2: 0798 lsls r0, r3, #30
  6562. 80246b4: d41f bmi.n 80246f6 <__lo0bits+0x52>
  6563. 80246b6: 089b lsrs r3, r3, #2
  6564. 80246b8: 2002 movs r0, #2
  6565. 80246ba: 6013 str r3, [r2, #0]
  6566. 80246bc: 4770 bx lr
  6567. 80246be: b299 uxth r1, r3
  6568. 80246c0: b909 cbnz r1, 80246c6 <__lo0bits+0x22>
  6569. 80246c2: 0c1b lsrs r3, r3, #16
  6570. 80246c4: 2010 movs r0, #16
  6571. 80246c6: f013 0fff tst.w r3, #255 ; 0xff
  6572. 80246ca: d101 bne.n 80246d0 <__lo0bits+0x2c>
  6573. 80246cc: 3008 adds r0, #8
  6574. 80246ce: 0a1b lsrs r3, r3, #8
  6575. 80246d0: 0719 lsls r1, r3, #28
  6576. 80246d2: d101 bne.n 80246d8 <__lo0bits+0x34>
  6577. 80246d4: 3004 adds r0, #4
  6578. 80246d6: 091b lsrs r3, r3, #4
  6579. 80246d8: 0799 lsls r1, r3, #30
  6580. 80246da: d101 bne.n 80246e0 <__lo0bits+0x3c>
  6581. 80246dc: 3002 adds r0, #2
  6582. 80246de: 089b lsrs r3, r3, #2
  6583. 80246e0: 07d9 lsls r1, r3, #31
  6584. 80246e2: d404 bmi.n 80246ee <__lo0bits+0x4a>
  6585. 80246e4: 085b lsrs r3, r3, #1
  6586. 80246e6: d101 bne.n 80246ec <__lo0bits+0x48>
  6587. 80246e8: 2020 movs r0, #32
  6588. 80246ea: 4770 bx lr
  6589. 80246ec: 3001 adds r0, #1
  6590. 80246ee: 6013 str r3, [r2, #0]
  6591. 80246f0: 4770 bx lr
  6592. 80246f2: 2000 movs r0, #0
  6593. 80246f4: 4770 bx lr
  6594. 80246f6: 085b lsrs r3, r3, #1
  6595. 80246f8: 2001 movs r0, #1
  6596. 80246fa: 6013 str r3, [r2, #0]
  6597. 80246fc: 4770 bx lr
  6598. 80246fe: bf00 nop
  6599. 08024700 <__i2b>:
  6600. 8024700: b510 push {r4, lr}
  6601. 8024702: 460c mov r4, r1
  6602. 8024704: 2101 movs r1, #1
  6603. 8024706: f7ff fecd bl 80244a4 <_Balloc>
  6604. 802470a: 2201 movs r2, #1
  6605. 802470c: 6144 str r4, [r0, #20]
  6606. 802470e: 6102 str r2, [r0, #16]
  6607. 8024710: bd10 pop {r4, pc}
  6608. 8024712: bf00 nop
  6609. 08024714 <__multiply>:
  6610. 8024714: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  6611. 8024718: 460c mov r4, r1
  6612. 802471a: 690e ldr r6, [r1, #16]
  6613. 802471c: b085 sub sp, #20
  6614. 802471e: 6915 ldr r5, [r2, #16]
  6615. 8024720: 4617 mov r7, r2
  6616. 8024722: 42ae cmp r6, r5
  6617. 8024724: da04 bge.n 8024730 <__multiply+0x1c>
  6618. 8024726: 4632 mov r2, r6
  6619. 8024728: 463c mov r4, r7
  6620. 802472a: 462e mov r6, r5
  6621. 802472c: 460f mov r7, r1
  6622. 802472e: 4615 mov r5, r2
  6623. 8024730: 68a3 ldr r3, [r4, #8]
  6624. 8024732: eb06 0805 add.w r8, r6, r5
  6625. 8024736: 6861 ldr r1, [r4, #4]
  6626. 8024738: 4598 cmp r8, r3
  6627. 802473a: bfc8 it gt
  6628. 802473c: 3101 addgt r1, #1
  6629. 802473e: f7ff feb1 bl 80244a4 <_Balloc>
  6630. 8024742: eb00 0988 add.w r9, r0, r8, lsl #2
  6631. 8024746: f100 0314 add.w r3, r0, #20
  6632. 802474a: f109 0914 add.w r9, r9, #20
  6633. 802474e: 9001 str r0, [sp, #4]
  6634. 8024750: 2000 movs r0, #0
  6635. 8024752: 454b cmp r3, r9
  6636. 8024754: d203 bcs.n 802475e <__multiply+0x4a>
  6637. 8024756: f843 0b04 str.w r0, [r3], #4
  6638. 802475a: 4599 cmp r9, r3
  6639. 802475c: d8fb bhi.n 8024756 <__multiply+0x42>
  6640. 802475e: eb07 0585 add.w r5, r7, r5, lsl #2
  6641. 8024762: eb04 0686 add.w r6, r4, r6, lsl #2
  6642. 8024766: 3714 adds r7, #20
  6643. 8024768: 3514 adds r5, #20
  6644. 802476a: 3414 adds r4, #20
  6645. 802476c: 3614 adds r6, #20
  6646. 802476e: 42af cmp r7, r5
  6647. 8024770: d257 bcs.n 8024822 <__multiply+0x10e>
  6648. 8024772: 9a01 ldr r2, [sp, #4]
  6649. 8024774: f8cd 9008 str.w r9, [sp, #8]
  6650. 8024778: 46a9 mov r9, r5
  6651. 802477a: f8cd 800c str.w r8, [sp, #12]
  6652. 802477e: f102 0c18 add.w ip, r2, #24
  6653. 8024782: 46a0 mov r8, r4
  6654. 8024784: f857 4b04 ldr.w r4, [r7], #4
  6655. 8024788: b2a0 uxth r0, r4
  6656. 802478a: b1f0 cbz r0, 80247ca <__multiply+0xb6>
  6657. 802478c: 4642 mov r2, r8
  6658. 802478e: f1ac 0304 sub.w r3, ip, #4
  6659. 8024792: 2400 movs r4, #0
  6660. 8024794: f852 1b04 ldr.w r1, [r2], #4
  6661. 8024798: 681d ldr r5, [r3, #0]
  6662. 802479a: fa1f fa81 uxth.w sl, r1
  6663. 802479e: 0c09 lsrs r1, r1, #16
  6664. 80247a0: fa1f fb85 uxth.w fp, r5
  6665. 80247a4: 0c2d lsrs r5, r5, #16
  6666. 80247a6: fb00 ba0a mla sl, r0, sl, fp
  6667. 80247aa: fb00 5101 mla r1, r0, r1, r5
  6668. 80247ae: 4454 add r4, sl
  6669. 80247b0: eb01 4114 add.w r1, r1, r4, lsr #16
  6670. 80247b4: b2a4 uxth r4, r4
  6671. 80247b6: ea44 4501 orr.w r5, r4, r1, lsl #16
  6672. 80247ba: 0c0c lsrs r4, r1, #16
  6673. 80247bc: 4296 cmp r6, r2
  6674. 80247be: f843 5b04 str.w r5, [r3], #4
  6675. 80247c2: d8e7 bhi.n 8024794 <__multiply+0x80>
  6676. 80247c4: 601c str r4, [r3, #0]
  6677. 80247c6: f857 4c04 ldr.w r4, [r7, #-4]
  6678. 80247ca: 0c24 lsrs r4, r4, #16
  6679. 80247cc: d021 beq.n 8024812 <__multiply+0xfe>
  6680. 80247ce: f85c 1c04 ldr.w r1, [ip, #-4]
  6681. 80247d2: 4642 mov r2, r8
  6682. 80247d4: 4663 mov r3, ip
  6683. 80247d6: 2500 movs r5, #0
  6684. 80247d8: 4608 mov r0, r1
  6685. 80247da: f8b2 a000 ldrh.w sl, [r2]
  6686. 80247de: 0c00 lsrs r0, r0, #16
  6687. 80247e0: b289 uxth r1, r1
  6688. 80247e2: 469b mov fp, r3
  6689. 80247e4: fb04 000a mla r0, r4, sl, r0
  6690. 80247e8: 1945 adds r5, r0, r5
  6691. 80247ea: ea41 4105 orr.w r1, r1, r5, lsl #16
  6692. 80247ee: f843 1c04 str.w r1, [r3, #-4]
  6693. 80247f2: f853 0b04 ldr.w r0, [r3], #4
  6694. 80247f6: f852 1b04 ldr.w r1, [r2], #4
  6695. 80247fa: fa1f fa80 uxth.w sl, r0
  6696. 80247fe: 0c09 lsrs r1, r1, #16
  6697. 8024800: fb04 a101 mla r1, r4, r1, sl
  6698. 8024804: eb01 4115 add.w r1, r1, r5, lsr #16
  6699. 8024808: 0c0d lsrs r5, r1, #16
  6700. 802480a: 4296 cmp r6, r2
  6701. 802480c: d8e5 bhi.n 80247da <__multiply+0xc6>
  6702. 802480e: f8cb 1000 str.w r1, [fp]
  6703. 8024812: 45b9 cmp r9, r7
  6704. 8024814: f10c 0c04 add.w ip, ip, #4
  6705. 8024818: d8b4 bhi.n 8024784 <__multiply+0x70>
  6706. 802481a: f8dd 9008 ldr.w r9, [sp, #8]
  6707. 802481e: f8dd 800c ldr.w r8, [sp, #12]
  6708. 8024822: f1b8 0f00 cmp.w r8, #0
  6709. 8024826: dd0b ble.n 8024840 <__multiply+0x12c>
  6710. 8024828: f859 3c04 ldr.w r3, [r9, #-4]
  6711. 802482c: f1a9 0904 sub.w r9, r9, #4
  6712. 8024830: b11b cbz r3, 802483a <__multiply+0x126>
  6713. 8024832: e005 b.n 8024840 <__multiply+0x12c>
  6714. 8024834: f859 3d04 ldr.w r3, [r9, #-4]!
  6715. 8024838: b913 cbnz r3, 8024840 <__multiply+0x12c>
  6716. 802483a: f1b8 0801 subs.w r8, r8, #1
  6717. 802483e: d1f9 bne.n 8024834 <__multiply+0x120>
  6718. 8024840: 9b01 ldr r3, [sp, #4]
  6719. 8024842: 4618 mov r0, r3
  6720. 8024844: f8c3 8010 str.w r8, [r3, #16]
  6721. 8024848: b005 add sp, #20
  6722. 802484a: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  6723. 802484e: bf00 nop
  6724. 08024850 <__pow5mult>:
  6725. 8024850: f012 0303 ands.w r3, r2, #3
  6726. 8024854: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  6727. 8024858: 4614 mov r4, r2
  6728. 802485a: 4680 mov r8, r0
  6729. 802485c: 460f mov r7, r1
  6730. 802485e: d128 bne.n 80248b2 <__pow5mult+0x62>
  6731. 8024860: 10a4 asrs r4, r4, #2
  6732. 8024862: d01a beq.n 802489a <__pow5mult+0x4a>
  6733. 8024864: f8d8 5024 ldr.w r5, [r8, #36] ; 0x24
  6734. 8024868: 2d00 cmp r5, #0
  6735. 802486a: d02e beq.n 80248ca <__pow5mult+0x7a>
  6736. 802486c: 68ae ldr r6, [r5, #8]
  6737. 802486e: b92e cbnz r6, 802487c <__pow5mult+0x2c>
  6738. 8024870: e036 b.n 80248e0 <__pow5mult+0x90>
  6739. 8024872: 1064 asrs r4, r4, #1
  6740. 8024874: d011 beq.n 802489a <__pow5mult+0x4a>
  6741. 8024876: 6835 ldr r5, [r6, #0]
  6742. 8024878: b195 cbz r5, 80248a0 <__pow5mult+0x50>
  6743. 802487a: 462e mov r6, r5
  6744. 802487c: 07e0 lsls r0, r4, #31
  6745. 802487e: d5f8 bpl.n 8024872 <__pow5mult+0x22>
  6746. 8024880: 4639 mov r1, r7
  6747. 8024882: 4632 mov r2, r6
  6748. 8024884: 4640 mov r0, r8
  6749. 8024886: f7ff ff45 bl 8024714 <__multiply>
  6750. 802488a: 4639 mov r1, r7
  6751. 802488c: 4605 mov r5, r0
  6752. 802488e: 4640 mov r0, r8
  6753. 8024890: f7ff fe3e bl 8024510 <_Bfree>
  6754. 8024894: 1064 asrs r4, r4, #1
  6755. 8024896: 462f mov r7, r5
  6756. 8024898: d1ed bne.n 8024876 <__pow5mult+0x26>
  6757. 802489a: 4638 mov r0, r7
  6758. 802489c: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  6759. 80248a0: 4631 mov r1, r6
  6760. 80248a2: 4632 mov r2, r6
  6761. 80248a4: 4640 mov r0, r8
  6762. 80248a6: f7ff ff35 bl 8024714 <__multiply>
  6763. 80248aa: 6030 str r0, [r6, #0]
  6764. 80248ac: 4606 mov r6, r0
  6765. 80248ae: 6005 str r5, [r0, #0]
  6766. 80248b0: e7e4 b.n 802487c <__pow5mult+0x2c>
  6767. 80248b2: f643 4200 movw r2, #15360 ; 0x3c00
  6768. 80248b6: 1e5d subs r5, r3, #1
  6769. 80248b8: f6c0 0203 movt r2, #2051 ; 0x803
  6770. 80248bc: 2300 movs r3, #0
  6771. 80248be: f852 2025 ldr.w r2, [r2, r5, lsl #2]
  6772. 80248c2: f7ff fe41 bl 8024548 <__multadd>
  6773. 80248c6: 4607 mov r7, r0
  6774. 80248c8: e7ca b.n 8024860 <__pow5mult+0x10>
  6775. 80248ca: 2010 movs r0, #16
  6776. 80248cc: f7ff fac0 bl 8023e50 <malloc>
  6777. 80248d0: 2300 movs r3, #0
  6778. 80248d2: 4605 mov r5, r0
  6779. 80248d4: f8c8 0024 str.w r0, [r8, #36] ; 0x24
  6780. 80248d8: 6043 str r3, [r0, #4]
  6781. 80248da: 6083 str r3, [r0, #8]
  6782. 80248dc: 6003 str r3, [r0, #0]
  6783. 80248de: 60c3 str r3, [r0, #12]
  6784. 80248e0: 4640 mov r0, r8
  6785. 80248e2: f240 2171 movw r1, #625 ; 0x271
  6786. 80248e6: f7ff ff0b bl 8024700 <__i2b>
  6787. 80248ea: 2300 movs r3, #0
  6788. 80248ec: 60a8 str r0, [r5, #8]
  6789. 80248ee: 4606 mov r6, r0
  6790. 80248f0: 6003 str r3, [r0, #0]
  6791. 80248f2: e7c3 b.n 802487c <__pow5mult+0x2c>
  6792. 080248f4 <__lshift>:
  6793. 80248f4: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  6794. 80248f8: 4693 mov fp, r2
  6795. 80248fa: 690a ldr r2, [r1, #16]
  6796. 80248fc: 460f mov r7, r1
  6797. 80248fe: ea4f 156b mov.w r5, fp, asr #5
  6798. 8024902: 688b ldr r3, [r1, #8]
  6799. 8024904: eb05 0a02 add.w sl, r5, r2
  6800. 8024908: 4681 mov r9, r0
  6801. 802490a: f10a 0601 add.w r6, sl, #1
  6802. 802490e: 6849 ldr r1, [r1, #4]
  6803. 8024910: 429e cmp r6, r3
  6804. 8024912: dd03 ble.n 802491c <__lshift+0x28>
  6805. 8024914: 005b lsls r3, r3, #1
  6806. 8024916: 3101 adds r1, #1
  6807. 8024918: 429e cmp r6, r3
  6808. 802491a: dcfb bgt.n 8024914 <__lshift+0x20>
  6809. 802491c: 4648 mov r0, r9
  6810. 802491e: f7ff fdc1 bl 80244a4 <_Balloc>
  6811. 8024922: 2d00 cmp r5, #0
  6812. 8024924: 4680 mov r8, r0
  6813. 8024926: f100 0414 add.w r4, r0, #20
  6814. 802492a: dd0a ble.n 8024942 <__lshift+0x4e>
  6815. 802492c: 2300 movs r3, #0
  6816. 802492e: 461a mov r2, r3
  6817. 8024930: 3301 adds r3, #1
  6818. 8024932: f844 2b04 str.w r2, [r4], #4
  6819. 8024936: 42ab cmp r3, r5
  6820. 8024938: d1fa bne.n 8024930 <__lshift+0x3c>
  6821. 802493a: eb08 0383 add.w r3, r8, r3, lsl #2
  6822. 802493e: f103 0414 add.w r4, r3, #20
  6823. 8024942: 6938 ldr r0, [r7, #16]
  6824. 8024944: f107 0514 add.w r5, r7, #20
  6825. 8024948: eb07 0080 add.w r0, r7, r0, lsl #2
  6826. 802494c: 3014 adds r0, #20
  6827. 802494e: f01b 0b1f ands.w fp, fp, #31
  6828. 8024952: d01c beq.n 802498e <__lshift+0x9a>
  6829. 8024954: f1cb 0320 rsb r3, fp, #32
  6830. 8024958: 2200 movs r2, #0
  6831. 802495a: 6829 ldr r1, [r5, #0]
  6832. 802495c: fa01 f10b lsl.w r1, r1, fp
  6833. 8024960: 430a orrs r2, r1
  6834. 8024962: f844 2b04 str.w r2, [r4], #4
  6835. 8024966: f855 2b04 ldr.w r2, [r5], #4
  6836. 802496a: 42a8 cmp r0, r5
  6837. 802496c: fa22 f203 lsr.w r2, r2, r3
  6838. 8024970: d8f3 bhi.n 802495a <__lshift+0x66>
  6839. 8024972: 6022 str r2, [r4, #0]
  6840. 8024974: b10a cbz r2, 802497a <__lshift+0x86>
  6841. 8024976: f10a 0602 add.w r6, sl, #2
  6842. 802497a: 4648 mov r0, r9
  6843. 802497c: 3e01 subs r6, #1
  6844. 802497e: 4639 mov r1, r7
  6845. 8024980: f8c8 6010 str.w r6, [r8, #16]
  6846. 8024984: f7ff fdc4 bl 8024510 <_Bfree>
  6847. 8024988: 4640 mov r0, r8
  6848. 802498a: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  6849. 802498e: f855 3b04 ldr.w r3, [r5], #4
  6850. 8024992: 42a8 cmp r0, r5
  6851. 8024994: f844 3b04 str.w r3, [r4], #4
  6852. 8024998: d9ef bls.n 802497a <__lshift+0x86>
  6853. 802499a: f855 3b04 ldr.w r3, [r5], #4
  6854. 802499e: 42a8 cmp r0, r5
  6855. 80249a0: f844 3b04 str.w r3, [r4], #4
  6856. 80249a4: d8f3 bhi.n 802498e <__lshift+0x9a>
  6857. 80249a6: e7e8 b.n 802497a <__lshift+0x86>
  6858. 080249a8 <__mcmp>:
  6859. 80249a8: 4603 mov r3, r0
  6860. 80249aa: 690a ldr r2, [r1, #16]
  6861. 80249ac: 6900 ldr r0, [r0, #16]
  6862. 80249ae: b430 push {r4, r5}
  6863. 80249b0: 1a80 subs r0, r0, r2
  6864. 80249b2: d10f bne.n 80249d4 <__mcmp+0x2c>
  6865. 80249b4: 3204 adds r2, #4
  6866. 80249b6: f103 0514 add.w r5, r3, #20
  6867. 80249ba: 0092 lsls r2, r2, #2
  6868. 80249bc: 189b adds r3, r3, r2
  6869. 80249be: 1889 adds r1, r1, r2
  6870. 80249c0: 3304 adds r3, #4
  6871. 80249c2: 3104 adds r1, #4
  6872. 80249c4: f853 2d04 ldr.w r2, [r3, #-4]!
  6873. 80249c8: f851 4d04 ldr.w r4, [r1, #-4]!
  6874. 80249cc: 42a2 cmp r2, r4
  6875. 80249ce: d103 bne.n 80249d8 <__mcmp+0x30>
  6876. 80249d0: 429d cmp r5, r3
  6877. 80249d2: d3f7 bcc.n 80249c4 <__mcmp+0x1c>
  6878. 80249d4: bc30 pop {r4, r5}
  6879. 80249d6: 4770 bx lr
  6880. 80249d8: 4294 cmp r4, r2
  6881. 80249da: bf94 ite ls
  6882. 80249dc: 2001 movls r0, #1
  6883. 80249de: f04f 30ff movhi.w r0, #4294967295
  6884. 80249e2: e7f7 b.n 80249d4 <__mcmp+0x2c>
  6885. 080249e4 <__mdiff>:
  6886. 80249e4: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  6887. 80249e8: 468b mov fp, r1
  6888. 80249ea: 4604 mov r4, r0
  6889. 80249ec: 4611 mov r1, r2
  6890. 80249ee: 4658 mov r0, fp
  6891. 80249f0: 4691 mov r9, r2
  6892. 80249f2: f7ff ffd9 bl 80249a8 <__mcmp>
  6893. 80249f6: 1e05 subs r5, r0, #0
  6894. 80249f8: d061 beq.n 8024abe <__mdiff+0xda>
  6895. 80249fa: bfbc itt lt
  6896. 80249fc: 465b movlt r3, fp
  6897. 80249fe: 46cb movlt fp, r9
  6898. 8024a00: 4620 mov r0, r4
  6899. 8024a02: bfb8 it lt
  6900. 8024a04: 4699 movlt r9, r3
  6901. 8024a06: f8db 1004 ldr.w r1, [fp, #4]
  6902. 8024a0a: bfac ite ge
  6903. 8024a0c: f04f 0800 movge.w r8, #0
  6904. 8024a10: f04f 0801 movlt.w r8, #1
  6905. 8024a14: f7ff fd46 bl 80244a4 <_Balloc>
  6906. 8024a18: f8db 7010 ldr.w r7, [fp, #16]
  6907. 8024a1c: f109 0514 add.w r5, r9, #20
  6908. 8024a20: f8d9 3010 ldr.w r3, [r9, #16]
  6909. 8024a24: f10b 0614 add.w r6, fp, #20
  6910. 8024a28: 2400 movs r4, #0
  6911. 8024a2a: eb0b 0c87 add.w ip, fp, r7, lsl #2
  6912. 8024a2e: eb09 0983 add.w r9, r9, r3, lsl #2
  6913. 8024a32: f10c 0c14 add.w ip, ip, #20
  6914. 8024a36: f109 0914 add.w r9, r9, #20
  6915. 8024a3a: f100 0a14 add.w sl, r0, #20
  6916. 8024a3e: f8c0 800c str.w r8, [r0, #12]
  6917. 8024a42: f856 8b04 ldr.w r8, [r6], #4
  6918. 8024a46: 4653 mov r3, sl
  6919. 8024a48: f855 ab04 ldr.w sl, [r5], #4
  6920. 8024a4c: 4632 mov r2, r6
  6921. 8024a4e: fa1f f188 uxth.w r1, r8
  6922. 8024a52: 1909 adds r1, r1, r4
  6923. 8024a54: fa1f fb8a uxth.w fp, sl
  6924. 8024a58: ebcb 0101 rsb r1, fp, r1
  6925. 8024a5c: ea4f 441a mov.w r4, sl, lsr #16
  6926. 8024a60: ebc4 4418 rsb r4, r4, r8, lsr #16
  6927. 8024a64: eb04 4421 add.w r4, r4, r1, asr #16
  6928. 8024a68: b289 uxth r1, r1
  6929. 8024a6a: ea41 4104 orr.w r1, r1, r4, lsl #16
  6930. 8024a6e: 1424 asrs r4, r4, #16
  6931. 8024a70: 45a9 cmp r9, r5
  6932. 8024a72: f843 1b04 str.w r1, [r3], #4
  6933. 8024a76: 469a mov sl, r3
  6934. 8024a78: d8e3 bhi.n 8024a42 <__mdiff+0x5e>
  6935. 8024a7a: 45b4 cmp ip, r6
  6936. 8024a7c: 4698 mov r8, r3
  6937. 8024a7e: d914 bls.n 8024aaa <__mdiff+0xc6>
  6938. 8024a80: f852 5b04 ldr.w r5, [r2], #4
  6939. 8024a84: b2a9 uxth r1, r5
  6940. 8024a86: 0c2d lsrs r5, r5, #16
  6941. 8024a88: 190c adds r4, r1, r4
  6942. 8024a8a: eb05 4524 add.w r5, r5, r4, asr #16
  6943. 8024a8e: b2a4 uxth r4, r4
  6944. 8024a90: ea44 4105 orr.w r1, r4, r5, lsl #16
  6945. 8024a94: 142c asrs r4, r5, #16
  6946. 8024a96: 4594 cmp ip, r2
  6947. 8024a98: f843 1b04 str.w r1, [r3], #4
  6948. 8024a9c: d8f0 bhi.n 8024a80 <__mdiff+0x9c>
  6949. 8024a9e: 43f3 mvns r3, r6
  6950. 8024aa0: 4463 add r3, ip
  6951. 8024aa2: f023 0303 bic.w r3, r3, #3
  6952. 8024aa6: 3304 adds r3, #4
  6953. 8024aa8: 4443 add r3, r8
  6954. 8024aaa: 3b04 subs r3, #4
  6955. 8024aac: b921 cbnz r1, 8024ab8 <__mdiff+0xd4>
  6956. 8024aae: f853 2d04 ldr.w r2, [r3, #-4]!
  6957. 8024ab2: 3f01 subs r7, #1
  6958. 8024ab4: 2a00 cmp r2, #0
  6959. 8024ab6: d0fa beq.n 8024aae <__mdiff+0xca>
  6960. 8024ab8: 6107 str r7, [r0, #16]
  6961. 8024aba: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  6962. 8024abe: 4620 mov r0, r4
  6963. 8024ac0: 4629 mov r1, r5
  6964. 8024ac2: f7ff fcef bl 80244a4 <_Balloc>
  6965. 8024ac6: 2301 movs r3, #1
  6966. 8024ac8: 6145 str r5, [r0, #20]
  6967. 8024aca: 6103 str r3, [r0, #16]
  6968. 8024acc: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  6969. 08024ad0 <__ulp>:
  6970. 8024ad0: 2300 movs r3, #0
  6971. 8024ad2: f6c7 73f0 movt r3, #32752 ; 0x7ff0
  6972. 8024ad6: 400b ands r3, r1
  6973. 8024ad8: f1a3 7350 sub.w r3, r3, #54525952 ; 0x3400000
  6974. 8024adc: 2b00 cmp r3, #0
  6975. 8024ade: dd02 ble.n 8024ae6 <__ulp+0x16>
  6976. 8024ae0: 4619 mov r1, r3
  6977. 8024ae2: 2000 movs r0, #0
  6978. 8024ae4: 4770 bx lr
  6979. 8024ae6: 425b negs r3, r3
  6980. 8024ae8: 2100 movs r1, #0
  6981. 8024aea: 151b asrs r3, r3, #20
  6982. 8024aec: 2b13 cmp r3, #19
  6983. 8024aee: dd0b ble.n 8024b08 <__ulp+0x38>
  6984. 8024af0: 2b32 cmp r3, #50 ; 0x32
  6985. 8024af2: dd02 ble.n 8024afa <__ulp+0x2a>
  6986. 8024af4: 2301 movs r3, #1
  6987. 8024af6: 4618 mov r0, r3
  6988. 8024af8: 4770 bx lr
  6989. 8024afa: 2201 movs r2, #1
  6990. 8024afc: f1c3 0333 rsb r3, r3, #51 ; 0x33
  6991. 8024b00: fa02 f303 lsl.w r3, r2, r3
  6992. 8024b04: 4618 mov r0, r3
  6993. 8024b06: 4770 bx lr
  6994. 8024b08: f44f 2200 mov.w r2, #524288 ; 0x80000
  6995. 8024b0c: 2000 movs r0, #0
  6996. 8024b0e: fa42 f103 asr.w r1, r2, r3
  6997. 8024b12: 4770 bx lr
  6998. 08024b14 <__b2d>:
  6999. 8024b14: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  7000. 8024b18: f100 0814 add.w r8, r0, #20
  7001. 8024b1c: 6906 ldr r6, [r0, #16]
  7002. 8024b1e: 4689 mov r9, r1
  7003. 8024b20: 3604 adds r6, #4
  7004. 8024b22: eb00 0686 add.w r6, r0, r6, lsl #2
  7005. 8024b26: 4634 mov r4, r6
  7006. 8024b28: 4637 mov r7, r6
  7007. 8024b2a: f854 5b04 ldr.w r5, [r4], #4
  7008. 8024b2e: 4628 mov r0, r5
  7009. 8024b30: f7ff fd9a bl 8024668 <__hi0bits>
  7010. 8024b34: 280a cmp r0, #10
  7011. 8024b36: f1c0 0320 rsb r3, r0, #32
  7012. 8024b3a: f8c9 3000 str.w r3, [r9]
  7013. 8024b3e: dc18 bgt.n 8024b72 <__b2d+0x5e>
  7014. 8024b40: 45b0 cmp r8, r6
  7015. 8024b42: f1c0 010b rsb r1, r0, #11
  7016. 8024b46: fa25 f701 lsr.w r7, r5, r1
  7017. 8024b4a: bf38 it cc
  7018. 8024b4c: f854 4c08 ldrcc.w r4, [r4, #-8]
  7019. 8024b50: f047 577f orr.w r7, r7, #1069547520 ; 0x3fc00000
  7020. 8024b54: f447 1340 orr.w r3, r7, #3145728 ; 0x300000
  7021. 8024b58: bf34 ite cc
  7022. 8024b5a: fa24 f101 lsrcc.w r1, r4, r1
  7023. 8024b5e: 2100 movcs r1, #0
  7024. 8024b60: 3015 adds r0, #21
  7025. 8024b62: fa05 f500 lsl.w r5, r5, r0
  7026. 8024b66: ea41 0205 orr.w r2, r1, r5
  7027. 8024b6a: 4610 mov r0, r2
  7028. 8024b6c: 4619 mov r1, r3
  7029. 8024b6e: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  7030. 8024b72: 2100 movs r1, #0
  7031. 8024b74: 45b0 cmp r8, r6
  7032. 8024b76: d202 bcs.n 8024b7e <__b2d+0x6a>
  7033. 8024b78: f854 1c08 ldr.w r1, [r4, #-8]
  7034. 8024b7c: 1f37 subs r7, r6, #4
  7035. 8024b7e: f1b0 040b subs.w r4, r0, #11
  7036. 8024b82: d018 beq.n 8024bb6 <__b2d+0xa2>
  7037. 8024b84: fa05 f504 lsl.w r5, r5, r4
  7038. 8024b88: f1c0 002b rsb r0, r0, #43 ; 0x2b
  7039. 8024b8c: 4547 cmp r7, r8
  7040. 8024b8e: f045 557f orr.w r5, r5, #1069547520 ; 0x3fc00000
  7041. 8024b92: fa21 f600 lsr.w r6, r1, r0
  7042. 8024b96: f445 1540 orr.w r5, r5, #3145728 ; 0x300000
  7043. 8024b9a: ea45 0306 orr.w r3, r5, r6
  7044. 8024b9e: bf88 it hi
  7045. 8024ba0: f857 5c04 ldrhi.w r5, [r7, #-4]
  7046. 8024ba4: fa01 f104 lsl.w r1, r1, r4
  7047. 8024ba8: bf8c ite hi
  7048. 8024baa: fa25 f000 lsrhi.w r0, r5, r0
  7049. 8024bae: 2000 movls r0, #0
  7050. 8024bb0: ea40 0201 orr.w r2, r0, r1
  7051. 8024bb4: e7d9 b.n 8024b6a <__b2d+0x56>
  7052. 8024bb6: f045 557f orr.w r5, r5, #1069547520 ; 0x3fc00000
  7053. 8024bba: 460a mov r2, r1
  7054. 8024bbc: f445 1340 orr.w r3, r5, #3145728 ; 0x300000
  7055. 8024bc0: e7d3 b.n 8024b6a <__b2d+0x56>
  7056. 8024bc2: bf00 nop
  7057. 08024bc4 <__d2b>:
  7058. 8024bc4: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  7059. 8024bc8: b083 sub sp, #12
  7060. 8024bca: 2101 movs r1, #1
  7061. 8024bcc: 461d mov r5, r3
  7062. 8024bce: 4614 mov r4, r2
  7063. 8024bd0: 9f0a ldr r7, [sp, #40] ; 0x28
  7064. 8024bd2: f7ff fc67 bl 80244a4 <_Balloc>
  7065. 8024bd6: f3c5 560a ubfx r6, r5, #20, #11
  7066. 8024bda: f025 437f bic.w r3, r5, #4278190080 ; 0xff000000
  7067. 8024bde: 46a9 mov r9, r5
  7068. 8024be0: f423 0370 bic.w r3, r3, #15728640 ; 0xf00000
  7069. 8024be4: 4680 mov r8, r0
  7070. 8024be6: b10e cbz r6, 8024bec <__d2b+0x28>
  7071. 8024be8: f443 1380 orr.w r3, r3, #1048576 ; 0x100000
  7072. 8024bec: 9301 str r3, [sp, #4]
  7073. 8024bee: 2c00 cmp r4, #0
  7074. 8024bf0: d024 beq.n 8024c3c <__d2b+0x78>
  7075. 8024bf2: a802 add r0, sp, #8
  7076. 8024bf4: f840 4d08 str.w r4, [r0, #-8]!
  7077. 8024bf8: 4668 mov r0, sp
  7078. 8024bfa: f7ff fd53 bl 80246a4 <__lo0bits>
  7079. 8024bfe: 9b01 ldr r3, [sp, #4]
  7080. 8024c00: 2800 cmp r0, #0
  7081. 8024c02: d131 bne.n 8024c68 <__d2b+0xa4>
  7082. 8024c04: 9a00 ldr r2, [sp, #0]
  7083. 8024c06: f8c8 2014 str.w r2, [r8, #20]
  7084. 8024c0a: 2b00 cmp r3, #0
  7085. 8024c0c: bf0c ite eq
  7086. 8024c0e: 2401 moveq r4, #1
  7087. 8024c10: 2402 movne r4, #2
  7088. 8024c12: f8c8 3018 str.w r3, [r8, #24]
  7089. 8024c16: f8c8 4010 str.w r4, [r8, #16]
  7090. 8024c1a: b9e6 cbnz r6, 8024c56 <__d2b+0x92>
  7091. 8024c1c: eb08 0384 add.w r3, r8, r4, lsl #2
  7092. 8024c20: f2a0 4032 subw r0, r0, #1074 ; 0x432
  7093. 8024c24: 6038 str r0, [r7, #0]
  7094. 8024c26: 6918 ldr r0, [r3, #16]
  7095. 8024c28: f7ff fd1e bl 8024668 <__hi0bits>
  7096. 8024c2c: 9b0b ldr r3, [sp, #44] ; 0x2c
  7097. 8024c2e: ebc0 1044 rsb r0, r0, r4, lsl #5
  7098. 8024c32: 6018 str r0, [r3, #0]
  7099. 8024c34: 4640 mov r0, r8
  7100. 8024c36: b003 add sp, #12
  7101. 8024c38: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  7102. 8024c3c: a801 add r0, sp, #4
  7103. 8024c3e: f7ff fd31 bl 80246a4 <__lo0bits>
  7104. 8024c42: 2301 movs r3, #1
  7105. 8024c44: 461c mov r4, r3
  7106. 8024c46: f8c8 3010 str.w r3, [r8, #16]
  7107. 8024c4a: 9b01 ldr r3, [sp, #4]
  7108. 8024c4c: f8c8 3014 str.w r3, [r8, #20]
  7109. 8024c50: 3020 adds r0, #32
  7110. 8024c52: 2e00 cmp r6, #0
  7111. 8024c54: d0e2 beq.n 8024c1c <__d2b+0x58>
  7112. 8024c56: 9a0b ldr r2, [sp, #44] ; 0x2c
  7113. 8024c58: f2a6 4933 subw r9, r6, #1075 ; 0x433
  7114. 8024c5c: f1c0 0335 rsb r3, r0, #53 ; 0x35
  7115. 8024c60: 4448 add r0, r9
  7116. 8024c62: 6038 str r0, [r7, #0]
  7117. 8024c64: 6013 str r3, [r2, #0]
  7118. 8024c66: e7e5 b.n 8024c34 <__d2b+0x70>
  7119. 8024c68: f1c0 0120 rsb r1, r0, #32
  7120. 8024c6c: 9a00 ldr r2, [sp, #0]
  7121. 8024c6e: fa03 f101 lsl.w r1, r3, r1
  7122. 8024c72: fa23 f300 lsr.w r3, r3, r0
  7123. 8024c76: 430a orrs r2, r1
  7124. 8024c78: 9301 str r3, [sp, #4]
  7125. 8024c7a: f8c8 2014 str.w r2, [r8, #20]
  7126. 8024c7e: e7c4 b.n 8024c0a <__d2b+0x46>
  7127. 08024c80 <__ratio>:
  7128. 8024c80: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  7129. 8024c84: b083 sub sp, #12
  7130. 8024c86: 4688 mov r8, r1
  7131. 8024c88: 4669 mov r1, sp
  7132. 8024c8a: 4606 mov r6, r0
  7133. 8024c8c: f7ff ff42 bl 8024b14 <__b2d>
  7134. 8024c90: 460d mov r5, r1
  7135. 8024c92: 4604 mov r4, r0
  7136. 8024c94: a901 add r1, sp, #4
  7137. 8024c96: 4640 mov r0, r8
  7138. 8024c98: f7ff ff3c bl 8024b14 <__b2d>
  7139. 8024c9c: 462f mov r7, r5
  7140. 8024c9e: 460b mov r3, r1
  7141. 8024ca0: 4602 mov r2, r0
  7142. 8024ca2: f8d8 1010 ldr.w r1, [r8, #16]
  7143. 8024ca6: 4699 mov r9, r3
  7144. 8024ca8: 6930 ldr r0, [r6, #16]
  7145. 8024caa: 4626 mov r6, r4
  7146. 8024cac: 4690 mov r8, r2
  7147. 8024cae: ebc1 0e00 rsb lr, r1, r0
  7148. 8024cb2: e89d 0003 ldmia.w sp, {r0, r1}
  7149. 8024cb6: 1a40 subs r0, r0, r1
  7150. 8024cb8: eb00 114e add.w r1, r0, lr, lsl #5
  7151. 8024cbc: 2900 cmp r1, #0
  7152. 8024cbe: bfc9 itett gt
  7153. 8024cc0: eb05 5701 addgt.w r7, r5, r1, lsl #20
  7154. 8024cc4: eba3 5901 suble.w r9, r3, r1, lsl #20
  7155. 8024cc8: 4624 movgt r4, r4
  7156. 8024cca: 463d movgt r5, r7
  7157. 8024ccc: bfdc itt le
  7158. 8024cce: 4612 movle r2, r2
  7159. 8024cd0: 464b movle r3, r9
  7160. 8024cd2: 4620 mov r0, r4
  7161. 8024cd4: 4629 mov r1, r5
  7162. 8024cd6: f7fb fd9d bl 8020814 <__aeabi_ddiv>
  7163. 8024cda: b003 add sp, #12
  7164. 8024cdc: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  7165. 08024ce0 <_mprec_log10>:
  7166. 8024ce0: 2817 cmp r0, #23
  7167. 8024ce2: b510 push {r4, lr}
  7168. 8024ce4: 4604 mov r4, r0
  7169. 8024ce6: dd0c ble.n 8024d02 <_mprec_log10+0x22>
  7170. 8024ce8: 2100 movs r1, #0
  7171. 8024cea: 2000 movs r0, #0
  7172. 8024cec: f6c3 71f0 movt r1, #16368 ; 0x3ff0
  7173. 8024cf0: 2300 movs r3, #0
  7174. 8024cf2: 2200 movs r2, #0
  7175. 8024cf4: f2c4 0324 movt r3, #16420 ; 0x4024
  7176. 8024cf8: f7fb fc62 bl 80205c0 <__aeabi_dmul>
  7177. 8024cfc: 3c01 subs r4, #1
  7178. 8024cfe: d1f7 bne.n 8024cf0 <_mprec_log10+0x10>
  7179. 8024d00: bd10 pop {r4, pc}
  7180. 8024d02: f643 4300 movw r3, #15360 ; 0x3c00
  7181. 8024d06: f6c0 0303 movt r3, #2051 ; 0x803
  7182. 8024d0a: eb03 03c0 add.w r3, r3, r0, lsl #3
  7183. 8024d0e: e9d3 0104 ldrd r0, r1, [r3, #16]
  7184. 8024d12: bd10 pop {r4, pc}
  7185. 08024d14 <__copybits>:
  7186. 8024d14: b470 push {r4, r5, r6}
  7187. 8024d16: 3901 subs r1, #1
  7188. 8024d18: 6915 ldr r5, [r2, #16]
  7189. 8024d1a: f102 0314 add.w r3, r2, #20
  7190. 8024d1e: 114e asrs r6, r1, #5
  7191. 8024d20: 3601 adds r6, #1
  7192. 8024d22: eb02 0585 add.w r5, r2, r5, lsl #2
  7193. 8024d26: 3514 adds r5, #20
  7194. 8024d28: eb00 0686 add.w r6, r0, r6, lsl #2
  7195. 8024d2c: 42ab cmp r3, r5
  7196. 8024d2e: d20c bcs.n 8024d4a <__copybits+0x36>
  7197. 8024d30: 4601 mov r1, r0
  7198. 8024d32: f853 4b04 ldr.w r4, [r3], #4
  7199. 8024d36: 429d cmp r5, r3
  7200. 8024d38: f841 4b04 str.w r4, [r1], #4
  7201. 8024d3c: d8f9 bhi.n 8024d32 <__copybits+0x1e>
  7202. 8024d3e: 1aab subs r3, r5, r2
  7203. 8024d40: 3b15 subs r3, #21
  7204. 8024d42: f023 0303 bic.w r3, r3, #3
  7205. 8024d46: 3304 adds r3, #4
  7206. 8024d48: 18c0 adds r0, r0, r3
  7207. 8024d4a: 4286 cmp r6, r0
  7208. 8024d4c: d904 bls.n 8024d58 <__copybits+0x44>
  7209. 8024d4e: 2300 movs r3, #0
  7210. 8024d50: f840 3b04 str.w r3, [r0], #4
  7211. 8024d54: 4286 cmp r6, r0
  7212. 8024d56: d8fb bhi.n 8024d50 <__copybits+0x3c>
  7213. 8024d58: bc70 pop {r4, r5, r6}
  7214. 8024d5a: 4770 bx lr
  7215. 08024d5c <__any_on>:
  7216. 8024d5c: b430 push {r4, r5}
  7217. 8024d5e: 114b asrs r3, r1, #5
  7218. 8024d60: 6904 ldr r4, [r0, #16]
  7219. 8024d62: f100 0214 add.w r2, r0, #20
  7220. 8024d66: 429c cmp r4, r3
  7221. 8024d68: bfb8 it lt
  7222. 8024d6a: 4623 movlt r3, r4
  7223. 8024d6c: db00 blt.n 8024d70 <__any_on+0x14>
  7224. 8024d6e: dc11 bgt.n 8024d94 <__any_on+0x38>
  7225. 8024d70: 3304 adds r3, #4
  7226. 8024d72: eb00 0083 add.w r0, r0, r3, lsl #2
  7227. 8024d76: 1d03 adds r3, r0, #4
  7228. 8024d78: 429a cmp r2, r3
  7229. 8024d7a: d218 bcs.n 8024dae <__any_on+0x52>
  7230. 8024d7c: f853 3c04 ldr.w r3, [r3, #-4]
  7231. 8024d80: b92b cbnz r3, 8024d8e <__any_on+0x32>
  7232. 8024d82: 4282 cmp r2, r0
  7233. 8024d84: d213 bcs.n 8024dae <__any_on+0x52>
  7234. 8024d86: f850 3d04 ldr.w r3, [r0, #-4]!
  7235. 8024d8a: 2b00 cmp r3, #0
  7236. 8024d8c: d0f9 beq.n 8024d82 <__any_on+0x26>
  7237. 8024d8e: 2001 movs r0, #1
  7238. 8024d90: bc30 pop {r4, r5}
  7239. 8024d92: 4770 bx lr
  7240. 8024d94: f011 011f ands.w r1, r1, #31
  7241. 8024d98: d0ea beq.n 8024d70 <__any_on+0x14>
  7242. 8024d9a: eb00 0483 add.w r4, r0, r3, lsl #2
  7243. 8024d9e: 6964 ldr r4, [r4, #20]
  7244. 8024da0: fa24 f501 lsr.w r5, r4, r1
  7245. 8024da4: fa05 f101 lsl.w r1, r5, r1
  7246. 8024da8: 42a1 cmp r1, r4
  7247. 8024daa: d1f0 bne.n 8024d8e <__any_on+0x32>
  7248. 8024dac: e7e0 b.n 8024d70 <__any_on+0x14>
  7249. 8024dae: 2000 movs r0, #0
  7250. 8024db0: e7ee b.n 8024d90 <__any_on+0x34>
  7251. 8024db2: bf00 nop
  7252. 08024db4 <_sbrk_r>:
  7253. 8024db4: b538 push {r3, r4, r5, lr}
  7254. 8024db6: f644 64d4 movw r4, #20180 ; 0x4ed4
  7255. 8024dba: f2c2 0401 movt r4, #8193 ; 0x2001
  7256. 8024dbe: 4605 mov r5, r0
  7257. 8024dc0: 4608 mov r0, r1
  7258. 8024dc2: 2300 movs r3, #0
  7259. 8024dc4: 6023 str r3, [r4, #0]
  7260. 8024dc6: f00e fe3d bl 8033a44 <_sbrk>
  7261. 8024dca: 1c43 adds r3, r0, #1
  7262. 8024dcc: d000 beq.n 8024dd0 <_sbrk_r+0x1c>
  7263. 8024dce: bd38 pop {r3, r4, r5, pc}
  7264. 8024dd0: 6823 ldr r3, [r4, #0]
  7265. 8024dd2: 2b00 cmp r3, #0
  7266. 8024dd4: d0fb beq.n 8024dce <_sbrk_r+0x1a>
  7267. 8024dd6: 602b str r3, [r5, #0]
  7268. 8024dd8: bd38 pop {r3, r4, r5, pc}
  7269. 8024dda: bf00 nop
  7270. 08024ddc <strchr>:
  7271. 8024ddc: b2c9 uxtb r1, r1
  7272. 8024dde: b4f0 push {r4, r5, r6, r7}
  7273. 8024de0: 2900 cmp r1, #0
  7274. 8024de2: d04b beq.n 8024e7c <strchr+0xa0>
  7275. 8024de4: 0783 lsls r3, r0, #30
  7276. 8024de6: d00f beq.n 8024e08 <strchr+0x2c>
  7277. 8024de8: 7803 ldrb r3, [r0, #0]
  7278. 8024dea: 2b00 cmp r3, #0
  7279. 8024dec: d073 beq.n 8024ed6 <strchr+0xfa>
  7280. 8024dee: 4299 cmp r1, r3
  7281. 8024df0: d042 beq.n 8024e78 <strchr+0x9c>
  7282. 8024df2: 1c43 adds r3, r0, #1
  7283. 8024df4: e005 b.n 8024e02 <strchr+0x26>
  7284. 8024df6: f813 2b01 ldrb.w r2, [r3], #1
  7285. 8024dfa: 2a00 cmp r2, #0
  7286. 8024dfc: d03b beq.n 8024e76 <strchr+0x9a>
  7287. 8024dfe: 4291 cmp r1, r2
  7288. 8024e00: d03a beq.n 8024e78 <strchr+0x9c>
  7289. 8024e02: 079a lsls r2, r3, #30
  7290. 8024e04: 4618 mov r0, r3
  7291. 8024e06: d1f6 bne.n 8024df6 <strchr+0x1a>
  7292. 8024e08: 6803 ldr r3, [r0, #0]
  7293. 8024e0a: ea41 2701 orr.w r7, r1, r1, lsl #8
  7294. 8024e0e: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  7295. 8024e12: ea47 4707 orr.w r7, r7, r7, lsl #16
  7296. 8024e16: ea22 0203 bic.w r2, r2, r3
  7297. 8024e1a: f012 3f80 tst.w r2, #2155905152 ; 0x80808080
  7298. 8024e1e: d11c bne.n 8024e5a <strchr+0x7e>
  7299. 8024e20: 407b eors r3, r7
  7300. 8024e22: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  7301. 8024e26: ea22 0303 bic.w r3, r2, r3
  7302. 8024e2a: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  7303. 8024e2e: d114 bne.n 8024e5a <strchr+0x7e>
  7304. 8024e30: 1d02 adds r2, r0, #4
  7305. 8024e32: e002 b.n 8024e3a <strchr+0x5e>
  7306. 8024e34: f014 3f80 tst.w r4, #2155905152 ; 0x80808080
  7307. 8024e38: d10f bne.n 8024e5a <strchr+0x7e>
  7308. 8024e3a: 4610 mov r0, r2
  7309. 8024e3c: f852 3b04 ldr.w r3, [r2], #4
  7310. 8024e40: f1a3 3601 sub.w r6, r3, #16843009 ; 0x1010101
  7311. 8024e44: ea87 0403 eor.w r4, r7, r3
  7312. 8024e48: ea26 0303 bic.w r3, r6, r3
  7313. 8024e4c: f1a4 3501 sub.w r5, r4, #16843009 ; 0x1010101
  7314. 8024e50: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  7315. 8024e54: ea25 0404 bic.w r4, r5, r4
  7316. 8024e58: d0ec beq.n 8024e34 <strchr+0x58>
  7317. 8024e5a: 7803 ldrb r3, [r0, #0]
  7318. 8024e5c: 2b00 cmp r3, #0
  7319. 8024e5e: d03a beq.n 8024ed6 <strchr+0xfa>
  7320. 8024e60: 4299 cmp r1, r3
  7321. 8024e62: d009 beq.n 8024e78 <strchr+0x9c>
  7322. 8024e64: 1c43 adds r3, r0, #1
  7323. 8024e66: e001 b.n 8024e6c <strchr+0x90>
  7324. 8024e68: 4291 cmp r1, r2
  7325. 8024e6a: d005 beq.n 8024e78 <strchr+0x9c>
  7326. 8024e6c: 4618 mov r0, r3
  7327. 8024e6e: f813 2b01 ldrb.w r2, [r3], #1
  7328. 8024e72: 2a00 cmp r2, #0
  7329. 8024e74: d1f8 bne.n 8024e68 <strchr+0x8c>
  7330. 8024e76: 4610 mov r0, r2
  7331. 8024e78: bcf0 pop {r4, r5, r6, r7}
  7332. 8024e7a: 4770 bx lr
  7333. 8024e7c: 0781 lsls r1, r0, #30
  7334. 8024e7e: d00d beq.n 8024e9c <strchr+0xc0>
  7335. 8024e80: 7803 ldrb r3, [r0, #0]
  7336. 8024e82: 2b00 cmp r3, #0
  7337. 8024e84: d0f8 beq.n 8024e78 <strchr+0x9c>
  7338. 8024e86: 1c43 adds r3, r0, #1
  7339. 8024e88: e002 b.n 8024e90 <strchr+0xb4>
  7340. 8024e8a: 7802 ldrb r2, [r0, #0]
  7341. 8024e8c: 2a00 cmp r2, #0
  7342. 8024e8e: d0f3 beq.n 8024e78 <strchr+0x9c>
  7343. 8024e90: f013 0f03 tst.w r3, #3
  7344. 8024e94: 4618 mov r0, r3
  7345. 8024e96: f103 0301 add.w r3, r3, #1
  7346. 8024e9a: d1f6 bne.n 8024e8a <strchr+0xae>
  7347. 8024e9c: 6803 ldr r3, [r0, #0]
  7348. 8024e9e: f1a3 3201 sub.w r2, r3, #16843009 ; 0x1010101
  7349. 8024ea2: ea22 0303 bic.w r3, r2, r3
  7350. 8024ea6: f013 3f80 tst.w r3, #2155905152 ; 0x80808080
  7351. 8024eaa: d10a bne.n 8024ec2 <strchr+0xe6>
  7352. 8024eac: 1d02 adds r2, r0, #4
  7353. 8024eae: 4610 mov r0, r2
  7354. 8024eb0: f852 1b04 ldr.w r1, [r2], #4
  7355. 8024eb4: f1a1 3401 sub.w r4, r1, #16843009 ; 0x1010101
  7356. 8024eb8: ea24 0101 bic.w r1, r4, r1
  7357. 8024ebc: f011 3f80 tst.w r1, #2155905152 ; 0x80808080
  7358. 8024ec0: d0f5 beq.n 8024eae <strchr+0xd2>
  7359. 8024ec2: 7803 ldrb r3, [r0, #0]
  7360. 8024ec4: 2b00 cmp r3, #0
  7361. 8024ec6: d0d7 beq.n 8024e78 <strchr+0x9c>
  7362. 8024ec8: 1c43 adds r3, r0, #1
  7363. 8024eca: 4618 mov r0, r3
  7364. 8024ecc: 3301 adds r3, #1
  7365. 8024ece: 7802 ldrb r2, [r0, #0]
  7366. 8024ed0: 2a00 cmp r2, #0
  7367. 8024ed2: d1fa bne.n 8024eca <strchr+0xee>
  7368. 8024ed4: e7d0 b.n 8024e78 <strchr+0x9c>
  7369. 8024ed6: 4618 mov r0, r3
  7370. 8024ed8: e7ce b.n 8024e78 <strchr+0x9c>
  7371. 8024eda: bf00 nop
  7372. 08024edc <_calloc_r>:
  7373. 8024edc: b510 push {r4, lr}
  7374. 8024ede: fb01 f102 mul.w r1, r1, r2
  7375. 8024ee2: f7fe ffc5 bl 8023e70 <_malloc_r>
  7376. 8024ee6: 4604 mov r4, r0
  7377. 8024ee8: b170 cbz r0, 8024f08 <_calloc_r+0x2c>
  7378. 8024eea: f850 2c04 ldr.w r2, [r0, #-4]
  7379. 8024eee: f022 0203 bic.w r2, r2, #3
  7380. 8024ef2: 3a04 subs r2, #4
  7381. 8024ef4: 2a24 cmp r2, #36 ; 0x24
  7382. 8024ef6: d81c bhi.n 8024f32 <_calloc_r+0x56>
  7383. 8024ef8: 2a13 cmp r2, #19
  7384. 8024efa: bf98 it ls
  7385. 8024efc: 4603 movls r3, r0
  7386. 8024efe: d805 bhi.n 8024f0c <_calloc_r+0x30>
  7387. 8024f00: 2200 movs r2, #0
  7388. 8024f02: 601a str r2, [r3, #0]
  7389. 8024f04: 605a str r2, [r3, #4]
  7390. 8024f06: 609a str r2, [r3, #8]
  7391. 8024f08: 4620 mov r0, r4
  7392. 8024f0a: bd10 pop {r4, pc}
  7393. 8024f0c: 2100 movs r1, #0
  7394. 8024f0e: 2a1b cmp r2, #27
  7395. 8024f10: 6001 str r1, [r0, #0]
  7396. 8024f12: bf98 it ls
  7397. 8024f14: f100 0308 addls.w r3, r0, #8
  7398. 8024f18: 6041 str r1, [r0, #4]
  7399. 8024f1a: d9f1 bls.n 8024f00 <_calloc_r+0x24>
  7400. 8024f1c: 2a24 cmp r2, #36 ; 0x24
  7401. 8024f1e: 6081 str r1, [r0, #8]
  7402. 8024f20: 60c1 str r1, [r0, #12]
  7403. 8024f22: bf11 iteee ne
  7404. 8024f24: f100 0310 addne.w r3, r0, #16
  7405. 8024f28: 6101 streq r1, [r0, #16]
  7406. 8024f2a: f100 0318 addeq.w r3, r0, #24
  7407. 8024f2e: 6141 streq r1, [r0, #20]
  7408. 8024f30: e7e6 b.n 8024f00 <_calloc_r+0x24>
  7409. 8024f32: 2100 movs r1, #0
  7410. 8024f34: f7fc fc40 bl 80217b8 <memset>
  7411. 8024f38: 4620 mov r0, r4
  7412. 8024f3a: bd10 pop {r4, pc}
  7413. 08024f3c <__aeabi_d2uiz>:
  7414. 8024f3c: 004a lsls r2, r1, #1
  7415. 8024f3e: d211 bcs.n 8024f64 <__aeabi_d2uiz+0x28>
  7416. 8024f40: f512 1200 adds.w r2, r2, #2097152 ; 0x200000
  7417. 8024f44: d211 bcs.n 8024f6a <__aeabi_d2uiz+0x2e>
  7418. 8024f46: d50d bpl.n 8024f64 <__aeabi_d2uiz+0x28>
  7419. 8024f48: f46f 7378 mvn.w r3, #992 ; 0x3e0
  7420. 8024f4c: ebb3 5262 subs.w r2, r3, r2, asr #21
  7421. 8024f50: d40e bmi.n 8024f70 <__aeabi_d2uiz+0x34>
  7422. 8024f52: ea4f 23c1 mov.w r3, r1, lsl #11
  7423. 8024f56: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000
  7424. 8024f5a: ea43 5350 orr.w r3, r3, r0, lsr #21
  7425. 8024f5e: fa23 f002 lsr.w r0, r3, r2
  7426. 8024f62: 4770 bx lr
  7427. 8024f64: f04f 0000 mov.w r0, #0
  7428. 8024f68: 4770 bx lr
  7429. 8024f6a: ea50 3001 orrs.w r0, r0, r1, lsl #12
  7430. 8024f6e: d102 bne.n 8024f76 <__aeabi_d2uiz+0x3a>
  7431. 8024f70: f04f 30ff mov.w r0, #4294967295
  7432. 8024f74: 4770 bx lr
  7433. 8024f76: f04f 0000 mov.w r0, #0
  7434. 8024f7a: 4770 bx lr
  7435. 08024f7c <__gesf2>:
  7436. 8024f7c: f04f 3cff mov.w ip, #4294967295
  7437. 8024f80: e006 b.n 8024f90 <__cmpsf2+0x4>
  7438. 8024f82: bf00 nop
  7439. 08024f84 <__lesf2>:
  7440. 8024f84: f04f 0c01 mov.w ip, #1
  7441. 8024f88: e002 b.n 8024f90 <__cmpsf2+0x4>
  7442. 8024f8a: bf00 nop
  7443. 08024f8c <__cmpsf2>:
  7444. 8024f8c: f04f 0c01 mov.w ip, #1
  7445. 8024f90: f84d cd04 str.w ip, [sp, #-4]!
  7446. 8024f94: ea4f 0240 mov.w r2, r0, lsl #1
  7447. 8024f98: ea4f 0341 mov.w r3, r1, lsl #1
  7448. 8024f9c: ea7f 6c22 mvns.w ip, r2, asr #24
  7449. 8024fa0: bf18 it ne
  7450. 8024fa2: ea7f 6c23 mvnsne.w ip, r3, asr #24
  7451. 8024fa6: d011 beq.n 8024fcc <__cmpsf2+0x40>
  7452. 8024fa8: b001 add sp, #4
  7453. 8024faa: ea52 0c53 orrs.w ip, r2, r3, lsr #1
  7454. 8024fae: bf18 it ne
  7455. 8024fb0: ea90 0f01 teqne r0, r1
  7456. 8024fb4: bf58 it pl
  7457. 8024fb6: ebb2 0003 subspl.w r0, r2, r3
  7458. 8024fba: bf88 it hi
  7459. 8024fbc: 17c8 asrhi r0, r1, #31
  7460. 8024fbe: bf38 it cc
  7461. 8024fc0: ea6f 70e1 mvncc.w r0, r1, asr #31
  7462. 8024fc4: bf18 it ne
  7463. 8024fc6: f040 0001 orrne.w r0, r0, #1
  7464. 8024fca: 4770 bx lr
  7465. 8024fcc: ea7f 6c22 mvns.w ip, r2, asr #24
  7466. 8024fd0: d102 bne.n 8024fd8 <__cmpsf2+0x4c>
  7467. 8024fd2: ea5f 2c40 movs.w ip, r0, lsl #9
  7468. 8024fd6: d105 bne.n 8024fe4 <__cmpsf2+0x58>
  7469. 8024fd8: ea7f 6c23 mvns.w ip, r3, asr #24
  7470. 8024fdc: d1e4 bne.n 8024fa8 <__cmpsf2+0x1c>
  7471. 8024fde: ea5f 2c41 movs.w ip, r1, lsl #9
  7472. 8024fe2: d0e1 beq.n 8024fa8 <__cmpsf2+0x1c>
  7473. 8024fe4: f85d 0b04 ldr.w r0, [sp], #4
  7474. 8024fe8: 4770 bx lr
  7475. 8024fea: bf00 nop
  7476. 08024fec <__aeabi_cfrcmple>:
  7477. 8024fec: 4684 mov ip, r0
  7478. 8024fee: 4608 mov r0, r1
  7479. 8024ff0: 4661 mov r1, ip
  7480. 8024ff2: e7ff b.n 8024ff4 <__aeabi_cfcmpeq>
  7481. 08024ff4 <__aeabi_cfcmpeq>:
  7482. 8024ff4: b50f push {r0, r1, r2, r3, lr}
  7483. 8024ff6: f7ff ffc9 bl 8024f8c <__cmpsf2>
  7484. 8024ffa: 2800 cmp r0, #0
  7485. 8024ffc: bf48 it mi
  7486. 8024ffe: f110 0f00 cmnmi.w r0, #0
  7487. 8025002: bd0f pop {r0, r1, r2, r3, pc}
  7488. 08025004 <__aeabi_fcmpeq>:
  7489. 8025004: f84d ed08 str.w lr, [sp, #-8]!
  7490. 8025008: f7ff fff4 bl 8024ff4 <__aeabi_cfcmpeq>
  7491. 802500c: bf0c ite eq
  7492. 802500e: 2001 moveq r0, #1
  7493. 8025010: 2000 movne r0, #0
  7494. 8025012: f85d fb08 ldr.w pc, [sp], #8
  7495. 8025016: bf00 nop
  7496. 08025018 <__aeabi_fcmplt>:
  7497. 8025018: f84d ed08 str.w lr, [sp, #-8]!
  7498. 802501c: f7ff ffea bl 8024ff4 <__aeabi_cfcmpeq>
  7499. 8025020: bf34 ite cc
  7500. 8025022: 2001 movcc r0, #1
  7501. 8025024: 2000 movcs r0, #0
  7502. 8025026: f85d fb08 ldr.w pc, [sp], #8
  7503. 802502a: bf00 nop
  7504. 0802502c <__aeabi_fcmple>:
  7505. 802502c: f84d ed08 str.w lr, [sp, #-8]!
  7506. 8025030: f7ff ffe0 bl 8024ff4 <__aeabi_cfcmpeq>
  7507. 8025034: bf94 ite ls
  7508. 8025036: 2001 movls r0, #1
  7509. 8025038: 2000 movhi r0, #0
  7510. 802503a: f85d fb08 ldr.w pc, [sp], #8
  7511. 802503e: bf00 nop
  7512. 08025040 <__aeabi_fcmpge>:
  7513. 8025040: f84d ed08 str.w lr, [sp, #-8]!
  7514. 8025044: f7ff ffd2 bl 8024fec <__aeabi_cfrcmple>
  7515. 8025048: bf94 ite ls
  7516. 802504a: 2001 movls r0, #1
  7517. 802504c: 2000 movhi r0, #0
  7518. 802504e: f85d fb08 ldr.w pc, [sp], #8
  7519. 8025052: bf00 nop
  7520. 08025054 <__aeabi_fcmpgt>:
  7521. 8025054: f84d ed08 str.w lr, [sp, #-8]!
  7522. 8025058: f7ff ffc8 bl 8024fec <__aeabi_cfrcmple>
  7523. 802505c: bf34 ite cc
  7524. 802505e: 2001 movcc r0, #1
  7525. 8025060: 2000 movcs r0, #0
  7526. 8025062: f85d fb08 ldr.w pc, [sp], #8
  7527. 8025066: bf00 nop
  7528. 08025068 <NVIC_PriorityGroupConfig>:
  7529. {
  7530. /* Check the parameters */
  7531. assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  7532. /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  7533. SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
  7534. 8025068: f040 60bf orr.w r0, r0, #100139008 ; 0x5f80000
  7535. 802506c: 4b02 ldr r3, [pc, #8] ; (8025078 <NVIC_PriorityGroupConfig+0x10>)
  7536. 802506e: f440 3000 orr.w r0, r0, #131072 ; 0x20000
  7537. 8025072: 60d8 str r0, [r3, #12]
  7538. 8025074: 4770 bx lr
  7539. 8025076: bf00 nop
  7540. 8025078: e000ed00 .word 0xe000ed00
  7541. 0802507c <NVIC_Init>:
  7542. /* Check the parameters */
  7543. assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
  7544. assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));
  7545. assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
  7546. if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  7547. 802507c: 78c3 ldrb r3, [r0, #3]
  7548. 802507e: b30b cbz r3, 80250c4 <NVIC_Init+0x48>
  7549. {
  7550. /* Compute the Corresponding IRQ Priority --------------------------------*/
  7551. tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
  7552. 8025080: 4b16 ldr r3, [pc, #88] ; (80250dc <NVIC_Init+0x60>)
  7553. tmppre = (0x4 - tmppriority);
  7554. tmpsub = tmpsub >> tmppriority;
  7555. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  7556. 8025082: 7841 ldrb r1, [r0, #1]
  7557. assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
  7558. if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  7559. {
  7560. /* Compute the Corresponding IRQ Priority --------------------------------*/
  7561. tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
  7562. 8025084: 68db ldr r3, [r3, #12]
  7563. 8025086: 43db mvns r3, r3
  7564. 8025088: f3c3 2302 ubfx r3, r3, #8, #3
  7565. tmppre = (0x4 - tmppriority);
  7566. 802508c: f1c3 0204 rsb r2, r3, #4
  7567. tmpsub = tmpsub >> tmppriority;
  7568. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  7569. 8025090: b2d2 uxtb r2, r2
  7570. 8025092: fa01 f202 lsl.w r2, r1, r2
  7571. if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  7572. {
  7573. /* Compute the Corresponding IRQ Priority --------------------------------*/
  7574. tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
  7575. tmppre = (0x4 - tmppriority);
  7576. tmpsub = tmpsub >> tmppriority;
  7577. 8025096: 210f movs r1, #15
  7578. 8025098: fa41 f303 asr.w r3, r1, r3
  7579. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  7580. tmppriority |= (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub);
  7581. 802509c: 7881 ldrb r1, [r0, #2]
  7582. /* Compute the Corresponding IRQ Priority --------------------------------*/
  7583. tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
  7584. tmppre = (0x4 - tmppriority);
  7585. tmpsub = tmpsub >> tmppriority;
  7586. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  7587. 802509e: b2d2 uxtb r2, r2
  7588. tmppriority |= (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub);
  7589. 80250a0: 400b ands r3, r1
  7590. 80250a2: 431a orrs r2, r3
  7591. tmppriority = tmppriority << 0x04;
  7592. NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
  7593. 80250a4: 7803 ldrb r3, [r0, #0]
  7594. 80250a6: f103 4360 add.w r3, r3, #3758096384 ; 0xe0000000
  7595. 80250aa: f503 4361 add.w r3, r3, #57600 ; 0xe100
  7596. tmpsub = tmpsub >> tmppriority;
  7597. tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  7598. tmppriority |= (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub);
  7599. tmppriority = tmppriority << 0x04;
  7600. 80250ae: 0112 lsls r2, r2, #4
  7601. NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
  7602. 80250b0: f883 2300 strb.w r2, [r3, #768] ; 0x300
  7603. /* Enable the Selected IRQ Channels --------------------------------------*/
  7604. NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  7605. 80250b4: 7803 ldrb r3, [r0, #0]
  7606. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  7607. 80250b6: 2201 movs r2, #1
  7608. tmppriority = tmppriority << 0x04;
  7609. NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
  7610. /* Enable the Selected IRQ Channels --------------------------------------*/
  7611. NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  7612. 80250b8: 0959 lsrs r1, r3, #5
  7613. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  7614. 80250ba: f003 031f and.w r3, r3, #31
  7615. 80250be: fa02 f303 lsl.w r3, r2, r3
  7616. 80250c2: e007 b.n 80250d4 <NVIC_Init+0x58>
  7617. }
  7618. else
  7619. {
  7620. /* Disable the Selected IRQ Channels -------------------------------------*/
  7621. NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  7622. 80250c4: 7803 ldrb r3, [r0, #0]
  7623. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  7624. 80250c6: 2201 movs r2, #1
  7625. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  7626. }
  7627. else
  7628. {
  7629. /* Disable the Selected IRQ Channels -------------------------------------*/
  7630. NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  7631. 80250c8: 0959 lsrs r1, r3, #5
  7632. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  7633. 80250ca: f003 031f and.w r3, r3, #31
  7634. 80250ce: fa02 f303 lsl.w r3, r2, r3
  7635. (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  7636. }
  7637. else
  7638. {
  7639. /* Disable the Selected IRQ Channels -------------------------------------*/
  7640. NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
  7641. 80250d2: 3120 adds r1, #32
  7642. 80250d4: 4a02 ldr r2, [pc, #8] ; (80250e0 <NVIC_Init+0x64>)
  7643. 80250d6: f842 3021 str.w r3, [r2, r1, lsl #2]
  7644. 80250da: 4770 bx lr
  7645. 80250dc: e000ed00 .word 0xe000ed00
  7646. 80250e0: e000e100 .word 0xe000e100
  7647. 080250e4 <NVIC_SetVectorTable>:
  7648. {
  7649. /* Check the parameters */
  7650. assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
  7651. assert_param(IS_NVIC_OFFSET(Offset));
  7652. SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);
  7653. 80250e4: f021 4160 bic.w r1, r1, #3758096384 ; 0xe0000000
  7654. 80250e8: f021 017f bic.w r1, r1, #127 ; 0x7f
  7655. 80250ec: 4b01 ldr r3, [pc, #4] ; (80250f4 <NVIC_SetVectorTable+0x10>)
  7656. 80250ee: 4308 orrs r0, r1
  7657. 80250f0: 6098 str r0, [r3, #8]
  7658. 80250f2: 4770 bx lr
  7659. 80250f4: e000ed00 .word 0xe000ed00
  7660. 080250f8 <CRC_ResetDR>:
  7661. * @retval None
  7662. */
  7663. void CRC_ResetDR(void)
  7664. {
  7665. /* Reset CRC generator */
  7666. CRC->CR = CRC_CR_RESET;
  7667. 80250f8: 4b01 ldr r3, [pc, #4] ; (8025100 <CRC_ResetDR+0x8>)
  7668. 80250fa: 2201 movs r2, #1
  7669. 80250fc: 609a str r2, [r3, #8]
  7670. 80250fe: 4770 bx lr
  7671. 8025100: 40023000 .word 0x40023000
  7672. 08025104 <CRC_CalcBlockCRC>:
  7673. * @param pBuffer: pointer to the buffer containing the data to be computed
  7674. * @param BufferLength: length of the buffer to be computed
  7675. * @retval 32-bit CRC
  7676. */
  7677. uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
  7678. {
  7679. 8025104: b510 push {r4, lr}
  7680. uint32_t index = 0;
  7681. for(index = 0; index < BufferLength; index++)
  7682. 8025106: 2300 movs r3, #0
  7683. 8025108: 4c05 ldr r4, [pc, #20] ; (8025120 <CRC_CalcBlockCRC+0x1c>)
  7684. 802510a: e003 b.n 8025114 <CRC_CalcBlockCRC+0x10>
  7685. {
  7686. CRC->DR = pBuffer[index];
  7687. 802510c: f850 2023 ldr.w r2, [r0, r3, lsl #2]
  7688. */
  7689. uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
  7690. {
  7691. uint32_t index = 0;
  7692. for(index = 0; index < BufferLength; index++)
  7693. 8025110: 3301 adds r3, #1
  7694. {
  7695. CRC->DR = pBuffer[index];
  7696. 8025112: 6022 str r2, [r4, #0]
  7697. */
  7698. uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
  7699. {
  7700. uint32_t index = 0;
  7701. for(index = 0; index < BufferLength; index++)
  7702. 8025114: 428b cmp r3, r1
  7703. 8025116: d1f9 bne.n 802510c <CRC_CalcBlockCRC+0x8>
  7704. {
  7705. CRC->DR = pBuffer[index];
  7706. }
  7707. return (CRC->DR);
  7708. 8025118: 4b01 ldr r3, [pc, #4] ; (8025120 <CRC_CalcBlockCRC+0x1c>)
  7709. 802511a: 6818 ldr r0, [r3, #0]
  7710. }
  7711. 802511c: bd10 pop {r4, pc}
  7712. 802511e: bf00 nop
  7713. 8025120: 40023000 .word 0x40023000
  7714. 08025124 <FLASH_Unlock>:
  7715. * @param None
  7716. * @retval None
  7717. */
  7718. void FLASH_Unlock(void)
  7719. {
  7720. if((FLASH->CR & FLASH_CR_LOCK) != RESET)
  7721. 8025124: 4b04 ldr r3, [pc, #16] ; (8025138 <FLASH_Unlock+0x14>)
  7722. 8025126: 691a ldr r2, [r3, #16]
  7723. 8025128: 2a00 cmp r2, #0
  7724. 802512a: da04 bge.n 8025136 <FLASH_Unlock+0x12>
  7725. {
  7726. /* Authorize the FLASH Registers access */
  7727. FLASH->KEYR = FLASH_KEY1;
  7728. 802512c: 4a03 ldr r2, [pc, #12] ; (802513c <FLASH_Unlock+0x18>)
  7729. 802512e: 605a str r2, [r3, #4]
  7730. FLASH->KEYR = FLASH_KEY2;
  7731. 8025130: f102 3288 add.w r2, r2, #2290649224 ; 0x88888888
  7732. 8025134: 605a str r2, [r3, #4]
  7733. 8025136: 4770 bx lr
  7734. 8025138: 40023c00 .word 0x40023c00
  7735. 802513c: 45670123 .word 0x45670123
  7736. 08025140 <FLASH_Lock>:
  7737. * @retval None
  7738. */
  7739. void FLASH_Lock(void)
  7740. {
  7741. /* Set the LOCK Bit to lock the FLASH Registers access */
  7742. FLASH->CR |= FLASH_CR_LOCK;
  7743. 8025140: 4b02 ldr r3, [pc, #8] ; (802514c <FLASH_Lock+0xc>)
  7744. 8025142: 691a ldr r2, [r3, #16]
  7745. 8025144: f042 4200 orr.w r2, r2, #2147483648 ; 0x80000000
  7746. 8025148: 611a str r2, [r3, #16]
  7747. 802514a: 4770 bx lr
  7748. 802514c: 40023c00 .word 0x40023c00
  7749. 08025150 <FLASH_ClearFlag>:
  7750. {
  7751. /* Check the parameters */
  7752. assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG));
  7753. /* Clear the flags */
  7754. FLASH->SR = FLASH_FLAG;
  7755. 8025150: 4b01 ldr r3, [pc, #4] ; (8025158 <FLASH_ClearFlag+0x8>)
  7756. 8025152: 60d8 str r0, [r3, #12]
  7757. 8025154: 4770 bx lr
  7758. 8025156: bf00 nop
  7759. 8025158: 40023c00 .word 0x40023c00
  7760. 0802515c <FLASH_GetStatus>:
  7761. */
  7762. FLASH_Status FLASH_GetStatus(void)
  7763. {
  7764. FLASH_Status flashstatus = FLASH_COMPLETE;
  7765. if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY)
  7766. 802515c: 4b0b ldr r3, [pc, #44] ; (802518c <FLASH_GetStatus+0x30>)
  7767. 802515e: 68da ldr r2, [r3, #12]
  7768. 8025160: 03d0 lsls r0, r2, #15
  7769. 8025162: d40d bmi.n 8025180 <FLASH_GetStatus+0x24>
  7770. {
  7771. flashstatus = FLASH_BUSY;
  7772. }
  7773. else
  7774. {
  7775. if((FLASH->SR & FLASH_FLAG_WRPERR) != (uint32_t)0x00)
  7776. 8025164: 68da ldr r2, [r3, #12]
  7777. 8025166: 06d1 lsls r1, r2, #27
  7778. 8025168: d40c bmi.n 8025184 <FLASH_GetStatus+0x28>
  7779. {
  7780. flashstatus = FLASH_ERROR_WRP;
  7781. }
  7782. else
  7783. {
  7784. if((FLASH->SR & (uint32_t)0xEF) != (uint32_t)0x00)
  7785. 802516a: 68da ldr r2, [r3, #12]
  7786. 802516c: f012 0fef tst.w r2, #239 ; 0xef
  7787. 8025170: d10a bne.n 8025188 <FLASH_GetStatus+0x2c>
  7788. {
  7789. flashstatus = FLASH_ERROR_PROGRAM;
  7790. }
  7791. else
  7792. {
  7793. if((FLASH->SR & FLASH_FLAG_OPERR) != (uint32_t)0x00)
  7794. 8025172: 68db ldr r3, [r3, #12]
  7795. 8025174: f013 0f02 tst.w r3, #2
  7796. {
  7797. flashstatus = FLASH_ERROR_OPERATION;
  7798. 8025178: bf0c ite eq
  7799. 802517a: 2008 moveq r0, #8
  7800. 802517c: 2007 movne r0, #7
  7801. 802517e: 4770 bx lr
  7802. {
  7803. FLASH_Status flashstatus = FLASH_COMPLETE;
  7804. if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY)
  7805. {
  7806. flashstatus = FLASH_BUSY;
  7807. 8025180: 2001 movs r0, #1
  7808. 8025182: 4770 bx lr
  7809. }
  7810. else
  7811. {
  7812. if((FLASH->SR & FLASH_FLAG_WRPERR) != (uint32_t)0x00)
  7813. {
  7814. flashstatus = FLASH_ERROR_WRP;
  7815. 8025184: 2005 movs r0, #5
  7816. 8025186: 4770 bx lr
  7817. }
  7818. else
  7819. {
  7820. if((FLASH->SR & (uint32_t)0xEF) != (uint32_t)0x00)
  7821. {
  7822. flashstatus = FLASH_ERROR_PROGRAM;
  7823. 8025188: 2006 movs r0, #6
  7824. }
  7825. }
  7826. }
  7827. /* Return the FLASH Status */
  7828. return flashstatus;
  7829. }
  7830. 802518a: 4770 bx lr
  7831. 802518c: 40023c00 .word 0x40023c00
  7832. 08025190 <FLASH_WaitForLastOperation>:
  7833. * @param None
  7834. * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
  7835. * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
  7836. */
  7837. FLASH_Status FLASH_WaitForLastOperation(void)
  7838. {
  7839. 8025190: b507 push {r0, r1, r2, lr}
  7840. __IO FLASH_Status status = FLASH_COMPLETE;
  7841. 8025192: 2308 movs r3, #8
  7842. 8025194: f88d 3007 strb.w r3, [sp, #7]
  7843. /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset.
  7844. Even if the FLASH operation fails, the BUSY flag will be reset and an error
  7845. flag will be set */
  7846. while(status == FLASH_BUSY)
  7847. {
  7848. status = FLASH_GetStatus();
  7849. 8025198: f7ff ffe0 bl 802515c <FLASH_GetStatus>
  7850. 802519c: f88d 0007 strb.w r0, [sp, #7]
  7851. status = FLASH_GetStatus();
  7852. /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset.
  7853. Even if the FLASH operation fails, the BUSY flag will be reset and an error
  7854. flag will be set */
  7855. while(status == FLASH_BUSY)
  7856. 80251a0: f89d 3007 ldrb.w r3, [sp, #7]
  7857. 80251a4: 2b01 cmp r3, #1
  7858. 80251a6: d0f7 beq.n 8025198 <FLASH_WaitForLastOperation+0x8>
  7859. {
  7860. status = FLASH_GetStatus();
  7861. }
  7862. /* Return the operation status */
  7863. return status;
  7864. 80251a8: f89d 0007 ldrb.w r0, [sp, #7]
  7865. }
  7866. 80251ac: bd0e pop {r1, r2, r3, pc}
  7867. 80251ae: 0000 movs r0, r0
  7868. 080251b0 <FLASH_ProgramByte>:
  7869. * @param Data: specifies the data to be programmed.
  7870. * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
  7871. * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
  7872. */
  7873. FLASH_Status FLASH_ProgramByte(uint32_t Address, uint8_t Data)
  7874. {
  7875. 80251b0: b570 push {r4, r5, r6, lr}
  7876. 80251b2: 4605 mov r5, r0
  7877. 80251b4: 460e mov r6, r1
  7878. /* Check the parameters */
  7879. assert_param(IS_FLASH_ADDRESS(Address));
  7880. /* Wait for last operation to be completed */
  7881. status = FLASH_WaitForLastOperation();
  7882. 80251b6: f7ff ffeb bl 8025190 <FLASH_WaitForLastOperation>
  7883. if(status == FLASH_COMPLETE)
  7884. 80251ba: 2808 cmp r0, #8
  7885. 80251bc: d111 bne.n 80251e2 <FLASH_ProgramByte+0x32>
  7886. {
  7887. /* if the previous operation is completed, proceed to program the new data */
  7888. FLASH->CR &= CR_PSIZE_MASK;
  7889. 80251be: 4c09 ldr r4, [pc, #36] ; (80251e4 <FLASH_ProgramByte+0x34>)
  7890. 80251c0: 6923 ldr r3, [r4, #16]
  7891. 80251c2: f423 7340 bic.w r3, r3, #768 ; 0x300
  7892. 80251c6: 6123 str r3, [r4, #16]
  7893. FLASH->CR |= FLASH_PSIZE_BYTE;
  7894. 80251c8: 6923 ldr r3, [r4, #16]
  7895. 80251ca: 6123 str r3, [r4, #16]
  7896. FLASH->CR |= FLASH_CR_PG;
  7897. 80251cc: 6923 ldr r3, [r4, #16]
  7898. 80251ce: f043 0301 orr.w r3, r3, #1
  7899. 80251d2: 6123 str r3, [r4, #16]
  7900. *(__IO uint8_t*)Address = Data;
  7901. 80251d4: 702e strb r6, [r5, #0]
  7902. /* Wait for last operation to be completed */
  7903. status = FLASH_WaitForLastOperation();
  7904. 80251d6: f7ff ffdb bl 8025190 <FLASH_WaitForLastOperation>
  7905. /* if the program operation is completed, disable the PG Bit */
  7906. FLASH->CR &= (~FLASH_CR_PG);
  7907. 80251da: 6923 ldr r3, [r4, #16]
  7908. 80251dc: f023 0301 bic.w r3, r3, #1
  7909. 80251e0: 6123 str r3, [r4, #16]
  7910. }
  7911. /* Return the Program Status */
  7912. return status;
  7913. }
  7914. 80251e2: bd70 pop {r4, r5, r6, pc}
  7915. 80251e4: 40023c00 .word 0x40023c00
  7916. 080251e8 <FLASH_ProgramWord>:
  7917. * @param Data: specifies the data to be programmed.
  7918. * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
  7919. * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
  7920. */
  7921. FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)
  7922. {
  7923. 80251e8: b570 push {r4, r5, r6, lr}
  7924. 80251ea: 4605 mov r5, r0
  7925. 80251ec: 460e mov r6, r1
  7926. /* Check the parameters */
  7927. assert_param(IS_FLASH_ADDRESS(Address));
  7928. /* Wait for last operation to be completed */
  7929. status = FLASH_WaitForLastOperation();
  7930. 80251ee: f7ff ffcf bl 8025190 <FLASH_WaitForLastOperation>
  7931. if(status == FLASH_COMPLETE)
  7932. 80251f2: 2808 cmp r0, #8
  7933. 80251f4: d113 bne.n 802521e <FLASH_ProgramWord+0x36>
  7934. {
  7935. /* if the previous operation is completed, proceed to program the new data */
  7936. FLASH->CR &= CR_PSIZE_MASK;
  7937. 80251f6: 4c0a ldr r4, [pc, #40] ; (8025220 <FLASH_ProgramWord+0x38>)
  7938. 80251f8: 6923 ldr r3, [r4, #16]
  7939. 80251fa: f423 7340 bic.w r3, r3, #768 ; 0x300
  7940. 80251fe: 6123 str r3, [r4, #16]
  7941. FLASH->CR |= FLASH_PSIZE_WORD;
  7942. 8025200: 6923 ldr r3, [r4, #16]
  7943. 8025202: f443 7300 orr.w r3, r3, #512 ; 0x200
  7944. 8025206: 6123 str r3, [r4, #16]
  7945. FLASH->CR |= FLASH_CR_PG;
  7946. 8025208: 6923 ldr r3, [r4, #16]
  7947. 802520a: f043 0301 orr.w r3, r3, #1
  7948. 802520e: 6123 str r3, [r4, #16]
  7949. *(__IO uint32_t*)Address = Data;
  7950. 8025210: 602e str r6, [r5, #0]
  7951. /* Wait for last operation to be completed */
  7952. status = FLASH_WaitForLastOperation();
  7953. 8025212: f7ff ffbd bl 8025190 <FLASH_WaitForLastOperation>
  7954. /* if the program operation is completed, disable the PG Bit */
  7955. FLASH->CR &= (~FLASH_CR_PG);
  7956. 8025216: 6923 ldr r3, [r4, #16]
  7957. 8025218: f023 0301 bic.w r3, r3, #1
  7958. 802521c: 6123 str r3, [r4, #16]
  7959. }
  7960. /* Return the Program Status */
  7961. return status;
  7962. }
  7963. 802521e: bd70 pop {r4, r5, r6, pc}
  7964. 8025220: 40023c00 .word 0x40023c00
  7965. 08025224 <FLASH_EraseSector>:
  7966. *
  7967. * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
  7968. * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
  7969. */
  7970. FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange)
  7971. {
  7972. 8025224: b570 push {r4, r5, r6, lr}
  7973. 8025226: 4606 mov r6, r0
  7974. /* Check the parameters */
  7975. assert_param(IS_FLASH_SECTOR(FLASH_Sector));
  7976. assert_param(IS_VOLTAGERANGE(VoltageRange));
  7977. if(VoltageRange == VoltageRange_1)
  7978. 8025228: b141 cbz r1, 802523c <FLASH_EraseSector+0x18>
  7979. {
  7980. tmp_psize = FLASH_PSIZE_BYTE;
  7981. }
  7982. else if(VoltageRange == VoltageRange_2)
  7983. 802522a: 2901 cmp r1, #1
  7984. 802522c: d008 beq.n 8025240 <FLASH_EraseSector+0x1c>
  7985. {
  7986. tmp_psize = FLASH_PSIZE_HALF_WORD;
  7987. }
  7988. else if(VoltageRange == VoltageRange_3)
  7989. {
  7990. tmp_psize = FLASH_PSIZE_WORD;
  7991. 802522e: 2902 cmp r1, #2
  7992. 8025230: bf14 ite ne
  7993. 8025232: f44f 7540 movne.w r5, #768 ; 0x300
  7994. 8025236: f44f 7500 moveq.w r5, #512 ; 0x200
  7995. 802523a: e003 b.n 8025244 <FLASH_EraseSector+0x20>
  7996. assert_param(IS_FLASH_SECTOR(FLASH_Sector));
  7997. assert_param(IS_VOLTAGERANGE(VoltageRange));
  7998. if(VoltageRange == VoltageRange_1)
  7999. {
  8000. tmp_psize = FLASH_PSIZE_BYTE;
  8001. 802523c: 460d mov r5, r1
  8002. 802523e: e001 b.n 8025244 <FLASH_EraseSector+0x20>
  8003. }
  8004. else if(VoltageRange == VoltageRange_2)
  8005. {
  8006. tmp_psize = FLASH_PSIZE_HALF_WORD;
  8007. 8025240: f44f 7580 mov.w r5, #256 ; 0x100
  8008. else
  8009. {
  8010. tmp_psize = FLASH_PSIZE_DOUBLE_WORD;
  8011. }
  8012. /* Wait for last operation to be completed */
  8013. status = FLASH_WaitForLastOperation();
  8014. 8025244: f7ff ffa4 bl 8025190 <FLASH_WaitForLastOperation>
  8015. if(status == FLASH_COMPLETE)
  8016. 8025248: 2808 cmp r0, #8
  8017. 802524a: d11e bne.n 802528a <FLASH_EraseSector+0x66>
  8018. {
  8019. /* if the previous operation is completed, proceed to erase the sector */
  8020. FLASH->CR &= CR_PSIZE_MASK;
  8021. 802524c: 4c0f ldr r4, [pc, #60] ; (802528c <FLASH_EraseSector+0x68>)
  8022. 802524e: 6923 ldr r3, [r4, #16]
  8023. 8025250: f423 7340 bic.w r3, r3, #768 ; 0x300
  8024. 8025254: 6123 str r3, [r4, #16]
  8025. FLASH->CR |= tmp_psize;
  8026. 8025256: 6921 ldr r1, [r4, #16]
  8027. 8025258: 430d orrs r5, r1
  8028. 802525a: 6125 str r5, [r4, #16]
  8029. FLASH->CR &= SECTOR_MASK;
  8030. 802525c: 6923 ldr r3, [r4, #16]
  8031. 802525e: f023 03f8 bic.w r3, r3, #248 ; 0xf8
  8032. 8025262: 6123 str r3, [r4, #16]
  8033. FLASH->CR |= FLASH_CR_SER | FLASH_Sector;
  8034. 8025264: 6923 ldr r3, [r4, #16]
  8035. 8025266: f043 0302 orr.w r3, r3, #2
  8036. 802526a: 431e orrs r6, r3
  8037. 802526c: 6126 str r6, [r4, #16]
  8038. FLASH->CR |= FLASH_CR_STRT;
  8039. 802526e: 6923 ldr r3, [r4, #16]
  8040. 8025270: f443 3380 orr.w r3, r3, #65536 ; 0x10000
  8041. 8025274: 6123 str r3, [r4, #16]
  8042. /* Wait for last operation to be completed */
  8043. status = FLASH_WaitForLastOperation();
  8044. 8025276: f7ff ff8b bl 8025190 <FLASH_WaitForLastOperation>
  8045. /* if the erase operation is completed, disable the SER Bit */
  8046. FLASH->CR &= (~FLASH_CR_SER);
  8047. 802527a: 6923 ldr r3, [r4, #16]
  8048. 802527c: f023 0302 bic.w r3, r3, #2
  8049. 8025280: 6123 str r3, [r4, #16]
  8050. FLASH->CR &= SECTOR_MASK;
  8051. 8025282: 6923 ldr r3, [r4, #16]
  8052. 8025284: f023 03f8 bic.w r3, r3, #248 ; 0xf8
  8053. 8025288: 6123 str r3, [r4, #16]
  8054. }
  8055. /* Return the Erase Status */
  8056. return status;
  8057. }
  8058. 802528a: bd70 pop {r4, r5, r6, pc}
  8059. 802528c: 40023c00 .word 0x40023c00
  8060. 08025290 <GPIO_DeInit>:
  8061. * @note By default, The GPIO pins are configured in input floating mode (except JTAG pins).
  8062. * @param GPIOx: where x can be (A..I) to select the GPIO peripheral.
  8063. * @retval None
  8064. */
  8065. void GPIO_DeInit(GPIO_TypeDef* GPIOx)
  8066. {
  8067. 8025290: b508 push {r3, lr}
  8068. /* Check the parameters */
  8069. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8070. if (GPIOx == GPIOA)
  8071. 8025292: 4b2c ldr r3, [pc, #176] ; (8025344 <GPIO_DeInit+0xb4>)
  8072. 8025294: 4298 cmp r0, r3
  8073. 8025296: d105 bne.n 80252a4 <GPIO_DeInit+0x14>
  8074. {
  8075. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  8076. 8025298: 2001 movs r0, #1
  8077. 802529a: 4601 mov r1, r0
  8078. 802529c: f000 f968 bl 8025570 <RCC_AHB1PeriphResetCmd>
  8079. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, DISABLE);
  8080. 80252a0: 2001 movs r0, #1
  8081. 80252a2: e048 b.n 8025336 <GPIO_DeInit+0xa6>
  8082. }
  8083. else if (GPIOx == GPIOB)
  8084. 80252a4: 4b28 ldr r3, [pc, #160] ; (8025348 <GPIO_DeInit+0xb8>)
  8085. 80252a6: 4298 cmp r0, r3
  8086. 80252a8: d105 bne.n 80252b6 <GPIO_DeInit+0x26>
  8087. {
  8088. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  8089. 80252aa: 2002 movs r0, #2
  8090. 80252ac: 2101 movs r1, #1
  8091. 80252ae: f000 f95f bl 8025570 <RCC_AHB1PeriphResetCmd>
  8092. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, DISABLE);
  8093. 80252b2: 2002 movs r0, #2
  8094. 80252b4: e03f b.n 8025336 <GPIO_DeInit+0xa6>
  8095. }
  8096. else if (GPIOx == GPIOC)
  8097. 80252b6: 4b25 ldr r3, [pc, #148] ; (802534c <GPIO_DeInit+0xbc>)
  8098. 80252b8: 4298 cmp r0, r3
  8099. 80252ba: d105 bne.n 80252c8 <GPIO_DeInit+0x38>
  8100. {
  8101. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  8102. 80252bc: 2004 movs r0, #4
  8103. 80252be: 2101 movs r1, #1
  8104. 80252c0: f000 f956 bl 8025570 <RCC_AHB1PeriphResetCmd>
  8105. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, DISABLE);
  8106. 80252c4: 2004 movs r0, #4
  8107. 80252c6: e036 b.n 8025336 <GPIO_DeInit+0xa6>
  8108. }
  8109. else if (GPIOx == GPIOD)
  8110. 80252c8: 4b21 ldr r3, [pc, #132] ; (8025350 <GPIO_DeInit+0xc0>)
  8111. 80252ca: 4298 cmp r0, r3
  8112. 80252cc: d105 bne.n 80252da <GPIO_DeInit+0x4a>
  8113. {
  8114. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  8115. 80252ce: 2008 movs r0, #8
  8116. 80252d0: 2101 movs r1, #1
  8117. 80252d2: f000 f94d bl 8025570 <RCC_AHB1PeriphResetCmd>
  8118. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOD, DISABLE);
  8119. 80252d6: 2008 movs r0, #8
  8120. 80252d8: e02d b.n 8025336 <GPIO_DeInit+0xa6>
  8121. }
  8122. else if (GPIOx == GPIOE)
  8123. 80252da: 4b1e ldr r3, [pc, #120] ; (8025354 <GPIO_DeInit+0xc4>)
  8124. 80252dc: 4298 cmp r0, r3
  8125. 80252de: d105 bne.n 80252ec <GPIO_DeInit+0x5c>
  8126. {
  8127. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  8128. 80252e0: 2010 movs r0, #16
  8129. 80252e2: 2101 movs r1, #1
  8130. 80252e4: f000 f944 bl 8025570 <RCC_AHB1PeriphResetCmd>
  8131. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOE, DISABLE);
  8132. 80252e8: 2010 movs r0, #16
  8133. 80252ea: e024 b.n 8025336 <GPIO_DeInit+0xa6>
  8134. }
  8135. else if (GPIOx == GPIOF)
  8136. 80252ec: 4b1a ldr r3, [pc, #104] ; (8025358 <GPIO_DeInit+0xc8>)
  8137. 80252ee: 4298 cmp r0, r3
  8138. 80252f0: d105 bne.n 80252fe <GPIO_DeInit+0x6e>
  8139. {
  8140. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOF, ENABLE);
  8141. 80252f2: 2020 movs r0, #32
  8142. 80252f4: 2101 movs r1, #1
  8143. 80252f6: f000 f93b bl 8025570 <RCC_AHB1PeriphResetCmd>
  8144. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOF, DISABLE);
  8145. 80252fa: 2020 movs r0, #32
  8146. 80252fc: e01b b.n 8025336 <GPIO_DeInit+0xa6>
  8147. }
  8148. else if (GPIOx == GPIOG)
  8149. 80252fe: 4b17 ldr r3, [pc, #92] ; (802535c <GPIO_DeInit+0xcc>)
  8150. 8025300: 4298 cmp r0, r3
  8151. 8025302: d105 bne.n 8025310 <GPIO_DeInit+0x80>
  8152. {
  8153. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOG, ENABLE);
  8154. 8025304: 2040 movs r0, #64 ; 0x40
  8155. 8025306: 2101 movs r1, #1
  8156. 8025308: f000 f932 bl 8025570 <RCC_AHB1PeriphResetCmd>
  8157. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOG, DISABLE);
  8158. 802530c: 2040 movs r0, #64 ; 0x40
  8159. 802530e: e012 b.n 8025336 <GPIO_DeInit+0xa6>
  8160. }
  8161. else if (GPIOx == GPIOH)
  8162. 8025310: 4b13 ldr r3, [pc, #76] ; (8025360 <GPIO_DeInit+0xd0>)
  8163. 8025312: 4298 cmp r0, r3
  8164. 8025314: d105 bne.n 8025322 <GPIO_DeInit+0x92>
  8165. {
  8166. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOH, ENABLE);
  8167. 8025316: 2080 movs r0, #128 ; 0x80
  8168. 8025318: 2101 movs r1, #1
  8169. 802531a: f000 f929 bl 8025570 <RCC_AHB1PeriphResetCmd>
  8170. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOH, DISABLE);
  8171. 802531e: 2080 movs r0, #128 ; 0x80
  8172. 8025320: e009 b.n 8025336 <GPIO_DeInit+0xa6>
  8173. }
  8174. else
  8175. {
  8176. if (GPIOx == GPIOI)
  8177. 8025322: 4b10 ldr r3, [pc, #64] ; (8025364 <GPIO_DeInit+0xd4>)
  8178. 8025324: 4298 cmp r0, r3
  8179. 8025326: d10b bne.n 8025340 <GPIO_DeInit+0xb0>
  8180. {
  8181. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, ENABLE);
  8182. 8025328: f44f 7080 mov.w r0, #256 ; 0x100
  8183. 802532c: 2101 movs r1, #1
  8184. 802532e: f000 f91f bl 8025570 <RCC_AHB1PeriphResetCmd>
  8185. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, DISABLE);
  8186. 8025332: f44f 7080 mov.w r0, #256 ; 0x100
  8187. 8025336: 2100 movs r1, #0
  8188. }
  8189. }
  8190. }
  8191. 8025338: e8bd 4008 ldmia.w sp!, {r3, lr}
  8192. else
  8193. {
  8194. if (GPIOx == GPIOI)
  8195. {
  8196. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, ENABLE);
  8197. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, DISABLE);
  8198. 802533c: f000 b918 b.w 8025570 <RCC_AHB1PeriphResetCmd>
  8199. 8025340: bd08 pop {r3, pc}
  8200. 8025342: bf00 nop
  8201. 8025344: 40020000 .word 0x40020000
  8202. 8025348: 40020400 .word 0x40020400
  8203. 802534c: 40020800 .word 0x40020800
  8204. 8025350: 40020c00 .word 0x40020c00
  8205. 8025354: 40021000 .word 0x40021000
  8206. 8025358: 40021400 .word 0x40021400
  8207. 802535c: 40021800 .word 0x40021800
  8208. 8025360: 40021c00 .word 0x40021c00
  8209. 8025364: 40022000 .word 0x40022000
  8210. 08025368 <GPIO_Init>:
  8211. * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains
  8212. * the configuration information for the specified GPIO peripheral.
  8213. * @retval None
  8214. */
  8215. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
  8216. {
  8217. 8025368: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  8218. /*-- GPIO Mode Configuration --*/
  8219. for (pinpos = 0x00; pinpos < 0x10; pinpos++)
  8220. {
  8221. pos = ((uint32_t)0x01) << pinpos;
  8222. /* Get the port pins position */
  8223. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8224. 802536c: 680f ldr r7, [r1, #0]
  8225. assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
  8226. assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd));
  8227. /* -------------------------Configure the port pins---------------- */
  8228. /*-- GPIO Mode Configuration --*/
  8229. for (pinpos = 0x00; pinpos < 0x10; pinpos++)
  8230. 802536e: 2300 movs r3, #0
  8231. {
  8232. pos = ((uint32_t)0x01) << pinpos;
  8233. 8025370: f04f 0c01 mov.w ip, #1
  8234. /* Get the port pins position */
  8235. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8236. if (currentpin == pos)
  8237. {
  8238. GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
  8239. 8025374: f04f 0803 mov.w r8, #3
  8240. /* -------------------------Configure the port pins---------------- */
  8241. /*-- GPIO Mode Configuration --*/
  8242. for (pinpos = 0x00; pinpos < 0x10; pinpos++)
  8243. {
  8244. pos = ((uint32_t)0x01) << pinpos;
  8245. 8025378: fa0c f203 lsl.w r2, ip, r3
  8246. /* Get the port pins position */
  8247. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8248. 802537c: ea02 0507 and.w r5, r2, r7
  8249. if (currentpin == pos)
  8250. 8025380: 4295 cmp r5, r2
  8251. 8025382: d131 bne.n 80253e8 <GPIO_Init+0x80>
  8252. * @param GPIOx: where x can be (A..I) to select the GPIO peripheral.
  8253. * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains
  8254. * the configuration information for the specified GPIO peripheral.
  8255. * @retval None
  8256. */
  8257. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
  8258. 8025384: 005a lsls r2, r3, #1
  8259. /* Get the port pins position */
  8260. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8261. if (currentpin == pos)
  8262. {
  8263. GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
  8264. 8025386: 6806 ldr r6, [r0, #0]
  8265. 8025388: fa08 f402 lsl.w r4, r8, r2
  8266. 802538c: 43e4 mvns r4, r4
  8267. 802538e: 4026 ands r6, r4
  8268. 8025390: 6006 str r6, [r0, #0]
  8269. GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2));
  8270. 8025392: 790e ldrb r6, [r1, #4]
  8271. 8025394: f8d0 9000 ldr.w r9, [r0]
  8272. 8025398: fa06 fa02 lsl.w sl, r6, r2
  8273. if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))
  8274. 802539c: 3e01 subs r6, #1
  8275. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8276. if (currentpin == pos)
  8277. {
  8278. GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
  8279. GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2));
  8280. 802539e: ea4a 0909 orr.w r9, sl, r9
  8281. if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))
  8282. 80253a2: 2e01 cmp r6, #1
  8283. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
  8284. if (currentpin == pos)
  8285. {
  8286. GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
  8287. GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2));
  8288. 80253a4: f8c0 9000 str.w r9, [r0]
  8289. if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))
  8290. 80253a8: d815 bhi.n 80253d6 <GPIO_Init+0x6e>
  8291. {
  8292. /* Check Speed mode parameters */
  8293. assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
  8294. /* Speed mode configuration */
  8295. GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2));
  8296. 80253aa: 6886 ldr r6, [r0, #8]
  8297. GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * 2));
  8298. 80253ac: f891 9005 ldrb.w r9, [r1, #5]
  8299. {
  8300. /* Check Speed mode parameters */
  8301. assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
  8302. /* Speed mode configuration */
  8303. GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2));
  8304. 80253b0: 4026 ands r6, r4
  8305. 80253b2: 6086 str r6, [r0, #8]
  8306. GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * 2));
  8307. 80253b4: 6886 ldr r6, [r0, #8]
  8308. 80253b6: fa09 f902 lsl.w r9, r9, r2
  8309. 80253ba: ea49 0606 orr.w r6, r9, r6
  8310. 80253be: 6086 str r6, [r0, #8]
  8311. /* Check Output mode parameters */
  8312. assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType));
  8313. /* Output mode configuration*/
  8314. GPIOx->OTYPER &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos)) ;
  8315. 80253c0: 6846 ldr r6, [r0, #4]
  8316. 80253c2: ea26 0505 bic.w r5, r6, r5
  8317. 80253c6: 6045 str r5, [r0, #4]
  8318. GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << ((uint16_t)pinpos));
  8319. 80253c8: 798d ldrb r5, [r1, #6]
  8320. 80253ca: 6846 ldr r6, [r0, #4]
  8321. 80253cc: fa05 f503 lsl.w r5, r5, r3
  8322. temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8323. GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8324. temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  8325. GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
  8326. }
  8327. 80253d0: b2ad uxth r5, r5
  8328. /* Check Output mode parameters */
  8329. assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType));
  8330. /* Output mode configuration*/
  8331. GPIOx->OTYPER &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos)) ;
  8332. GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << ((uint16_t)pinpos));
  8333. 80253d2: 4335 orrs r5, r6
  8334. 80253d4: 6045 str r5, [r0, #4]
  8335. }
  8336. /* Pull-up Pull down resistor configuration*/
  8337. GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * 2));
  8338. 80253d6: 68c5 ldr r5, [r0, #12]
  8339. 80253d8: 402c ands r4, r5
  8340. 80253da: 60c4 str r4, [r0, #12]
  8341. GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (pinpos * 2));
  8342. 80253dc: 79cd ldrb r5, [r1, #7]
  8343. 80253de: 68c4 ldr r4, [r0, #12]
  8344. 80253e0: fa05 f202 lsl.w r2, r5, r2
  8345. 80253e4: 4322 orrs r2, r4
  8346. 80253e6: 60c2 str r2, [r0, #12]
  8347. assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
  8348. assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd));
  8349. /* -------------------------Configure the port pins---------------- */
  8350. /*-- GPIO Mode Configuration --*/
  8351. for (pinpos = 0x00; pinpos < 0x10; pinpos++)
  8352. 80253e8: 3301 adds r3, #1
  8353. 80253ea: 2b10 cmp r3, #16
  8354. 80253ec: d1c4 bne.n 8025378 <GPIO_Init+0x10>
  8355. /* Pull-up Pull down resistor configuration*/
  8356. GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * 2));
  8357. GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (pinpos * 2));
  8358. }
  8359. }
  8360. }
  8361. 80253ee: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  8362. 080253f2 <GPIO_SetBits>:
  8363. {
  8364. /* Check the parameters */
  8365. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8366. assert_param(IS_GPIO_PIN(GPIO_Pin));
  8367. GPIOx->BSRRL = GPIO_Pin;
  8368. 80253f2: 8301 strh r1, [r0, #24]
  8369. 80253f4: 4770 bx lr
  8370. 080253f6 <GPIO_ResetBits>:
  8371. {
  8372. /* Check the parameters */
  8373. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8374. assert_param(IS_GPIO_PIN(GPIO_Pin));
  8375. GPIOx->BSRRH = GPIO_Pin;
  8376. 80253f6: 8341 strh r1, [r0, #26]
  8377. 80253f8: 4770 bx lr
  8378. 080253fa <GPIO_PinAFConfig>:
  8379. /* Check the parameters */
  8380. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8381. assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  8382. assert_param(IS_GPIO_AF(GPIO_AF));
  8383. temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8384. 80253fa: f001 0307 and.w r3, r1, #7
  8385. GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8386. 80253fe: 08c9 lsrs r1, r1, #3
  8387. 8025400: 3108 adds r1, #8
  8388. * @arg GPIO_AF_DCMI: Connect DCMI pins to AF13
  8389. * @arg GPIO_AF_EVENTOUT: Connect EVENTOUT pins to AF15
  8390. * @retval None
  8391. */
  8392. void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
  8393. {
  8394. 8025402: b530 push {r4, r5, lr}
  8395. /* Check the parameters */
  8396. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8397. assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  8398. assert_param(IS_GPIO_AF(GPIO_AF));
  8399. temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8400. 8025404: 009b lsls r3, r3, #2
  8401. GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8402. 8025406: f850 5021 ldr.w r5, [r0, r1, lsl #2]
  8403. 802540a: 240f movs r4, #15
  8404. 802540c: fa04 f403 lsl.w r4, r4, r3
  8405. 8025410: ea25 0404 bic.w r4, r5, r4
  8406. 8025414: f840 4021 str.w r4, [r0, r1, lsl #2]
  8407. temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  8408. 8025418: f850 4021 ldr.w r4, [r0, r1, lsl #2]
  8409. /* Check the parameters */
  8410. assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  8411. assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  8412. assert_param(IS_GPIO_AF(GPIO_AF));
  8413. temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8414. 802541c: fa02 f203 lsl.w r2, r2, r3
  8415. GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  8416. temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  8417. 8025420: 4314 orrs r4, r2
  8418. GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
  8419. 8025422: f840 4021 str.w r4, [r0, r1, lsl #2]
  8420. 8025426: bd30 pop {r4, r5, pc}
  8421. 08025428 <PWR_BackupAccessCmd>:
  8422. void PWR_BackupAccessCmd(FunctionalState NewState)
  8423. {
  8424. /* Check the parameters */
  8425. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8426. *(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState;
  8427. 8025428: 4b01 ldr r3, [pc, #4] ; (8025430 <PWR_BackupAccessCmd+0x8>)
  8428. 802542a: 6018 str r0, [r3, #0]
  8429. 802542c: 4770 bx lr
  8430. 802542e: bf00 nop
  8431. 8025430: 420e0020 .word 0x420e0020
  8432. 08025434 <RCC_LSEConfig>:
  8433. /* Check the parameters */
  8434. assert_param(IS_RCC_LSE(RCC_LSE));
  8435. /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/
  8436. /* Reset LSEON bit */
  8437. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  8438. 8025434: 4b06 ldr r3, [pc, #24] ; (8025450 <RCC_LSEConfig+0x1c>)
  8439. 8025436: 2200 movs r2, #0
  8440. /* Reset LSEBYP bit */
  8441. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  8442. /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */
  8443. switch (RCC_LSE)
  8444. 8025438: 2801 cmp r0, #1
  8445. /* Check the parameters */
  8446. assert_param(IS_RCC_LSE(RCC_LSE));
  8447. /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/
  8448. /* Reset LSEON bit */
  8449. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  8450. 802543a: 701a strb r2, [r3, #0]
  8451. /* Reset LSEBYP bit */
  8452. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  8453. 802543c: 701a strb r2, [r3, #0]
  8454. /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */
  8455. switch (RCC_LSE)
  8456. 802543e: d002 beq.n 8025446 <RCC_LSEConfig+0x12>
  8457. 8025440: 2804 cmp r0, #4
  8458. 8025442: d104 bne.n 802544e <RCC_LSEConfig+0x1a>
  8459. 8025444: e001 b.n 802544a <RCC_LSEConfig+0x16>
  8460. {
  8461. case RCC_LSE_ON:
  8462. /* Set LSEON bit */
  8463. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_ON;
  8464. 8025446: 7018 strb r0, [r3, #0]
  8465. break;
  8466. 8025448: 4770 bx lr
  8467. case RCC_LSE_Bypass:
  8468. /* Set LSEBYP and LSEON bits */
  8469. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON;
  8470. 802544a: 2205 movs r2, #5
  8471. 802544c: 701a strb r2, [r3, #0]
  8472. 802544e: 4770 bx lr
  8473. 8025450: 40023870 .word 0x40023870
  8474. 08025454 <RCC_LSICmd>:
  8475. void RCC_LSICmd(FunctionalState NewState)
  8476. {
  8477. /* Check the parameters */
  8478. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8479. *(__IO uint32_t *) CSR_LSION_BB = (uint32_t)NewState;
  8480. 8025454: 4b01 ldr r3, [pc, #4] ; (802545c <RCC_LSICmd+0x8>)
  8481. 8025456: 6018 str r0, [r3, #0]
  8482. 8025458: 4770 bx lr
  8483. 802545a: bf00 nop
  8484. 802545c: 42470e80 .word 0x42470e80
  8485. 08025460 <RCC_GetClocksFreq>:
  8486. void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
  8487. {
  8488. uint32_t tmp = 0, presc = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
  8489. /* Get SYSCLK source -------------------------------------------------------*/
  8490. tmp = RCC->CFGR & RCC_CFGR_SWS;
  8491. 8025460: 4b1e ldr r3, [pc, #120] ; (80254dc <RCC_GetClocksFreq+0x7c>)
  8492. 8025462: 689a ldr r2, [r3, #8]
  8493. 8025464: f002 020c and.w r2, r2, #12
  8494. switch (tmp)
  8495. 8025468: 2a04 cmp r2, #4
  8496. * configuration based on this function will be incorrect.
  8497. *
  8498. * @retval None
  8499. */
  8500. void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
  8501. {
  8502. 802546a: b510 push {r4, lr}
  8503. uint32_t tmp = 0, presc = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
  8504. /* Get SYSCLK source -------------------------------------------------------*/
  8505. tmp = RCC->CFGR & RCC_CFGR_SWS;
  8506. switch (tmp)
  8507. 802546c: d003 beq.n 8025476 <RCC_GetClocksFreq+0x16>
  8508. 802546e: 2a08 cmp r2, #8
  8509. 8025470: d003 beq.n 802547a <RCC_GetClocksFreq+0x1a>
  8510. 8025472: 4b1b ldr r3, [pc, #108] ; (80254e0 <RCC_GetClocksFreq+0x80>)
  8511. 8025474: e018 b.n 80254a8 <RCC_GetClocksFreq+0x48>
  8512. {
  8513. case 0x00: /* HSI used as system clock source */
  8514. RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
  8515. break;
  8516. case 0x04: /* HSE used as system clock source */
  8517. RCC_Clocks->SYSCLK_Frequency = HSE_VALUE;
  8518. 8025476: 4b1b ldr r3, [pc, #108] ; (80254e4 <RCC_GetClocksFreq+0x84>)
  8519. 8025478: e016 b.n 80254a8 <RCC_GetClocksFreq+0x48>
  8520. case 0x08: /* PLL used as system clock source */
  8521. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  8522. SYSCLK = PLL_VCO / PLLP
  8523. */
  8524. pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
  8525. 802547a: 6859 ldr r1, [r3, #4]
  8526. pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
  8527. 802547c: 685a ldr r2, [r3, #4]
  8528. if (pllsource != 0)
  8529. 802547e: f411 0f80 tst.w r1, #4194304 ; 0x400000
  8530. {
  8531. /* HSE used as PLL clock source */
  8532. pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8533. 8025482: 6859 ldr r1, [r3, #4]
  8534. 8025484: bf14 ite ne
  8535. 8025486: 4b17 ldrne r3, [pc, #92] ; (80254e4 <RCC_GetClocksFreq+0x84>)
  8536. }
  8537. else
  8538. {
  8539. /* HSI used as PLL clock source */
  8540. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8541. 8025488: 4b15 ldreq r3, [pc, #84] ; (80254e0 <RCC_GetClocksFreq+0x80>)
  8542. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  8543. SYSCLK = PLL_VCO / PLLP
  8544. */
  8545. pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
  8546. pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
  8547. 802548a: f002 023f and.w r2, r2, #63 ; 0x3f
  8548. pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8549. }
  8550. else
  8551. {
  8552. /* HSI used as PLL clock source */
  8553. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8554. 802548e: fbb3 f3f2 udiv r3, r3, r2
  8555. }
  8556. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
  8557. 8025492: 4a12 ldr r2, [pc, #72] ; (80254dc <RCC_GetClocksFreq+0x7c>)
  8558. 8025494: 6852 ldr r2, [r2, #4]
  8559. 8025496: f3c2 4201 ubfx r2, r2, #16, #2
  8560. pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
  8561. if (pllsource != 0)
  8562. {
  8563. /* HSE used as PLL clock source */
  8564. pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8565. 802549a: f3c1 1188 ubfx r1, r1, #6, #9
  8566. {
  8567. /* HSI used as PLL clock source */
  8568. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8569. }
  8570. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
  8571. 802549e: 3201 adds r2, #1
  8572. pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8573. }
  8574. else
  8575. {
  8576. /* HSI used as PLL clock source */
  8577. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8578. 80254a0: 434b muls r3, r1
  8579. }
  8580. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
  8581. 80254a2: 0052 lsls r2, r2, #1
  8582. RCC_Clocks->SYSCLK_Frequency = pllvco/pllp;
  8583. 80254a4: fbb3 f3f2 udiv r3, r3, r2
  8584. break;
  8585. }
  8586. /* Compute HCLK, PCLK1 and PCLK2 clocks frequencies ------------------------*/
  8587. /* Get HCLK prescaler */
  8588. tmp = RCC->CFGR & RCC_CFGR_HPRE;
  8589. 80254a8: 490c ldr r1, [pc, #48] ; (80254dc <RCC_GetClocksFreq+0x7c>)
  8590. /* HSI used as PLL clock source */
  8591. pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  8592. }
  8593. pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
  8594. RCC_Clocks->SYSCLK_Frequency = pllvco/pllp;
  8595. 80254aa: 6003 str r3, [r0, #0]
  8596. break;
  8597. }
  8598. /* Compute HCLK, PCLK1 and PCLK2 clocks frequencies ------------------------*/
  8599. /* Get HCLK prescaler */
  8600. tmp = RCC->CFGR & RCC_CFGR_HPRE;
  8601. 80254ac: 688b ldr r3, [r1, #8]
  8602. tmp = tmp >> 4;
  8603. presc = APBAHBPrescTable[tmp];
  8604. 80254ae: 4a0e ldr r2, [pc, #56] ; (80254e8 <RCC_GetClocksFreq+0x88>)
  8605. }
  8606. /* Compute HCLK, PCLK1 and PCLK2 clocks frequencies ------------------------*/
  8607. /* Get HCLK prescaler */
  8608. tmp = RCC->CFGR & RCC_CFGR_HPRE;
  8609. tmp = tmp >> 4;
  8610. 80254b0: f3c3 1303 ubfx r3, r3, #4, #4
  8611. presc = APBAHBPrescTable[tmp];
  8612. 80254b4: 5cd4 ldrb r4, [r2, r3]
  8613. /* HCLK clock frequency */
  8614. RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;
  8615. 80254b6: 6803 ldr r3, [r0, #0]
  8616. 80254b8: fa23 f304 lsr.w r3, r3, r4
  8617. 80254bc: 6043 str r3, [r0, #4]
  8618. /* Get PCLK1 prescaler */
  8619. tmp = RCC->CFGR & RCC_CFGR_PPRE1;
  8620. 80254be: 688c ldr r4, [r1, #8]
  8621. tmp = tmp >> 10;
  8622. 80254c0: f3c4 2482 ubfx r4, r4, #10, #3
  8623. presc = APBAHBPrescTable[tmp];
  8624. 80254c4: 5d14 ldrb r4, [r2, r4]
  8625. /* PCLK1 clock frequency */
  8626. RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
  8627. 80254c6: fa23 f404 lsr.w r4, r3, r4
  8628. 80254ca: 6084 str r4, [r0, #8]
  8629. /* Get PCLK2 prescaler */
  8630. tmp = RCC->CFGR & RCC_CFGR_PPRE2;
  8631. 80254cc: 6889 ldr r1, [r1, #8]
  8632. tmp = tmp >> 13;
  8633. 80254ce: f3c1 3142 ubfx r1, r1, #13, #3
  8634. presc = APBAHBPrescTable[tmp];
  8635. 80254d2: 5c52 ldrb r2, [r2, r1]
  8636. /* PCLK2 clock frequency */
  8637. RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
  8638. 80254d4: fa23 f302 lsr.w r3, r3, r2
  8639. 80254d8: 60c3 str r3, [r0, #12]
  8640. 80254da: bd10 pop {r4, pc}
  8641. 80254dc: 40023800 .word 0x40023800
  8642. 80254e0: 00f42400 .word 0x00f42400
  8643. 80254e4: 017d7840 .word 0x017d7840
  8644. 80254e8: 200005ac .word 0x200005ac
  8645. 080254ec <RCC_RTCCLKConfig>:
  8646. uint32_t tmpreg = 0;
  8647. /* Check the parameters */
  8648. assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource));
  8649. if ((RCC_RTCCLKSource & 0x00000300) == 0x00000300)
  8650. 80254ec: f400 7340 and.w r3, r0, #768 ; 0x300
  8651. 80254f0: f5b3 7f40 cmp.w r3, #768 ; 0x300
  8652. 80254f4: 4b08 ldr r3, [pc, #32] ; (8025518 <RCC_RTCCLKConfig+0x2c>)
  8653. 80254f6: d108 bne.n 802550a <RCC_RTCCLKConfig+0x1e>
  8654. { /* If HSE is selected as RTC clock source, configure HSE division factor for RTC clock */
  8655. tmpreg = RCC->CFGR;
  8656. 80254f8: 6899 ldr r1, [r3, #8]
  8657. /* Clear RTCPRE[4:0] bits */
  8658. tmpreg &= ~RCC_CFGR_RTCPRE;
  8659. /* Configure HSE division factor for RTC clock */
  8660. tmpreg |= (RCC_RTCCLKSource & 0xFFFFCFF);
  8661. 80254fa: f020 4270 bic.w r2, r0, #4026531840 ; 0xf0000000
  8662. if ((RCC_RTCCLKSource & 0x00000300) == 0x00000300)
  8663. { /* If HSE is selected as RTC clock source, configure HSE division factor for RTC clock */
  8664. tmpreg = RCC->CFGR;
  8665. /* Clear RTCPRE[4:0] bits */
  8666. tmpreg &= ~RCC_CFGR_RTCPRE;
  8667. 80254fe: f421 11f8 bic.w r1, r1, #2031616 ; 0x1f0000
  8668. /* Configure HSE division factor for RTC clock */
  8669. tmpreg |= (RCC_RTCCLKSource & 0xFFFFCFF);
  8670. 8025502: f422 7240 bic.w r2, r2, #768 ; 0x300
  8671. 8025506: 430a orrs r2, r1
  8672. /* Store the new value */
  8673. RCC->CFGR = tmpreg;
  8674. 8025508: 609a str r2, [r3, #8]
  8675. }
  8676. /* Select the RTC clock source */
  8677. RCC->BDCR |= (RCC_RTCCLKSource & 0x00000FFF);
  8678. 802550a: 6f1a ldr r2, [r3, #112] ; 0x70
  8679. 802550c: 0500 lsls r0, r0, #20
  8680. 802550e: ea42 5010 orr.w r0, r2, r0, lsr #20
  8681. 8025512: 6718 str r0, [r3, #112] ; 0x70
  8682. 8025514: 4770 bx lr
  8683. 8025516: bf00 nop
  8684. 8025518: 40023800 .word 0x40023800
  8685. 0802551c <RCC_RTCCLKCmd>:
  8686. void RCC_RTCCLKCmd(FunctionalState NewState)
  8687. {
  8688. /* Check the parameters */
  8689. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8690. *(__IO uint32_t *) BDCR_RTCEN_BB = (uint32_t)NewState;
  8691. 802551c: 4b01 ldr r3, [pc, #4] ; (8025524 <RCC_RTCCLKCmd+0x8>)
  8692. 802551e: 6018 str r0, [r3, #0]
  8693. 8025520: 4770 bx lr
  8694. 8025522: bf00 nop
  8695. 8025524: 42470e3c .word 0x42470e3c
  8696. 08025528 <RCC_AHB1PeriphClockCmd>:
  8697. * @param NewState: new state of the specified peripheral clock.
  8698. * This parameter can be: ENABLE or DISABLE.
  8699. * @retval None
  8700. */
  8701. void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
  8702. {
  8703. 8025528: 4b04 ldr r3, [pc, #16] ; (802553c <RCC_AHB1PeriphClockCmd+0x14>)
  8704. assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));
  8705. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8706. if (NewState != DISABLE)
  8707. {
  8708. RCC->AHB1ENR |= RCC_AHB1Periph;
  8709. 802552a: 6b1a ldr r2, [r3, #48] ; 0x30
  8710. {
  8711. /* Check the parameters */
  8712. assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));
  8713. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8714. if (NewState != DISABLE)
  8715. 802552c: b109 cbz r1, 8025532 <RCC_AHB1PeriphClockCmd+0xa>
  8716. {
  8717. RCC->AHB1ENR |= RCC_AHB1Periph;
  8718. 802552e: 4310 orrs r0, r2
  8719. 8025530: e001 b.n 8025536 <RCC_AHB1PeriphClockCmd+0xe>
  8720. }
  8721. else
  8722. {
  8723. RCC->AHB1ENR &= ~RCC_AHB1Periph;
  8724. 8025532: ea22 0000 bic.w r0, r2, r0
  8725. 8025536: 6318 str r0, [r3, #48] ; 0x30
  8726. 8025538: 4770 bx lr
  8727. 802553a: bf00 nop
  8728. 802553c: 40023800 .word 0x40023800
  8729. 08025540 <RCC_APB1PeriphClockCmd>:
  8730. * @param NewState: new state of the specified peripheral clock.
  8731. * This parameter can be: ENABLE or DISABLE.
  8732. * @retval None
  8733. */
  8734. void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
  8735. {
  8736. 8025540: 4b04 ldr r3, [pc, #16] ; (8025554 <RCC_APB1PeriphClockCmd+0x14>)
  8737. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  8738. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8739. if (NewState != DISABLE)
  8740. {
  8741. RCC->APB1ENR |= RCC_APB1Periph;
  8742. 8025542: 6c1a ldr r2, [r3, #64] ; 0x40
  8743. {
  8744. /* Check the parameters */
  8745. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  8746. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8747. if (NewState != DISABLE)
  8748. 8025544: b109 cbz r1, 802554a <RCC_APB1PeriphClockCmd+0xa>
  8749. {
  8750. RCC->APB1ENR |= RCC_APB1Periph;
  8751. 8025546: 4310 orrs r0, r2
  8752. 8025548: e001 b.n 802554e <RCC_APB1PeriphClockCmd+0xe>
  8753. }
  8754. else
  8755. {
  8756. RCC->APB1ENR &= ~RCC_APB1Periph;
  8757. 802554a: ea22 0000 bic.w r0, r2, r0
  8758. 802554e: 6418 str r0, [r3, #64] ; 0x40
  8759. 8025550: 4770 bx lr
  8760. 8025552: bf00 nop
  8761. 8025554: 40023800 .word 0x40023800
  8762. 08025558 <RCC_APB2PeriphClockCmd>:
  8763. * @param NewState: new state of the specified peripheral clock.
  8764. * This parameter can be: ENABLE or DISABLE.
  8765. * @retval None
  8766. */
  8767. void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  8768. {
  8769. 8025558: 4b04 ldr r3, [pc, #16] ; (802556c <RCC_APB2PeriphClockCmd+0x14>)
  8770. assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
  8771. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8772. if (NewState != DISABLE)
  8773. {
  8774. RCC->APB2ENR |= RCC_APB2Periph;
  8775. 802555a: 6c5a ldr r2, [r3, #68] ; 0x44
  8776. {
  8777. /* Check the parameters */
  8778. assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
  8779. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8780. if (NewState != DISABLE)
  8781. 802555c: b109 cbz r1, 8025562 <RCC_APB2PeriphClockCmd+0xa>
  8782. {
  8783. RCC->APB2ENR |= RCC_APB2Periph;
  8784. 802555e: 4310 orrs r0, r2
  8785. 8025560: e001 b.n 8025566 <RCC_APB2PeriphClockCmd+0xe>
  8786. }
  8787. else
  8788. {
  8789. RCC->APB2ENR &= ~RCC_APB2Periph;
  8790. 8025562: ea22 0000 bic.w r0, r2, r0
  8791. 8025566: 6458 str r0, [r3, #68] ; 0x44
  8792. 8025568: 4770 bx lr
  8793. 802556a: bf00 nop
  8794. 802556c: 40023800 .word 0x40023800
  8795. 08025570 <RCC_AHB1PeriphResetCmd>:
  8796. * @param NewState: new state of the specified peripheral reset.
  8797. * This parameter can be: ENABLE or DISABLE.
  8798. * @retval None
  8799. */
  8800. void RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
  8801. {
  8802. 8025570: 4b04 ldr r3, [pc, #16] ; (8025584 <RCC_AHB1PeriphResetCmd+0x14>)
  8803. assert_param(IS_RCC_AHB1_RESET_PERIPH(RCC_AHB1Periph));
  8804. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8805. if (NewState != DISABLE)
  8806. {
  8807. RCC->AHB1RSTR |= RCC_AHB1Periph;
  8808. 8025572: 691a ldr r2, [r3, #16]
  8809. {
  8810. /* Check the parameters */
  8811. assert_param(IS_RCC_AHB1_RESET_PERIPH(RCC_AHB1Periph));
  8812. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8813. if (NewState != DISABLE)
  8814. 8025574: b109 cbz r1, 802557a <RCC_AHB1PeriphResetCmd+0xa>
  8815. {
  8816. RCC->AHB1RSTR |= RCC_AHB1Periph;
  8817. 8025576: 4310 orrs r0, r2
  8818. 8025578: e001 b.n 802557e <RCC_AHB1PeriphResetCmd+0xe>
  8819. }
  8820. else
  8821. {
  8822. RCC->AHB1RSTR &= ~RCC_AHB1Periph;
  8823. 802557a: ea22 0000 bic.w r0, r2, r0
  8824. 802557e: 6118 str r0, [r3, #16]
  8825. 8025580: 4770 bx lr
  8826. 8025582: bf00 nop
  8827. 8025584: 40023800 .word 0x40023800
  8828. 08025588 <RCC_APB1PeriphResetCmd>:
  8829. * @param NewState: new state of the specified peripheral reset.
  8830. * This parameter can be: ENABLE or DISABLE.
  8831. * @retval None
  8832. */
  8833. void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
  8834. {
  8835. 8025588: 4b04 ldr r3, [pc, #16] ; (802559c <RCC_APB1PeriphResetCmd+0x14>)
  8836. /* Check the parameters */
  8837. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  8838. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8839. if (NewState != DISABLE)
  8840. {
  8841. RCC->APB1RSTR |= RCC_APB1Periph;
  8842. 802558a: 6a1a ldr r2, [r3, #32]
  8843. void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
  8844. {
  8845. /* Check the parameters */
  8846. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  8847. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8848. if (NewState != DISABLE)
  8849. 802558c: b109 cbz r1, 8025592 <RCC_APB1PeriphResetCmd+0xa>
  8850. {
  8851. RCC->APB1RSTR |= RCC_APB1Periph;
  8852. 802558e: 4310 orrs r0, r2
  8853. 8025590: e001 b.n 8025596 <RCC_APB1PeriphResetCmd+0xe>
  8854. }
  8855. else
  8856. {
  8857. RCC->APB1RSTR &= ~RCC_APB1Periph;
  8858. 8025592: ea22 0000 bic.w r0, r2, r0
  8859. 8025596: 6218 str r0, [r3, #32]
  8860. 8025598: 4770 bx lr
  8861. 802559a: bf00 nop
  8862. 802559c: 40023800 .word 0x40023800
  8863. 080255a0 <RCC_APB2PeriphResetCmd>:
  8864. * @param NewState: new state of the specified peripheral reset.
  8865. * This parameter can be: ENABLE or DISABLE.
  8866. * @retval None
  8867. */
  8868. void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  8869. {
  8870. 80255a0: 4b04 ldr r3, [pc, #16] ; (80255b4 <RCC_APB2PeriphResetCmd+0x14>)
  8871. /* Check the parameters */
  8872. assert_param(IS_RCC_APB2_RESET_PERIPH(RCC_APB2Periph));
  8873. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8874. if (NewState != DISABLE)
  8875. {
  8876. RCC->APB2RSTR |= RCC_APB2Periph;
  8877. 80255a2: 6a5a ldr r2, [r3, #36] ; 0x24
  8878. void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  8879. {
  8880. /* Check the parameters */
  8881. assert_param(IS_RCC_APB2_RESET_PERIPH(RCC_APB2Periph));
  8882. assert_param(IS_FUNCTIONAL_STATE(NewState));
  8883. if (NewState != DISABLE)
  8884. 80255a4: b109 cbz r1, 80255aa <RCC_APB2PeriphResetCmd+0xa>
  8885. {
  8886. RCC->APB2RSTR |= RCC_APB2Periph;
  8887. 80255a6: 4310 orrs r0, r2
  8888. 80255a8: e001 b.n 80255ae <RCC_APB2PeriphResetCmd+0xe>
  8889. }
  8890. else
  8891. {
  8892. RCC->APB2RSTR &= ~RCC_APB2Periph;
  8893. 80255aa: ea22 0000 bic.w r0, r2, r0
  8894. 80255ae: 6258 str r0, [r3, #36] ; 0x24
  8895. 80255b0: 4770 bx lr
  8896. 80255b2: bf00 nop
  8897. 80255b4: 40023800 .word 0x40023800
  8898. 080255b8 <RCC_GetFlagStatus>:
  8899. /* Check the parameters */
  8900. assert_param(IS_RCC_FLAG(RCC_FLAG));
  8901. /* Get the RCC register index */
  8902. tmp = RCC_FLAG >> 5;
  8903. 80255b8: 0943 lsrs r3, r0, #5
  8904. if (tmp == 1) /* The flag to check is in CR register */
  8905. 80255ba: 2b01 cmp r3, #1
  8906. 80255bc: 4a07 ldr r2, [pc, #28] ; (80255dc <RCC_GetFlagStatus+0x24>)
  8907. 80255be: d101 bne.n 80255c4 <RCC_GetFlagStatus+0xc>
  8908. {
  8909. statusreg = RCC->CR;
  8910. 80255c0: 6813 ldr r3, [r2, #0]
  8911. 80255c2: e003 b.n 80255cc <RCC_GetFlagStatus+0x14>
  8912. }
  8913. else if (tmp == 2) /* The flag to check is in BDCR register */
  8914. 80255c4: 2b02 cmp r3, #2
  8915. {
  8916. statusreg = RCC->BDCR;
  8917. 80255c6: bf0c ite eq
  8918. 80255c8: 6f13 ldreq r3, [r2, #112] ; 0x70
  8919. }
  8920. else /* The flag to check is in CSR register */
  8921. {
  8922. statusreg = RCC->CSR;
  8923. 80255ca: 6f53 ldrne r3, [r2, #116] ; 0x74
  8924. }
  8925. /* Get the flag position */
  8926. tmp = RCC_FLAG & FLAG_MASK;
  8927. if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET)
  8928. 80255cc: f000 001f and.w r0, r0, #31
  8929. 80255d0: fa23 f000 lsr.w r0, r3, r0
  8930. {
  8931. bitstatus = RESET;
  8932. }
  8933. /* Return the flag status */
  8934. return bitstatus;
  8935. }
  8936. 80255d4: f000 0001 and.w r0, r0, #1
  8937. 80255d8: 4770 bx lr
  8938. 80255da: bf00 nop
  8939. 80255dc: 40023800 .word 0x40023800
  8940. 080255e0 <RTC_ByteToBcd2>:
  8941. * @param Value: Byte to be converted.
  8942. * @retval Converted byte
  8943. */
  8944. static uint8_t RTC_ByteToBcd2(uint8_t Value)
  8945. {
  8946. uint8_t bcdhigh = 0;
  8947. 80255e0: 2300 movs r3, #0
  8948. while (Value >= 10)
  8949. 80255e2: e003 b.n 80255ec <RTC_ByteToBcd2+0xc>
  8950. {
  8951. bcdhigh++;
  8952. 80255e4: 3301 adds r3, #1
  8953. Value -= 10;
  8954. 80255e6: 380a subs r0, #10
  8955. {
  8956. uint8_t bcdhigh = 0;
  8957. while (Value >= 10)
  8958. {
  8959. bcdhigh++;
  8960. 80255e8: b2db uxtb r3, r3
  8961. Value -= 10;
  8962. 80255ea: b2c0 uxtb r0, r0
  8963. */
  8964. static uint8_t RTC_ByteToBcd2(uint8_t Value)
  8965. {
  8966. uint8_t bcdhigh = 0;
  8967. while (Value >= 10)
  8968. 80255ec: 2809 cmp r0, #9
  8969. 80255ee: d8f9 bhi.n 80255e4 <RTC_ByteToBcd2+0x4>
  8970. {
  8971. bcdhigh++;
  8972. Value -= 10;
  8973. }
  8974. return ((uint8_t)(bcdhigh << 4) | Value);
  8975. 80255f0: ea40 1003 orr.w r0, r0, r3, lsl #4
  8976. }
  8977. 80255f4: b2c0 uxtb r0, r0
  8978. 80255f6: 4770 bx lr
  8979. 080255f8 <RTC_Bcd2ToByte>:
  8980. * @retval Converted word
  8981. */
  8982. static uint8_t RTC_Bcd2ToByte(uint8_t Value)
  8983. {
  8984. uint8_t tmp = 0;
  8985. tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10;
  8986. 80255f8: 0902 lsrs r2, r0, #4
  8987. return (tmp + (Value & (uint8_t)0x0F));
  8988. 80255fa: f000 030f and.w r3, r0, #15
  8989. 80255fe: 200a movs r0, #10
  8990. 8025600: fb00 3002 mla r0, r0, r2, r3
  8991. }
  8992. 8025604: b2c0 uxtb r0, r0
  8993. 8025606: 4770 bx lr
  8994. 08025608 <RTC_EnterInitMode>:
  8995. * @retval An ErrorStatus enumeration value:
  8996. * - SUCCESS: RTC is in Init mode
  8997. * - ERROR: RTC is not in Init mode
  8998. */
  8999. ErrorStatus RTC_EnterInitMode(void)
  9000. {
  9001. 8025608: b082 sub sp, #8
  9002. __IO uint32_t initcounter = 0x00;
  9003. 802560a: 2300 movs r3, #0
  9004. 802560c: 9301 str r3, [sp, #4]
  9005. ErrorStatus status = ERROR;
  9006. uint32_t initstatus = 0x00;
  9007. /* Check if the Initialization mode is set */
  9008. if ((RTC->ISR & RTC_ISR_INITF) == (uint32_t)RESET)
  9009. 802560e: 4b0d ldr r3, [pc, #52] ; (8025644 <RTC_EnterInitMode+0x3c>)
  9010. 8025610: 68da ldr r2, [r3, #12]
  9011. 8025612: 0650 lsls r0, r2, #25
  9012. 8025614: d413 bmi.n 802563e <RTC_EnterInitMode+0x36>
  9013. {
  9014. /* Set the Initialization mode */
  9015. RTC->ISR = (uint32_t)RTC_INIT_MASK;
  9016. 8025616: f04f 32ff mov.w r2, #4294967295
  9017. 802561a: 60da str r2, [r3, #12]
  9018. /* Wait till RTC is in INIT state and if Time out is reached exit */
  9019. do
  9020. {
  9021. initstatus = RTC->ISR & RTC_ISR_INITF;
  9022. 802561c: 68da ldr r2, [r3, #12]
  9023. initcounter++;
  9024. 802561e: 9901 ldr r1, [sp, #4]
  9025. 8025620: 3101 adds r1, #1
  9026. 8025622: 9101 str r1, [sp, #4]
  9027. } while((initcounter != INITMODE_TIMEOUT) && (initstatus == 0x00));
  9028. 8025624: 9901 ldr r1, [sp, #4]
  9029. 8025626: f5b1 3f80 cmp.w r1, #65536 ; 0x10000
  9030. RTC->ISR = (uint32_t)RTC_INIT_MASK;
  9031. /* Wait till RTC is in INIT state and if Time out is reached exit */
  9032. do
  9033. {
  9034. initstatus = RTC->ISR & RTC_ISR_INITF;
  9035. 802562a: f002 0240 and.w r2, r2, #64 ; 0x40
  9036. initcounter++;
  9037. } while((initcounter != INITMODE_TIMEOUT) && (initstatus == 0x00));
  9038. 802562e: d001 beq.n 8025634 <RTC_EnterInitMode+0x2c>
  9039. 8025630: 2a00 cmp r2, #0
  9040. 8025632: d0f3 beq.n 802561c <RTC_EnterInitMode+0x14>
  9041. if ((RTC->ISR & RTC_ISR_INITF) != RESET)
  9042. 8025634: 4b03 ldr r3, [pc, #12] ; (8025644 <RTC_EnterInitMode+0x3c>)
  9043. 8025636: 68d8 ldr r0, [r3, #12]
  9044. {
  9045. status = SUCCESS;
  9046. 8025638: f3c0 1080 ubfx r0, r0, #6, #1
  9047. 802563c: e000 b.n 8025640 <RTC_EnterInitMode+0x38>
  9048. status = ERROR;
  9049. }
  9050. }
  9051. else
  9052. {
  9053. status = SUCCESS;
  9054. 802563e: 2001 movs r0, #1
  9055. }
  9056. return (status);
  9057. }
  9058. 8025640: b002 add sp, #8
  9059. 8025642: 4770 bx lr
  9060. 8025644: 40002800 .word 0x40002800
  9061. 08025648 <RTC_ExitInitMode>:
  9062. * @retval None
  9063. */
  9064. void RTC_ExitInitMode(void)
  9065. {
  9066. /* Exit Initialization mode */
  9067. RTC->ISR &= (uint32_t)~RTC_ISR_INIT;
  9068. 8025648: 4b02 ldr r3, [pc, #8] ; (8025654 <RTC_ExitInitMode+0xc>)
  9069. 802564a: 68da ldr r2, [r3, #12]
  9070. 802564c: f022 0280 bic.w r2, r2, #128 ; 0x80
  9071. 8025650: 60da str r2, [r3, #12]
  9072. 8025652: 4770 bx lr
  9073. 8025654: 40002800 .word 0x40002800
  9074. 08025658 <RTC_Init>:
  9075. * @retval An ErrorStatus enumeration value:
  9076. * - SUCCESS: RTC registers are initialized
  9077. * - ERROR: RTC registers are not initialized
  9078. */
  9079. ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct)
  9080. {
  9081. 8025658: b538 push {r3, r4, r5, lr}
  9082. assert_param(IS_RTC_HOUR_FORMAT(RTC_InitStruct->RTC_HourFormat));
  9083. assert_param(IS_RTC_ASYNCH_PREDIV(RTC_InitStruct->RTC_AsynchPrediv));
  9084. assert_param(IS_RTC_SYNCH_PREDIV(RTC_InitStruct->RTC_SynchPrediv));
  9085. /* Disable the write protection for RTC registers */
  9086. RTC->WPR = 0xCA;
  9087. 802565a: 4c0f ldr r4, [pc, #60] ; (8025698 <RTC_Init+0x40>)
  9088. 802565c: 23ca movs r3, #202 ; 0xca
  9089. 802565e: 6263 str r3, [r4, #36] ; 0x24
  9090. RTC->WPR = 0x53;
  9091. 8025660: 2353 movs r3, #83 ; 0x53
  9092. 8025662: 6263 str r3, [r4, #36] ; 0x24
  9093. * @retval An ErrorStatus enumeration value:
  9094. * - SUCCESS: RTC registers are initialized
  9095. * - ERROR: RTC registers are not initialized
  9096. */
  9097. ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct)
  9098. {
  9099. 8025664: 4605 mov r5, r0
  9100. /* Disable the write protection for RTC registers */
  9101. RTC->WPR = 0xCA;
  9102. RTC->WPR = 0x53;
  9103. /* Set Initialization mode */
  9104. if (RTC_EnterInitMode() == ERROR)
  9105. 8025666: f7ff ffcf bl 8025608 <RTC_EnterInitMode>
  9106. 802566a: b188 cbz r0, 8025690 <RTC_Init+0x38>
  9107. status = ERROR;
  9108. }
  9109. else
  9110. {
  9111. /* Clear RTC CR FMT Bit */
  9112. RTC->CR &= ((uint32_t)~(RTC_CR_FMT));
  9113. 802566c: 68a3 ldr r3, [r4, #8]
  9114. 802566e: f023 0340 bic.w r3, r3, #64 ; 0x40
  9115. 8025672: 60a3 str r3, [r4, #8]
  9116. /* Set RTC_CR register */
  9117. RTC->CR |= ((uint32_t)(RTC_InitStruct->RTC_HourFormat));
  9118. 8025674: 68a2 ldr r2, [r4, #8]
  9119. 8025676: 682b ldr r3, [r5, #0]
  9120. 8025678: 4313 orrs r3, r2
  9121. 802567a: 60a3 str r3, [r4, #8]
  9122. /* Configure the RTC PRER */
  9123. RTC->PRER = (uint32_t)(RTC_InitStruct->RTC_SynchPrediv);
  9124. 802567c: 68ab ldr r3, [r5, #8]
  9125. 802567e: 6123 str r3, [r4, #16]
  9126. RTC->PRER |= (uint32_t)(RTC_InitStruct->RTC_AsynchPrediv << 16);
  9127. 8025680: 6923 ldr r3, [r4, #16]
  9128. 8025682: 686a ldr r2, [r5, #4]
  9129. 8025684: ea43 4302 orr.w r3, r3, r2, lsl #16
  9130. 8025688: 6123 str r3, [r4, #16]
  9131. /* Exit Initialization mode */
  9132. RTC_ExitInitMode();
  9133. 802568a: f7ff ffdd bl 8025648 <RTC_ExitInitMode>
  9134. status = SUCCESS;
  9135. 802568e: 2001 movs r0, #1
  9136. }
  9137. /* Enable the write protection for RTC registers */
  9138. RTC->WPR = 0xFF;
  9139. 8025690: 4b01 ldr r3, [pc, #4] ; (8025698 <RTC_Init+0x40>)
  9140. 8025692: 22ff movs r2, #255 ; 0xff
  9141. 8025694: 625a str r2, [r3, #36] ; 0x24
  9142. return status;
  9143. }
  9144. 8025696: bd38 pop {r3, r4, r5, pc}
  9145. 8025698: 40002800 .word 0x40002800
  9146. 0802569c <RTC_WaitForSynchro>:
  9147. * @retval An ErrorStatus enumeration value:
  9148. * - SUCCESS: RTC registers are synchronised
  9149. * - ERROR: RTC registers are not synchronised
  9150. */
  9151. ErrorStatus RTC_WaitForSynchro(void)
  9152. {
  9153. 802569c: b082 sub sp, #8
  9154. __IO uint32_t synchrocounter = 0;
  9155. 802569e: 2300 movs r3, #0
  9156. 80256a0: 9301 str r3, [sp, #4]
  9157. ErrorStatus status = ERROR;
  9158. uint32_t synchrostatus = 0x00;
  9159. /* Disable the write protection for RTC registers */
  9160. RTC->WPR = 0xCA;
  9161. 80256a2: 4b0e ldr r3, [pc, #56] ; (80256dc <RTC_WaitForSynchro+0x40>)
  9162. 80256a4: 22ca movs r2, #202 ; 0xca
  9163. 80256a6: 625a str r2, [r3, #36] ; 0x24
  9164. RTC->WPR = 0x53;
  9165. 80256a8: 2253 movs r2, #83 ; 0x53
  9166. 80256aa: 625a str r2, [r3, #36] ; 0x24
  9167. /* Clear RSF flag */
  9168. RTC->ISR &= (uint32_t)RTC_RSF_MASK;
  9169. 80256ac: 68da ldr r2, [r3, #12]
  9170. 80256ae: f022 02a0 bic.w r2, r2, #160 ; 0xa0
  9171. 80256b2: 60da str r2, [r3, #12]
  9172. /* Wait the registers to be synchronised */
  9173. do
  9174. {
  9175. synchrostatus = RTC->ISR & RTC_ISR_RSF;
  9176. 80256b4: 68d9 ldr r1, [r3, #12]
  9177. synchrocounter++;
  9178. 80256b6: 9a01 ldr r2, [sp, #4]
  9179. 80256b8: 3201 adds r2, #1
  9180. 80256ba: 9201 str r2, [sp, #4]
  9181. } while((synchrocounter != SYNCHRO_TIMEOUT) && (synchrostatus == 0x00));
  9182. 80256bc: 9a01 ldr r2, [sp, #4]
  9183. 80256be: f5b2 3f00 cmp.w r2, #131072 ; 0x20000
  9184. RTC->ISR &= (uint32_t)RTC_RSF_MASK;
  9185. /* Wait the registers to be synchronised */
  9186. do
  9187. {
  9188. synchrostatus = RTC->ISR & RTC_ISR_RSF;
  9189. 80256c2: f001 0120 and.w r1, r1, #32
  9190. 80256c6: 4a05 ldr r2, [pc, #20] ; (80256dc <RTC_WaitForSynchro+0x40>)
  9191. synchrocounter++;
  9192. } while((synchrocounter != SYNCHRO_TIMEOUT) && (synchrostatus == 0x00));
  9193. 80256c8: d001 beq.n 80256ce <RTC_WaitForSynchro+0x32>
  9194. 80256ca: 2900 cmp r1, #0
  9195. 80256cc: d0f2 beq.n 80256b4 <RTC_WaitForSynchro+0x18>
  9196. if ((RTC->ISR & RTC_ISR_RSF) != RESET)
  9197. 80256ce: 68d0 ldr r0, [r2, #12]
  9198. {
  9199. status = ERROR;
  9200. }
  9201. /* Enable the write protection for RTC registers */
  9202. RTC->WPR = 0xFF;
  9203. 80256d0: 23ff movs r3, #255 ; 0xff
  9204. 80256d2: 6253 str r3, [r2, #36] ; 0x24
  9205. return (status);
  9206. }
  9207. 80256d4: f3c0 1040 ubfx r0, r0, #5, #1
  9208. 80256d8: b002 add sp, #8
  9209. 80256da: 4770 bx lr
  9210. 80256dc: 40002800 .word 0x40002800
  9211. 080256e0 <RTC_SetTime>:
  9212. * @retval An ErrorStatus enumeration value:
  9213. * - SUCCESS: RTC Time register is configured
  9214. * - ERROR: RTC Time register is not configured
  9215. */
  9216. ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)
  9217. {
  9218. 80256e0: b5f8 push {r3, r4, r5, r6, r7, lr}
  9219. 80256e2: 4b24 ldr r3, [pc, #144] ; (8025774 <RTC_SetTime+0x94>)
  9220. 80256e4: 460c mov r4, r1
  9221. /* Check the parameters */
  9222. assert_param(IS_RTC_FORMAT(RTC_Format));
  9223. if (RTC_Format == RTC_Format_BIN)
  9224. {
  9225. if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET)
  9226. 80256e6: 689b ldr r3, [r3, #8]
  9227. ErrorStatus status = ERROR;
  9228. /* Check the parameters */
  9229. assert_param(IS_RTC_FORMAT(RTC_Format));
  9230. if (RTC_Format == RTC_Format_BIN)
  9231. 80256e8: b920 cbnz r0, 80256f4 <RTC_SetTime+0x14>
  9232. {
  9233. if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET)
  9234. 80256ea: f013 0340 ands.w r3, r3, #64 ; 0x40
  9235. 80256ee: d12e bne.n 802574e <RTC_SetTime+0x6e>
  9236. assert_param(IS_RTC_HOUR12(RTC_TimeStruct->RTC_Hours));
  9237. assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12));
  9238. }
  9239. else
  9240. {
  9241. RTC_TimeStruct->RTC_H12 = 0x00;
  9242. 80256f0: 70cb strb r3, [r1, #3]
  9243. 80256f2: e02c b.n 802574e <RTC_SetTime+0x6e>
  9244. assert_param(IS_RTC_MINUTES(RTC_TimeStruct->RTC_Minutes));
  9245. assert_param(IS_RTC_SECONDS(RTC_TimeStruct->RTC_Seconds));
  9246. }
  9247. else
  9248. {
  9249. if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET)
  9250. 80256f4: f013 0340 ands.w r3, r3, #64 ; 0x40
  9251. 80256f8: d11e bne.n 8025738 <RTC_SetTime+0x58>
  9252. assert_param(IS_RTC_HOUR12(tmpreg));
  9253. assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12));
  9254. }
  9255. else
  9256. {
  9257. RTC_TimeStruct->RTC_H12 = 0x00;
  9258. 80256fa: 70cb strb r3, [r1, #3]
  9259. 80256fc: e01c b.n 8025738 <RTC_SetTime+0x58>
  9260. ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Seconds)) | \
  9261. (((uint32_t)RTC_TimeStruct->RTC_H12) << 16));
  9262. }
  9263. /* Disable the write protection for RTC registers */
  9264. RTC->WPR = 0xCA;
  9265. 80256fe: 4c1d ldr r4, [pc, #116] ; (8025774 <RTC_SetTime+0x94>)
  9266. 8025700: 23ca movs r3, #202 ; 0xca
  9267. 8025702: 6263 str r3, [r4, #36] ; 0x24
  9268. RTC->WPR = 0x53;
  9269. 8025704: 2353 movs r3, #83 ; 0x53
  9270. 8025706: 6263 str r3, [r4, #36] ; 0x24
  9271. /* Set Initialization mode */
  9272. if (RTC_EnterInitMode() == ERROR)
  9273. 8025708: f7ff ff7e bl 8025608 <RTC_EnterInitMode>
  9274. 802570c: b180 cbz r0, 8025730 <RTC_SetTime+0x50>
  9275. status = ERROR;
  9276. }
  9277. else
  9278. {
  9279. /* Set the RTC_TR register */
  9280. RTC->TR = (uint32_t)(tmpreg & RTC_TR_RESERVED_MASK);
  9281. 802570e: f005 357f and.w r5, r5, #2139062143 ; 0x7f7f7f7f
  9282. 8025712: f025 45fe bic.w r5, r5, #2130706432 ; 0x7f000000
  9283. 8025716: 6025 str r5, [r4, #0]
  9284. /* Exit Initialization mode */
  9285. RTC_ExitInitMode();
  9286. 8025718: f7ff ff96 bl 8025648 <RTC_ExitInitMode>
  9287. /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
  9288. if ((RTC->CR & RTC_CR_BYPSHAD) == RESET)
  9289. 802571c: 68a3 ldr r3, [r4, #8]
  9290. 802571e: 0699 lsls r1, r3, #26
  9291. 8025720: d405 bmi.n 802572e <RTC_SetTime+0x4e>
  9292. {
  9293. if (RTC_WaitForSynchro() == ERROR)
  9294. 8025722: f7ff ffbb bl 802569c <RTC_WaitForSynchro>
  9295. RTC->WPR = 0x53;
  9296. /* Set Initialization mode */
  9297. if (RTC_EnterInitMode() == ERROR)
  9298. {
  9299. status = ERROR;
  9300. 8025726: 3000 adds r0, #0
  9301. 8025728: bf18 it ne
  9302. 802572a: 2001 movne r0, #1
  9303. 802572c: e000 b.n 8025730 <RTC_SetTime+0x50>
  9304. status = SUCCESS;
  9305. }
  9306. }
  9307. else
  9308. {
  9309. status = SUCCESS;
  9310. 802572e: 2001 movs r0, #1
  9311. }
  9312. }
  9313. /* Enable the write protection for RTC registers */
  9314. RTC->WPR = 0xFF;
  9315. 8025730: 4b10 ldr r3, [pc, #64] ; (8025774 <RTC_SetTime+0x94>)
  9316. 8025732: 22ff movs r2, #255 ; 0xff
  9317. 8025734: 625a str r2, [r3, #36] ; 0x24
  9318. 8025736: bdf8 pop {r3, r4, r5, r6, r7, pc}
  9319. /* Check the input parameters format */
  9320. if (RTC_Format != RTC_Format_BIN)
  9321. {
  9322. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9323. ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9324. 8025738: 7865 ldrb r5, [r4, #1]
  9325. }
  9326. /* Check the input parameters format */
  9327. if (RTC_Format != RTC_Format_BIN)
  9328. {
  9329. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9330. 802573a: 7823 ldrb r3, [r4, #0]
  9331. ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9332. 802573c: 022d lsls r5, r5, #8
  9333. }
  9334. /* Check the input parameters format */
  9335. if (RTC_Format != RTC_Format_BIN)
  9336. {
  9337. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9338. 802573e: ea45 4503 orr.w r5, r5, r3, lsl #16
  9339. ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9340. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9341. 8025742: 78a3 ldrb r3, [r4, #2]
  9342. /* Check the input parameters format */
  9343. if (RTC_Format != RTC_Format_BIN)
  9344. {
  9345. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9346. ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9347. 8025744: 431d orrs r5, r3
  9348. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9349. ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16));
  9350. 8025746: 78e3 ldrb r3, [r4, #3]
  9351. }
  9352. /* Check the input parameters format */
  9353. if (RTC_Format != RTC_Format_BIN)
  9354. {
  9355. tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \
  9356. 8025748: ea45 4503 orr.w r5, r5, r3, lsl #16
  9357. 802574c: e7d7 b.n 80256fe <RTC_SetTime+0x1e>
  9358. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9359. ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16));
  9360. }
  9361. else
  9362. {
  9363. tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Hours) << 16) | \
  9364. 802574e: 7820 ldrb r0, [r4, #0]
  9365. 8025750: f7ff ff46 bl 80255e0 <RTC_ByteToBcd2>
  9366. 8025754: 4607 mov r7, r0
  9367. ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9368. 8025756: 7860 ldrb r0, [r4, #1]
  9369. 8025758: f7ff ff42 bl 80255e0 <RTC_ByteToBcd2>
  9370. 802575c: 4606 mov r6, r0
  9371. ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Seconds)) | \
  9372. 802575e: 78a0 ldrb r0, [r4, #2]
  9373. 8025760: f7ff ff3e bl 80255e0 <RTC_ByteToBcd2>
  9374. (((uint32_t)RTC_TimeStruct->RTC_H12) << 16));
  9375. 8025764: 78e5 ldrb r5, [r4, #3]
  9376. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9377. ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16));
  9378. }
  9379. else
  9380. {
  9381. tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Hours) << 16) | \
  9382. 8025766: ea40 4005 orr.w r0, r0, r5, lsl #16
  9383. ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Minutes) << 8) | \
  9384. 802576a: ea40 4507 orr.w r5, r0, r7, lsl #16
  9385. ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \
  9386. ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16));
  9387. }
  9388. else
  9389. {
  9390. tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Hours) << 16) | \
  9391. 802576e: ea45 2506 orr.w r5, r5, r6, lsl #8
  9392. 8025772: e7c4 b.n 80256fe <RTC_SetTime+0x1e>
  9393. 8025774: 40002800 .word 0x40002800
  9394. 08025778 <RTC_GetTime>:
  9395. /* Check the parameters */
  9396. assert_param(IS_RTC_FORMAT(RTC_Format));
  9397. /* Get the RTC_TR register */
  9398. tmpreg = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK);
  9399. 8025778: 4b0f ldr r3, [pc, #60] ; (80257b8 <RTC_GetTime+0x40>)
  9400. 802577a: 681b ldr r3, [r3, #0]
  9401. * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure that will
  9402. * contain the returned current time configuration.
  9403. * @retval None
  9404. */
  9405. void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)
  9406. {
  9407. 802577c: b570 push {r4, r5, r6, lr}
  9408. /* Get the RTC_TR register */
  9409. tmpreg = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK);
  9410. /* Fill the structure fields with the read parameters */
  9411. RTC_TimeStruct->RTC_Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16);
  9412. 802577e: f3c3 4205 ubfx r2, r3, #16, #6
  9413. RTC_TimeStruct->RTC_Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8);
  9414. 8025782: f3c3 2606 ubfx r6, r3, #8, #7
  9415. RTC_TimeStruct->RTC_Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU));
  9416. 8025786: f003 057f and.w r5, r3, #127 ; 0x7f
  9417. RTC_TimeStruct->RTC_H12 = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16);
  9418. 802578a: f403 0380 and.w r3, r3, #4194304 ; 0x400000
  9419. 802578e: 0c1b lsrs r3, r3, #16
  9420. * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure that will
  9421. * contain the returned current time configuration.
  9422. * @retval None
  9423. */
  9424. void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)
  9425. {
  9426. 8025790: 460c mov r4, r1
  9427. /* Get the RTC_TR register */
  9428. tmpreg = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK);
  9429. /* Fill the structure fields with the read parameters */
  9430. RTC_TimeStruct->RTC_Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16);
  9431. 8025792: 700a strb r2, [r1, #0]
  9432. RTC_TimeStruct->RTC_Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8);
  9433. 8025794: 704e strb r6, [r1, #1]
  9434. RTC_TimeStruct->RTC_Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU));
  9435. 8025796: 708d strb r5, [r1, #2]
  9436. RTC_TimeStruct->RTC_H12 = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16);
  9437. 8025798: 70cb strb r3, [r1, #3]
  9438. /* Check the input parameters format */
  9439. if (RTC_Format == RTC_Format_BIN)
  9440. 802579a: b958 cbnz r0, 80257b4 <RTC_GetTime+0x3c>
  9441. {
  9442. /* Convert the structure parameters to Binary format */
  9443. RTC_TimeStruct->RTC_Hours = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours);
  9444. 802579c: 4610 mov r0, r2
  9445. 802579e: f7ff ff2b bl 80255f8 <RTC_Bcd2ToByte>
  9446. 80257a2: 7020 strb r0, [r4, #0]
  9447. RTC_TimeStruct->RTC_Minutes = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Minutes);
  9448. 80257a4: 4630 mov r0, r6
  9449. 80257a6: f7ff ff27 bl 80255f8 <RTC_Bcd2ToByte>
  9450. 80257aa: 7060 strb r0, [r4, #1]
  9451. RTC_TimeStruct->RTC_Seconds = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Seconds);
  9452. 80257ac: 4628 mov r0, r5
  9453. 80257ae: f7ff ff23 bl 80255f8 <RTC_Bcd2ToByte>
  9454. 80257b2: 70a0 strb r0, [r4, #2]
  9455. 80257b4: bd70 pop {r4, r5, r6, pc}
  9456. 80257b6: bf00 nop
  9457. 80257b8: 40002800 .word 0x40002800
  9458. 080257bc <RTC_SetDate>:
  9459. * @retval An ErrorStatus enumeration value:
  9460. * - SUCCESS: RTC Date register is configured
  9461. * - ERROR: RTC Date register is not configured
  9462. */
  9463. ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)
  9464. {
  9465. 80257bc: b5f8 push {r3, r4, r5, r6, r7, lr}
  9466. 80257be: 460c mov r4, r1
  9467. 80257c0: 784b ldrb r3, [r1, #1]
  9468. ErrorStatus status = ERROR;
  9469. /* Check the parameters */
  9470. assert_param(IS_RTC_FORMAT(RTC_Format));
  9471. if ((RTC_Format == RTC_Format_BIN) && ((RTC_DateStruct->RTC_Month & 0x10) == 0x10))
  9472. 80257c2: 2800 cmp r0, #0
  9473. 80257c4: d138 bne.n 8025838 <RTC_SetDate+0x7c>
  9474. 80257c6: f003 0210 and.w r2, r3, #16
  9475. 80257ca: b2d2 uxtb r2, r2
  9476. 80257cc: b30a cbz r2, 8025812 <RTC_SetDate+0x56>
  9477. {
  9478. RTC_DateStruct->RTC_Month = (RTC_DateStruct->RTC_Month & (uint32_t)~(0x10)) + 0x0A;
  9479. 80257ce: f023 0310 bic.w r3, r3, #16
  9480. 80257d2: 330a adds r3, #10
  9481. 80257d4: 704b strb r3, [r1, #1]
  9482. 80257d6: e01c b.n 8025812 <RTC_SetDate+0x56>
  9483. ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Date)) | \
  9484. ((uint32_t)RTC_DateStruct->RTC_WeekDay << 13));
  9485. }
  9486. /* Disable the write protection for RTC registers */
  9487. RTC->WPR = 0xCA;
  9488. 80257d8: 4c1c ldr r4, [pc, #112] ; (802584c <RTC_SetDate+0x90>)
  9489. 80257da: 23ca movs r3, #202 ; 0xca
  9490. 80257dc: 6263 str r3, [r4, #36] ; 0x24
  9491. RTC->WPR = 0x53;
  9492. 80257de: 2353 movs r3, #83 ; 0x53
  9493. 80257e0: 6263 str r3, [r4, #36] ; 0x24
  9494. /* Set Initialization mode */
  9495. if (RTC_EnterInitMode() == ERROR)
  9496. 80257e2: f7ff ff11 bl 8025608 <RTC_EnterInitMode>
  9497. 80257e6: b180 cbz r0, 802580a <RTC_SetDate+0x4e>
  9498. status = ERROR;
  9499. }
  9500. else
  9501. {
  9502. /* Set the RTC_DR register */
  9503. RTC->DR = (uint32_t)(tmpreg & RTC_DR_RESERVED_MASK);
  9504. 80257e8: f025 457f bic.w r5, r5, #4278190080 ; 0xff000000
  9505. 80257ec: f025 05c0 bic.w r5, r5, #192 ; 0xc0
  9506. 80257f0: 6065 str r5, [r4, #4]
  9507. /* Exit Initialization mode */
  9508. RTC_ExitInitMode();
  9509. 80257f2: f7ff ff29 bl 8025648 <RTC_ExitInitMode>
  9510. /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
  9511. if ((RTC->CR & RTC_CR_BYPSHAD) == RESET)
  9512. 80257f6: 68a3 ldr r3, [r4, #8]
  9513. 80257f8: 0698 lsls r0, r3, #26
  9514. 80257fa: d405 bmi.n 8025808 <RTC_SetDate+0x4c>
  9515. {
  9516. if (RTC_WaitForSynchro() == ERROR)
  9517. 80257fc: f7ff ff4e bl 802569c <RTC_WaitForSynchro>
  9518. RTC->WPR = 0x53;
  9519. /* Set Initialization mode */
  9520. if (RTC_EnterInitMode() == ERROR)
  9521. {
  9522. status = ERROR;
  9523. 8025800: 3000 adds r0, #0
  9524. 8025802: bf18 it ne
  9525. 8025804: 2001 movne r0, #1
  9526. 8025806: e000 b.n 802580a <RTC_SetDate+0x4e>
  9527. status = SUCCESS;
  9528. }
  9529. }
  9530. else
  9531. {
  9532. status = SUCCESS;
  9533. 8025808: 2001 movs r0, #1
  9534. }
  9535. }
  9536. /* Enable the write protection for RTC registers */
  9537. RTC->WPR = 0xFF;
  9538. 802580a: 4b10 ldr r3, [pc, #64] ; (802584c <RTC_SetDate+0x90>)
  9539. 802580c: 22ff movs r2, #255 ; 0xff
  9540. 802580e: 625a str r2, [r3, #36] ; 0x24
  9541. 8025810: bdf8 pop {r3, r4, r5, r6, r7, pc}
  9542. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  9543. (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13));
  9544. }
  9545. else
  9546. {
  9547. tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Year) << 16) | \
  9548. 8025812: 78e0 ldrb r0, [r4, #3]
  9549. 8025814: f7ff fee4 bl 80255e0 <RTC_ByteToBcd2>
  9550. 8025818: 4607 mov r7, r0
  9551. ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Month) << 8) | \
  9552. 802581a: 7860 ldrb r0, [r4, #1]
  9553. 802581c: f7ff fee0 bl 80255e0 <RTC_ByteToBcd2>
  9554. 8025820: 4606 mov r6, r0
  9555. ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Date)) | \
  9556. 8025822: 78a0 ldrb r0, [r4, #2]
  9557. 8025824: f7ff fedc bl 80255e0 <RTC_ByteToBcd2>
  9558. ((uint32_t)RTC_DateStruct->RTC_WeekDay << 13));
  9559. 8025828: 7825 ldrb r5, [r4, #0]
  9560. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  9561. (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13));
  9562. }
  9563. else
  9564. {
  9565. tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Year) << 16) | \
  9566. 802582a: ea40 3045 orr.w r0, r0, r5, lsl #13
  9567. ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Month) << 8) | \
  9568. 802582e: ea40 4507 orr.w r5, r0, r7, lsl #16
  9569. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  9570. (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13));
  9571. }
  9572. else
  9573. {
  9574. tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Year) << 16) | \
  9575. 8025832: ea45 2506 orr.w r5, r5, r6, lsl #8
  9576. 8025836: e7cf b.n 80257d8 <RTC_SetDate+0x1c>
  9577. assert_param(IS_RTC_WEEKDAY(RTC_DateStruct->RTC_WeekDay));
  9578. /* Check the input parameters format */
  9579. if (RTC_Format != RTC_Format_BIN)
  9580. {
  9581. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  9582. 8025838: 78cd ldrb r5, [r1, #3]
  9583. (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \
  9584. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  9585. 802583a: 788a ldrb r2, [r1, #2]
  9586. /* Check the input parameters format */
  9587. if (RTC_Format != RTC_Format_BIN)
  9588. {
  9589. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  9590. (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \
  9591. 802583c: 021b lsls r3, r3, #8
  9592. assert_param(IS_RTC_WEEKDAY(RTC_DateStruct->RTC_WeekDay));
  9593. /* Check the input parameters format */
  9594. if (RTC_Format != RTC_Format_BIN)
  9595. {
  9596. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  9597. 802583e: ea43 4505 orr.w r5, r3, r5, lsl #16
  9598. (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \
  9599. ((uint32_t)RTC_DateStruct->RTC_Date) | \
  9600. (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13));
  9601. 8025842: 780b ldrb r3, [r1, #0]
  9602. /* Check the input parameters format */
  9603. if (RTC_Format != RTC_Format_BIN)
  9604. {
  9605. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  9606. (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \
  9607. 8025844: 4315 orrs r5, r2
  9608. assert_param(IS_RTC_WEEKDAY(RTC_DateStruct->RTC_WeekDay));
  9609. /* Check the input parameters format */
  9610. if (RTC_Format != RTC_Format_BIN)
  9611. {
  9612. tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \
  9613. 8025846: ea45 3543 orr.w r5, r5, r3, lsl #13
  9614. 802584a: e7c5 b.n 80257d8 <RTC_SetDate+0x1c>
  9615. 802584c: 40002800 .word 0x40002800
  9616. 08025850 <RTC_GetDate>:
  9617. /* Check the parameters */
  9618. assert_param(IS_RTC_FORMAT(RTC_Format));
  9619. /* Get the RTC_TR register */
  9620. tmpreg = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK);
  9621. 8025850: 4b0e ldr r3, [pc, #56] ; (802588c <RTC_GetDate+0x3c>)
  9622. 8025852: 685b ldr r3, [r3, #4]
  9623. * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that will
  9624. * contain the returned current date configuration.
  9625. * @retval None
  9626. */
  9627. void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)
  9628. {
  9629. 8025854: b570 push {r4, r5, r6, lr}
  9630. /* Get the RTC_TR register */
  9631. tmpreg = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK);
  9632. /* Fill the structure fields with the read parameters */
  9633. RTC_DateStruct->RTC_Year = (uint8_t)((tmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16);
  9634. 8025856: f3c3 4207 ubfx r2, r3, #16, #8
  9635. RTC_DateStruct->RTC_Month = (uint8_t)((tmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8);
  9636. 802585a: f3c3 2604 ubfx r6, r3, #8, #5
  9637. RTC_DateStruct->RTC_Date = (uint8_t)(tmpreg & (RTC_DR_DT | RTC_DR_DU));
  9638. 802585e: f003 053f and.w r5, r3, #63 ; 0x3f
  9639. RTC_DateStruct->RTC_WeekDay = (uint8_t)((tmpreg & (RTC_DR_WDU)) >> 13);
  9640. 8025862: f3c3 3342 ubfx r3, r3, #13, #3
  9641. * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that will
  9642. * contain the returned current date configuration.
  9643. * @retval None
  9644. */
  9645. void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)
  9646. {
  9647. 8025866: 460c mov r4, r1
  9648. /* Get the RTC_TR register */
  9649. tmpreg = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK);
  9650. /* Fill the structure fields with the read parameters */
  9651. RTC_DateStruct->RTC_Year = (uint8_t)((tmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16);
  9652. 8025868: 70ca strb r2, [r1, #3]
  9653. RTC_DateStruct->RTC_Month = (uint8_t)((tmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8);
  9654. 802586a: 704e strb r6, [r1, #1]
  9655. RTC_DateStruct->RTC_Date = (uint8_t)(tmpreg & (RTC_DR_DT | RTC_DR_DU));
  9656. 802586c: 708d strb r5, [r1, #2]
  9657. RTC_DateStruct->RTC_WeekDay = (uint8_t)((tmpreg & (RTC_DR_WDU)) >> 13);
  9658. 802586e: 700b strb r3, [r1, #0]
  9659. /* Check the input parameters format */
  9660. if (RTC_Format == RTC_Format_BIN)
  9661. 8025870: b958 cbnz r0, 802588a <RTC_GetDate+0x3a>
  9662. {
  9663. /* Convert the structure parameters to Binary format */
  9664. RTC_DateStruct->RTC_Year = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Year);
  9665. 8025872: 4610 mov r0, r2
  9666. 8025874: f7ff fec0 bl 80255f8 <RTC_Bcd2ToByte>
  9667. 8025878: 70e0 strb r0, [r4, #3]
  9668. RTC_DateStruct->RTC_Month = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Month);
  9669. 802587a: 4630 mov r0, r6
  9670. 802587c: f7ff febc bl 80255f8 <RTC_Bcd2ToByte>
  9671. 8025880: 7060 strb r0, [r4, #1]
  9672. RTC_DateStruct->RTC_Date = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Date);
  9673. 8025882: 4628 mov r0, r5
  9674. 8025884: f7ff feb8 bl 80255f8 <RTC_Bcd2ToByte>
  9675. 8025888: 70a0 strb r0, [r4, #2]
  9676. 802588a: bd70 pop {r4, r5, r6, pc}
  9677. 802588c: 40002800 .word 0x40002800
  9678. 08025890 <RTC_WriteBackupRegister>:
  9679. * specify the register.
  9680. * @param Data: Data to be written in the specified RTC Backup data register.
  9681. * @retval None
  9682. */
  9683. void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data)
  9684. {
  9685. 8025890: b082 sub sp, #8
  9686. __IO uint32_t tmp = 0;
  9687. 8025892: 2300 movs r3, #0
  9688. 8025894: 9301 str r3, [sp, #4]
  9689. /* Check the parameters */
  9690. assert_param(IS_RTC_BKP(RTC_BKP_DR));
  9691. tmp = RTC_BASE + 0x50;
  9692. 8025896: 4b05 ldr r3, [pc, #20] ; (80258ac <RTC_WriteBackupRegister+0x1c>)
  9693. 8025898: 9301 str r3, [sp, #4]
  9694. tmp += (RTC_BKP_DR * 4);
  9695. 802589a: 9b01 ldr r3, [sp, #4]
  9696. 802589c: eb03 0080 add.w r0, r3, r0, lsl #2
  9697. 80258a0: 9001 str r0, [sp, #4]
  9698. /* Write the specified register */
  9699. *(__IO uint32_t *)tmp = (uint32_t)Data;
  9700. 80258a2: 9b01 ldr r3, [sp, #4]
  9701. 80258a4: 6019 str r1, [r3, #0]
  9702. }
  9703. 80258a6: b002 add sp, #8
  9704. 80258a8: 4770 bx lr
  9705. 80258aa: bf00 nop
  9706. 80258ac: 40002850 .word 0x40002850
  9707. 080258b0 <RTC_ReadBackupRegister>:
  9708. * This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to
  9709. * specify the register.
  9710. * @retval None
  9711. */
  9712. uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR)
  9713. {
  9714. 80258b0: b082 sub sp, #8
  9715. __IO uint32_t tmp = 0;
  9716. 80258b2: 2300 movs r3, #0
  9717. 80258b4: 9301 str r3, [sp, #4]
  9718. /* Check the parameters */
  9719. assert_param(IS_RTC_BKP(RTC_BKP_DR));
  9720. tmp = RTC_BASE + 0x50;
  9721. 80258b6: 4b05 ldr r3, [pc, #20] ; (80258cc <RTC_ReadBackupRegister+0x1c>)
  9722. 80258b8: 9301 str r3, [sp, #4]
  9723. tmp += (RTC_BKP_DR * 4);
  9724. 80258ba: 9b01 ldr r3, [sp, #4]
  9725. 80258bc: eb03 0080 add.w r0, r3, r0, lsl #2
  9726. 80258c0: 9001 str r0, [sp, #4]
  9727. /* Read the specified register */
  9728. return (*(__IO uint32_t *)tmp);
  9729. 80258c2: 9b01 ldr r3, [sp, #4]
  9730. 80258c4: 6818 ldr r0, [r3, #0]
  9731. }
  9732. 80258c6: b002 add sp, #8
  9733. 80258c8: 4770 bx lr
  9734. 80258ca: bf00 nop
  9735. 80258cc: 40002850 .word 0x40002850
  9736. 080258d0 <RTC_GetITStatus>:
  9737. /* Check the parameters */
  9738. assert_param(IS_RTC_GET_IT(RTC_IT));
  9739. /* Get the TAMPER Interrupt enable bit and pending bit */
  9740. tmpreg = (uint32_t)(RTC->TAFCR & (RTC_TAFCR_TAMPIE));
  9741. 80258d0: 4b0a ldr r3, [pc, #40] ; (80258fc <RTC_GetITStatus+0x2c>)
  9742. 80258d2: 6c1a ldr r2, [r3, #64] ; 0x40
  9743. * @arg RTC_IT_ALRA: Alarm A interrupt
  9744. * @arg RTC_IT_TAMP1: Tamper 1 event interrupt
  9745. * @retval The new state of RTC_IT (SET or RESET).
  9746. */
  9747. ITStatus RTC_GetITStatus(uint32_t RTC_IT)
  9748. {
  9749. 80258d4: b510 push {r4, lr}
  9750. /* Get the TAMPER Interrupt enable bit and pending bit */
  9751. tmpreg = (uint32_t)(RTC->TAFCR & (RTC_TAFCR_TAMPIE));
  9752. /* Get the Interrupt enable Status */
  9753. enablestatus = (uint32_t)((RTC->CR & RTC_IT) | (tmpreg & (RTC_IT >> 15)));
  9754. 80258d6: 689c ldr r4, [r3, #8]
  9755. /* Get the Interrupt pending bit */
  9756. tmpreg = (uint32_t)((RTC->ISR & (uint32_t)(RTC_IT >> 4)));
  9757. 80258d8: 68d9 ldr r1, [r3, #12]
  9758. /* Check the parameters */
  9759. assert_param(IS_RTC_GET_IT(RTC_IT));
  9760. /* Get the TAMPER Interrupt enable bit and pending bit */
  9761. tmpreg = (uint32_t)(RTC->TAFCR & (RTC_TAFCR_TAMPIE));
  9762. 80258da: f002 0204 and.w r2, r2, #4
  9763. /* Get the Interrupt enable Status */
  9764. enablestatus = (uint32_t)((RTC->CR & RTC_IT) | (tmpreg & (RTC_IT >> 15)));
  9765. 80258de: ea02 32d0 and.w r2, r2, r0, lsr #15
  9766. 80258e2: ea00 0304 and.w r3, r0, r4
  9767. /* Get the Interrupt pending bit */
  9768. tmpreg = (uint32_t)((RTC->ISR & (uint32_t)(RTC_IT >> 4)));
  9769. /* Get the status of the Interrupt */
  9770. if ((enablestatus != (uint32_t)RESET) && ((tmpreg & 0x0000FFFF) != (uint32_t)RESET))
  9771. 80258e6: 4313 orrs r3, r2
  9772. 80258e8: d006 beq.n 80258f8 <RTC_GetITStatus+0x28>
  9773. /* Get the Interrupt enable Status */
  9774. enablestatus = (uint32_t)((RTC->CR & RTC_IT) | (tmpreg & (RTC_IT >> 15)));
  9775. /* Get the Interrupt pending bit */
  9776. tmpreg = (uint32_t)((RTC->ISR & (uint32_t)(RTC_IT >> 4)));
  9777. 80258ea: b28b uxth r3, r1
  9778. /* Get the status of the Interrupt */
  9779. if ((enablestatus != (uint32_t)RESET) && ((tmpreg & 0x0000FFFF) != (uint32_t)RESET))
  9780. 80258ec: ea13 1310 ands.w r3, r3, r0, lsr #4
  9781. {
  9782. bitstatus = SET;
  9783. 80258f0: bf0c ite eq
  9784. 80258f2: 2000 moveq r0, #0
  9785. 80258f4: 2001 movne r0, #1
  9786. 80258f6: bd10 pop {r4, pc}
  9787. }
  9788. else
  9789. {
  9790. bitstatus = RESET;
  9791. 80258f8: 4618 mov r0, r3
  9792. }
  9793. return bitstatus;
  9794. }
  9795. 80258fa: bd10 pop {r4, pc}
  9796. 80258fc: 40002800 .word 0x40002800
  9797. 08025900 <RTC_ClearITPendingBit>:
  9798. /* Get the RTC_ISR Interrupt pending bits mask */
  9799. tmpreg = (uint32_t)(RTC_IT >> 4);
  9800. /* Clear the interrupt pending bits in the RTC_ISR register */
  9801. RTC->ISR = (uint32_t)((uint32_t)(~((tmpreg | RTC_ISR_INIT)& 0x0000FFFF) | (uint32_t)(RTC->ISR & RTC_ISR_INIT)));
  9802. 8025900: 4b05 ldr r3, [pc, #20] ; (8025918 <RTC_ClearITPendingBit+0x18>)
  9803. 8025902: 68da ldr r2, [r3, #12]
  9804. 8025904: f3c0 100f ubfx r0, r0, #4, #16
  9805. 8025908: f040 0080 orr.w r0, r0, #128 ; 0x80
  9806. 802590c: f002 0280 and.w r2, r2, #128 ; 0x80
  9807. 8025910: ea62 0200 orn r2, r2, r0
  9808. 8025914: 60da str r2, [r3, #12]
  9809. 8025916: 4770 bx lr
  9810. 8025918: 40002800 .word 0x40002800
  9811. 0802591c <SYSCFG_ETH_MediaInterfaceConfig>:
  9812. */
  9813. void SYSCFG_ETH_MediaInterfaceConfig(uint32_t SYSCFG_ETH_MediaInterface)
  9814. {
  9815. assert_param(IS_SYSCFG_ETH_MEDIA_INTERFACE(SYSCFG_ETH_MediaInterface));
  9816. /* Configure MII_RMII selection bit */
  9817. *(__IO uint32_t *) PMC_MII_RMII_SEL_BB = SYSCFG_ETH_MediaInterface;
  9818. 802591c: 4b01 ldr r3, [pc, #4] ; (8025924 <SYSCFG_ETH_MediaInterfaceConfig+0x8>)
  9819. 802591e: 6018 str r0, [r3, #0]
  9820. 8025920: 4770 bx lr
  9821. 8025922: bf00 nop
  9822. 8025924: 422700dc .word 0x422700dc
  9823. 08025928 <TIM_ClearITPendingBit>:
  9824. {
  9825. /* Check the parameters */
  9826. assert_param(IS_TIM_ALL_PERIPH(TIMx));
  9827. /* Clear the IT pending Bit */
  9828. TIMx->SR = (uint16_t)~TIM_IT;
  9829. 8025928: 43c9 mvns r1, r1
  9830. 802592a: 8201 strh r1, [r0, #16]
  9831. 802592c: 4770 bx lr
  9832. 802592e: 0000 movs r0, r0
  9833. 08025930 <USART_DeInit>:
  9834. * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or
  9835. * UART peripheral.
  9836. * @retval None
  9837. */
  9838. void USART_DeInit(USART_TypeDef* USARTx)
  9839. {
  9840. 8025930: b508 push {r3, lr}
  9841. /* Check the parameters */
  9842. assert_param(IS_USART_ALL_PERIPH(USARTx));
  9843. if (USARTx == USART1)
  9844. 8025932: 4b23 ldr r3, [pc, #140] ; (80259c0 <USART_DeInit+0x90>)
  9845. 8025934: 4298 cmp r0, r3
  9846. 8025936: d105 bne.n 8025944 <USART_DeInit+0x14>
  9847. {
  9848. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);
  9849. 8025938: 2010 movs r0, #16
  9850. 802593a: 2101 movs r1, #1
  9851. 802593c: f7ff fe30 bl 80255a0 <RCC_APB2PeriphResetCmd>
  9852. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);
  9853. 8025940: 2010 movs r0, #16
  9854. 8025942: e037 b.n 80259b4 <USART_DeInit+0x84>
  9855. }
  9856. else if (USARTx == USART2)
  9857. 8025944: 4b1f ldr r3, [pc, #124] ; (80259c4 <USART_DeInit+0x94>)
  9858. 8025946: 4298 cmp r0, r3
  9859. 8025948: d107 bne.n 802595a <USART_DeInit+0x2a>
  9860. {
  9861. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE);
  9862. 802594a: f44f 3000 mov.w r0, #131072 ; 0x20000
  9863. 802594e: 2101 movs r1, #1
  9864. 8025950: f7ff fe1a bl 8025588 <RCC_APB1PeriphResetCmd>
  9865. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);
  9866. 8025954: f44f 3000 mov.w r0, #131072 ; 0x20000
  9867. 8025958: e009 b.n 802596e <USART_DeInit+0x3e>
  9868. }
  9869. else if (USARTx == USART3)
  9870. 802595a: 4b1b ldr r3, [pc, #108] ; (80259c8 <USART_DeInit+0x98>)
  9871. 802595c: 4298 cmp r0, r3
  9872. 802595e: d10b bne.n 8025978 <USART_DeInit+0x48>
  9873. {
  9874. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);
  9875. 8025960: f44f 2080 mov.w r0, #262144 ; 0x40000
  9876. 8025964: 2101 movs r1, #1
  9877. 8025966: f7ff fe0f bl 8025588 <RCC_APB1PeriphResetCmd>
  9878. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);
  9879. 802596a: f44f 2080 mov.w r0, #262144 ; 0x40000
  9880. 802596e: 2100 movs r1, #0
  9881. {
  9882. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, ENABLE);
  9883. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, DISABLE);
  9884. }
  9885. }
  9886. }
  9887. 8025970: e8bd 4008 ldmia.w sp!, {r3, lr}
  9888. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);
  9889. }
  9890. else if (USARTx == USART3)
  9891. {
  9892. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);
  9893. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);
  9894. 8025974: f7ff be08 b.w 8025588 <RCC_APB1PeriphResetCmd>
  9895. }
  9896. else if (USARTx == UART4)
  9897. 8025978: 4b14 ldr r3, [pc, #80] ; (80259cc <USART_DeInit+0x9c>)
  9898. 802597a: 4298 cmp r0, r3
  9899. 802597c: d107 bne.n 802598e <USART_DeInit+0x5e>
  9900. {
  9901. RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE);
  9902. 802597e: f44f 2000 mov.w r0, #524288 ; 0x80000
  9903. 8025982: 2101 movs r1, #1
  9904. 8025984: f7ff fe00 bl 8025588 <RCC_APB1PeriphResetCmd>
  9905. RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE);
  9906. 8025988: f44f 2000 mov.w r0, #524288 ; 0x80000
  9907. 802598c: e7ef b.n 802596e <USART_DeInit+0x3e>
  9908. }
  9909. else if (USARTx == UART5)
  9910. 802598e: 4b10 ldr r3, [pc, #64] ; (80259d0 <USART_DeInit+0xa0>)
  9911. 8025990: 4298 cmp r0, r3
  9912. 8025992: d107 bne.n 80259a4 <USART_DeInit+0x74>
  9913. {
  9914. RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE);
  9915. 8025994: f44f 1080 mov.w r0, #1048576 ; 0x100000
  9916. 8025998: 2101 movs r1, #1
  9917. 802599a: f7ff fdf5 bl 8025588 <RCC_APB1PeriphResetCmd>
  9918. RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE);
  9919. 802599e: f44f 1080 mov.w r0, #1048576 ; 0x100000
  9920. 80259a2: e7e4 b.n 802596e <USART_DeInit+0x3e>
  9921. }
  9922. else
  9923. {
  9924. if (USARTx == USART6)
  9925. 80259a4: 4b0b ldr r3, [pc, #44] ; (80259d4 <USART_DeInit+0xa4>)
  9926. 80259a6: 4298 cmp r0, r3
  9927. 80259a8: d109 bne.n 80259be <USART_DeInit+0x8e>
  9928. {
  9929. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, ENABLE);
  9930. 80259aa: 2020 movs r0, #32
  9931. 80259ac: 2101 movs r1, #1
  9932. 80259ae: f7ff fdf7 bl 80255a0 <RCC_APB2PeriphResetCmd>
  9933. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, DISABLE);
  9934. 80259b2: 2020 movs r0, #32
  9935. 80259b4: 2100 movs r1, #0
  9936. }
  9937. }
  9938. }
  9939. 80259b6: e8bd 4008 ldmia.w sp!, {r3, lr}
  9940. else
  9941. {
  9942. if (USARTx == USART6)
  9943. {
  9944. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, ENABLE);
  9945. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, DISABLE);
  9946. 80259ba: f7ff bdf1 b.w 80255a0 <RCC_APB2PeriphResetCmd>
  9947. 80259be: bd08 pop {r3, pc}
  9948. 80259c0: 40011000 .word 0x40011000
  9949. 80259c4: 40004400 .word 0x40004400
  9950. 80259c8: 40004800 .word 0x40004800
  9951. 80259cc: 40004c00 .word 0x40004c00
  9952. 80259d0: 40005000 .word 0x40005000
  9953. 80259d4: 40011400 .word 0x40011400
  9954. 080259d8 <USART_Init>:
  9955. {
  9956. assert_param(IS_USART_1236_PERIPH(USARTx));
  9957. }
  9958. /*---------------------------- USART CR2 Configuration -----------------------*/
  9959. tmpreg = USARTx->CR2;
  9960. 80259d8: 8a03 ldrh r3, [r0, #16]
  9961. /* Clear STOP[13:12] bits */
  9962. tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP);
  9963. /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit :
  9964. Set STOP[13:12] bits according to USART_StopBits value */
  9965. tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;
  9966. 80259da: 88ca ldrh r2, [r1, #6]
  9967. {
  9968. assert_param(IS_USART_1236_PERIPH(USARTx));
  9969. }
  9970. /*---------------------------- USART CR2 Configuration -----------------------*/
  9971. tmpreg = USARTx->CR2;
  9972. 80259dc: b29b uxth r3, r3
  9973. /* Clear STOP[13:12] bits */
  9974. tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP);
  9975. 80259de: f423 5340 bic.w r3, r3, #12288 ; 0x3000
  9976. * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains
  9977. * the configuration information for the specified USART peripheral.
  9978. * @retval None
  9979. */
  9980. void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
  9981. {
  9982. 80259e2: b530 push {r4, r5, lr}
  9983. /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit :
  9984. Set STOP[13:12] bits according to USART_StopBits value */
  9985. tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;
  9986. /* Write to USART CR2 */
  9987. USARTx->CR2 = (uint16_t)tmpreg;
  9988. 80259e4: 4313 orrs r3, r2
  9989. * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains
  9990. * the configuration information for the specified USART peripheral.
  9991. * @retval None
  9992. */
  9993. void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
  9994. {
  9995. 80259e6: 460d mov r5, r1
  9996. /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit :
  9997. Set STOP[13:12] bits according to USART_StopBits value */
  9998. tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;
  9999. /* Write to USART CR2 */
  10000. USARTx->CR2 = (uint16_t)tmpreg;
  10001. 80259e8: 8203 strh r3, [r0, #16]
  10002. /*---------------------------- USART CR1 Configuration -----------------------*/
  10003. tmpreg = USARTx->CR1;
  10004. 80259ea: 8983 ldrh r3, [r0, #12]
  10005. /* Configure the USART Word Length, Parity and mode:
  10006. Set the M bits according to USART_WordLength value
  10007. Set PCE and PS bits according to USART_Parity value
  10008. Set TE and RE bits according to USART_Mode value */
  10009. tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
  10010. 80259ec: 8909 ldrh r1, [r1, #8]
  10011. 80259ee: 88aa ldrh r2, [r5, #4]
  10012. /*---------------------------- USART CR1 Configuration -----------------------*/
  10013. tmpreg = USARTx->CR1;
  10014. /* Clear M, PCE, PS, TE and RE bits */
  10015. tmpreg &= (uint32_t)~((uint32_t)CR1_CLEAR_MASK);
  10016. 80259f0: f423 53b0 bic.w r3, r3, #5632 ; 0x1600
  10017. /* Configure the USART Word Length, Parity and mode:
  10018. Set the M bits according to USART_WordLength value
  10019. Set PCE and PS bits according to USART_Parity value
  10020. Set TE and RE bits according to USART_Mode value */
  10021. tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
  10022. 80259f4: 430a orrs r2, r1
  10023. 80259f6: 8969 ldrh r1, [r5, #10]
  10024. /*---------------------------- USART CR1 Configuration -----------------------*/
  10025. tmpreg = USARTx->CR1;
  10026. /* Clear M, PCE, PS, TE and RE bits */
  10027. tmpreg &= (uint32_t)~((uint32_t)CR1_CLEAR_MASK);
  10028. 80259f8: f023 030c bic.w r3, r3, #12
  10029. 80259fc: 041b lsls r3, r3, #16
  10030. /* Configure the USART Word Length, Parity and mode:
  10031. Set the M bits according to USART_WordLength value
  10032. Set PCE and PS bits according to USART_Parity value
  10033. Set TE and RE bits according to USART_Mode value */
  10034. tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
  10035. 80259fe: 430a orrs r2, r1
  10036. /*---------------------------- USART CR1 Configuration -----------------------*/
  10037. tmpreg = USARTx->CR1;
  10038. /* Clear M, PCE, PS, TE and RE bits */
  10039. tmpreg &= (uint32_t)~((uint32_t)CR1_CLEAR_MASK);
  10040. 8025a00: 0c1b lsrs r3, r3, #16
  10041. /* Configure the USART Word Length, Parity and mode:
  10042. Set the M bits according to USART_WordLength value
  10043. Set PCE and PS bits according to USART_Parity value
  10044. Set TE and RE bits according to USART_Mode value */
  10045. tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
  10046. 8025a02: b292 uxth r2, r2
  10047. USART_InitStruct->USART_Mode;
  10048. /* Write to USART CR1 */
  10049. USARTx->CR1 = (uint16_t)tmpreg;
  10050. 8025a04: 4313 orrs r3, r2
  10051. 8025a06: 8183 strh r3, [r0, #12]
  10052. /*---------------------------- USART CR3 Configuration -----------------------*/
  10053. tmpreg = USARTx->CR3;
  10054. 8025a08: 8a83 ldrh r3, [r0, #20]
  10055. /* Clear CTSE and RTSE bits */
  10056. tmpreg &= (uint32_t)~((uint32_t)CR3_CLEAR_MASK);
  10057. /* Configure the USART HFC :
  10058. Set CTSE and RTSE bits according to USART_HardwareFlowControl value */
  10059. tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
  10060. 8025a0a: 89aa ldrh r2, [r5, #12]
  10061. /* Write to USART CR1 */
  10062. USARTx->CR1 = (uint16_t)tmpreg;
  10063. /*---------------------------- USART CR3 Configuration -----------------------*/
  10064. tmpreg = USARTx->CR3;
  10065. 8025a0c: b29b uxth r3, r3
  10066. /* Clear CTSE and RTSE bits */
  10067. tmpreg &= (uint32_t)~((uint32_t)CR3_CLEAR_MASK);
  10068. 8025a0e: f423 7340 bic.w r3, r3, #768 ; 0x300
  10069. /* Configure the USART HFC :
  10070. Set CTSE and RTSE bits according to USART_HardwareFlowControl value */
  10071. tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
  10072. /* Write to USART CR3 */
  10073. USARTx->CR3 = (uint16_t)tmpreg;
  10074. 8025a12: 4313 orrs r3, r2
  10075. * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains
  10076. * the configuration information for the specified USART peripheral.
  10077. * @retval None
  10078. */
  10079. void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
  10080. {
  10081. 8025a14: b085 sub sp, #20
  10082. /* Configure the USART HFC :
  10083. Set CTSE and RTSE bits according to USART_HardwareFlowControl value */
  10084. tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
  10085. /* Write to USART CR3 */
  10086. USARTx->CR3 = (uint16_t)tmpreg;
  10087. 8025a16: 8283 strh r3, [r0, #20]
  10088. * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains
  10089. * the configuration information for the specified USART peripheral.
  10090. * @retval None
  10091. */
  10092. void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
  10093. {
  10094. 8025a18: 4604 mov r4, r0
  10095. /* Write to USART CR3 */
  10096. USARTx->CR3 = (uint16_t)tmpreg;
  10097. /*---------------------------- USART BRR Configuration -----------------------*/
  10098. /* Configure the USART Baud Rate */
  10099. RCC_GetClocksFreq(&RCC_ClocksStatus);
  10100. 8025a1a: 4668 mov r0, sp
  10101. 8025a1c: f7ff fd20 bl 8025460 <RCC_GetClocksFreq>
  10102. if ((USARTx == USART1) || (USARTx == USART6))
  10103. 8025a20: 4b19 ldr r3, [pc, #100] ; (8025a88 <USART_Init+0xb0>)
  10104. 8025a22: 429c cmp r4, r3
  10105. 8025a24: d003 beq.n 8025a2e <USART_Init+0x56>
  10106. 8025a26: f503 6380 add.w r3, r3, #1024 ; 0x400
  10107. 8025a2a: 429c cmp r4, r3
  10108. 8025a2c: d101 bne.n 8025a32 <USART_Init+0x5a>
  10109. {
  10110. apbclock = RCC_ClocksStatus.PCLK2_Frequency;
  10111. 8025a2e: 9b03 ldr r3, [sp, #12]
  10112. 8025a30: e000 b.n 8025a34 <USART_Init+0x5c>
  10113. }
  10114. else
  10115. {
  10116. apbclock = RCC_ClocksStatus.PCLK1_Frequency;
  10117. 8025a32: 9b02 ldr r3, [sp, #8]
  10118. }
  10119. /* Determine the integer part */
  10120. if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
  10121. 8025a34: 89a2 ldrh r2, [r4, #12]
  10122. 8025a36: b212 sxth r2, r2
  10123. 8025a38: 2a00 cmp r2, #0
  10124. 8025a3a: f04f 0119 mov.w r1, #25
  10125. 8025a3e: 682a ldr r2, [r5, #0]
  10126. {
  10127. /* Integer part computing in case Oversampling mode is 8 Samples */
  10128. integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));
  10129. 8025a40: fb01 f103 mul.w r1, r1, r3
  10130. {
  10131. apbclock = RCC_ClocksStatus.PCLK1_Frequency;
  10132. }
  10133. /* Determine the integer part */
  10134. if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
  10135. 8025a44: da01 bge.n 8025a4a <USART_Init+0x72>
  10136. {
  10137. /* Integer part computing in case Oversampling mode is 8 Samples */
  10138. integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));
  10139. 8025a46: 0052 lsls r2, r2, #1
  10140. 8025a48: e000 b.n 8025a4c <USART_Init+0x74>
  10141. }
  10142. else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */
  10143. {
  10144. /* Integer part computing in case Oversampling mode is 16 Samples */
  10145. integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));
  10146. 8025a4a: 0092 lsls r2, r2, #2
  10147. }
  10148. tmpreg = (integerdivider / 100) << 4;
  10149. 8025a4c: 2364 movs r3, #100 ; 0x64
  10150. integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));
  10151. }
  10152. else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */
  10153. {
  10154. /* Integer part computing in case Oversampling mode is 16 Samples */
  10155. integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));
  10156. 8025a4e: fbb1 f1f2 udiv r1, r1, r2
  10157. }
  10158. tmpreg = (integerdivider / 100) << 4;
  10159. 8025a52: fbb1 f2f3 udiv r2, r1, r3
  10160. 8025a56: 0112 lsls r2, r2, #4
  10161. /* Determine the fractional part */
  10162. fractionaldivider = integerdivider - (100 * (tmpreg >> 4));
  10163. 8025a58: 0910 lsrs r0, r2, #4
  10164. 8025a5a: fb03 1110 mls r1, r3, r0, r1
  10165. /* Implement the fractional part in the register */
  10166. if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
  10167. 8025a5e: 89a0 ldrh r0, [r4, #12]
  10168. 8025a60: b200 sxth r0, r0
  10169. 8025a62: 2800 cmp r0, #0
  10170. 8025a64: da06 bge.n 8025a74 <USART_Init+0x9c>
  10171. {
  10172. tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07);
  10173. 8025a66: 00c9 lsls r1, r1, #3
  10174. 8025a68: 3132 adds r1, #50 ; 0x32
  10175. 8025a6a: fbb1 f3f3 udiv r3, r1, r3
  10176. 8025a6e: f003 0307 and.w r3, r3, #7
  10177. 8025a72: e005 b.n 8025a80 <USART_Init+0xa8>
  10178. }
  10179. else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */
  10180. {
  10181. tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
  10182. 8025a74: 0109 lsls r1, r1, #4
  10183. 8025a76: 3132 adds r1, #50 ; 0x32
  10184. 8025a78: fbb1 f3f3 udiv r3, r1, r3
  10185. 8025a7c: f003 030f and.w r3, r3, #15
  10186. 8025a80: 431a orrs r2, r3
  10187. }
  10188. /* Write to USART BRR register */
  10189. USARTx->BRR = (uint16_t)tmpreg;
  10190. 8025a82: 8122 strh r2, [r4, #8]
  10191. }
  10192. 8025a84: b005 add sp, #20
  10193. 8025a86: bd30 pop {r4, r5, pc}
  10194. 8025a88: 40011000 .word 0x40011000
  10195. 08025a8c <USART_Cmd>:
  10196. assert_param(IS_FUNCTIONAL_STATE(NewState));
  10197. if (NewState != DISABLE)
  10198. {
  10199. /* Enable the selected USART by setting the UE bit in the CR1 register */
  10200. USARTx->CR1 |= USART_CR1_UE;
  10201. 8025a8c: 8983 ldrh r3, [r0, #12]
  10202. {
  10203. /* Check the parameters */
  10204. assert_param(IS_USART_ALL_PERIPH(USARTx));
  10205. assert_param(IS_FUNCTIONAL_STATE(NewState));
  10206. if (NewState != DISABLE)
  10207. 8025a8e: b119 cbz r1, 8025a98 <USART_Cmd+0xc>
  10208. {
  10209. /* Enable the selected USART by setting the UE bit in the CR1 register */
  10210. USARTx->CR1 |= USART_CR1_UE;
  10211. 8025a90: b29b uxth r3, r3
  10212. 8025a92: f443 5300 orr.w r3, r3, #8192 ; 0x2000
  10213. 8025a96: e003 b.n 8025aa0 <USART_Cmd+0x14>
  10214. }
  10215. else
  10216. {
  10217. /* Disable the selected USART by clearing the UE bit in the CR1 register */
  10218. USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_UE);
  10219. 8025a98: f423 5300 bic.w r3, r3, #8192 ; 0x2000
  10220. 8025a9c: 041b lsls r3, r3, #16
  10221. 8025a9e: 0c1b lsrs r3, r3, #16
  10222. 8025aa0: 8183 strh r3, [r0, #12]
  10223. 8025aa2: 4770 bx lr
  10224. 08025aa4 <USART_ITConfig>:
  10225. }
  10226. usartxbase = (uint32_t)USARTx;
  10227. /* Get the USART register index */
  10228. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10229. 8025aa4: f3c1 1342 ubfx r3, r1, #5, #3
  10230. * @param NewState: new state of the specified USARTx interrupts.
  10231. * This parameter can be: ENABLE or DISABLE.
  10232. * @retval None
  10233. */
  10234. void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)
  10235. {
  10236. 8025aa8: b510 push {r4, lr}
  10237. /* Get the USART register index */
  10238. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10239. /* Get the interrupt position */
  10240. itpos = USART_IT & IT_MASK;
  10241. itmask = (((uint32_t)0x01) << itpos);
  10242. 8025aaa: 2401 movs r4, #1
  10243. 8025aac: f001 011f and.w r1, r1, #31
  10244. if (usartreg == 0x01) /* The IT is in CR1 register */
  10245. 8025ab0: 42a3 cmp r3, r4
  10246. /* Get the USART register index */
  10247. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10248. /* Get the interrupt position */
  10249. itpos = USART_IT & IT_MASK;
  10250. itmask = (((uint32_t)0x01) << itpos);
  10251. 8025ab2: fa04 f101 lsl.w r1, r4, r1
  10252. if (usartreg == 0x01) /* The IT is in CR1 register */
  10253. 8025ab6: d101 bne.n 8025abc <USART_ITConfig+0x18>
  10254. {
  10255. usartxbase += 0x0C;
  10256. 8025ab8: 300c adds r0, #12
  10257. 8025aba: e004 b.n 8025ac6 <USART_ITConfig+0x22>
  10258. }
  10259. else if (usartreg == 0x02) /* The IT is in CR2 register */
  10260. 8025abc: 2b02 cmp r3, #2
  10261. 8025abe: d101 bne.n 8025ac4 <USART_ITConfig+0x20>
  10262. {
  10263. usartxbase += 0x10;
  10264. 8025ac0: 3010 adds r0, #16
  10265. 8025ac2: e000 b.n 8025ac6 <USART_ITConfig+0x22>
  10266. }
  10267. else /* The IT is in CR3 register */
  10268. {
  10269. usartxbase += 0x14;
  10270. 8025ac4: 3014 adds r0, #20
  10271. }
  10272. if (NewState != DISABLE)
  10273. {
  10274. *(__IO uint32_t*)usartxbase |= itmask;
  10275. 8025ac6: 6803 ldr r3, [r0, #0]
  10276. }
  10277. else /* The IT is in CR3 register */
  10278. {
  10279. usartxbase += 0x14;
  10280. }
  10281. if (NewState != DISABLE)
  10282. 8025ac8: b10a cbz r2, 8025ace <USART_ITConfig+0x2a>
  10283. {
  10284. *(__IO uint32_t*)usartxbase |= itmask;
  10285. 8025aca: 4319 orrs r1, r3
  10286. 8025acc: e001 b.n 8025ad2 <USART_ITConfig+0x2e>
  10287. }
  10288. else
  10289. {
  10290. *(__IO uint32_t*)usartxbase &= ~itmask;
  10291. 8025ace: ea23 0101 bic.w r1, r3, r1
  10292. 8025ad2: 6001 str r1, [r0, #0]
  10293. 8025ad4: bd10 pop {r4, pc}
  10294. 08025ad6 <USART_GetITStatus>:
  10295. * @arg USART_IT_FE: Framing Error interrupt
  10296. * @arg USART_IT_PE: Parity Error interrupt
  10297. * @retval The new state of USART_IT (SET or RESET).
  10298. */
  10299. ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
  10300. {
  10301. 8025ad6: b510 push {r4, lr}
  10302. {
  10303. assert_param(IS_USART_1236_PERIPH(USARTx));
  10304. }
  10305. /* Get the USART register index */
  10306. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10307. 8025ad8: f3c1 1442 ubfx r4, r1, #5, #3
  10308. /* Get the interrupt position */
  10309. itmask = USART_IT & IT_MASK;
  10310. itmask = (uint32_t)0x01 << itmask;
  10311. 8025adc: 2201 movs r2, #1
  10312. 8025ade: f001 031f and.w r3, r1, #31
  10313. if (usartreg == 0x01) /* The IT is in CR1 register */
  10314. 8025ae2: 2c01 cmp r4, #1
  10315. /* Get the USART register index */
  10316. usartreg = (((uint8_t)USART_IT) >> 0x05);
  10317. /* Get the interrupt position */
  10318. itmask = USART_IT & IT_MASK;
  10319. itmask = (uint32_t)0x01 << itmask;
  10320. 8025ae4: fa02 f203 lsl.w r2, r2, r3
  10321. if (usartreg == 0x01) /* The IT is in CR1 register */
  10322. 8025ae8: d101 bne.n 8025aee <USART_GetITStatus+0x18>
  10323. {
  10324. itmask &= USARTx->CR1;
  10325. 8025aea: 8983 ldrh r3, [r0, #12]
  10326. 8025aec: e003 b.n 8025af6 <USART_GetITStatus+0x20>
  10327. }
  10328. else if (usartreg == 0x02) /* The IT is in CR2 register */
  10329. 8025aee: 2c02 cmp r4, #2
  10330. {
  10331. itmask &= USARTx->CR2;
  10332. 8025af0: bf0c ite eq
  10333. 8025af2: 8a03 ldrheq r3, [r0, #16]
  10334. }
  10335. else /* The IT is in CR3 register */
  10336. {
  10337. itmask &= USARTx->CR3;
  10338. 8025af4: 8a83 ldrhne r3, [r0, #20]
  10339. 8025af6: b29b uxth r3, r3
  10340. 8025af8: 4013 ands r3, r2
  10341. }
  10342. bitpos = USART_IT >> 0x08;
  10343. bitpos = (uint32_t)0x01 << bitpos;
  10344. bitpos &= USARTx->SR;
  10345. 8025afa: 8802 ldrh r2, [r0, #0]
  10346. 8025afc: b292 uxth r2, r2
  10347. if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET))
  10348. 8025afe: b143 cbz r3, 8025b12 <USART_GetITStatus+0x3c>
  10349. {
  10350. itmask &= USARTx->CR3;
  10351. }
  10352. bitpos = USART_IT >> 0x08;
  10353. bitpos = (uint32_t)0x01 << bitpos;
  10354. 8025b00: 2301 movs r3, #1
  10355. 8025b02: 0a09 lsrs r1, r1, #8
  10356. 8025b04: fa03 f101 lsl.w r1, r3, r1
  10357. bitpos &= USARTx->SR;
  10358. if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET))
  10359. 8025b08: 4211 tst r1, r2
  10360. {
  10361. bitstatus = SET;
  10362. 8025b0a: bf0c ite eq
  10363. 8025b0c: 2000 moveq r0, #0
  10364. 8025b0e: 2001 movne r0, #1
  10365. 8025b10: bd10 pop {r4, pc}
  10366. }
  10367. else
  10368. {
  10369. bitstatus = RESET;
  10370. 8025b12: 4618 mov r0, r3
  10371. }
  10372. return bitstatus;
  10373. }
  10374. 8025b14: bd10 pop {r4, pc}
  10375. 08025b16 <USART_ClearITPendingBit>:
  10376. {
  10377. assert_param(IS_USART_1236_PERIPH(USARTx));
  10378. }
  10379. bitpos = USART_IT >> 0x08;
  10380. itmask = ((uint16_t)0x01 << (uint16_t)bitpos);
  10381. 8025b16: 0a09 lsrs r1, r1, #8
  10382. 8025b18: 2301 movs r3, #1
  10383. 8025b1a: fa03 f301 lsl.w r3, r3, r1
  10384. USARTx->SR = (uint16_t)~itmask;
  10385. 8025b1e: 43db mvns r3, r3
  10386. 8025b20: 8003 strh r3, [r0, #0]
  10387. 8025b22: 4770 bx lr
  10388. 08025b24 <SystemInit>:
  10389. SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
  10390. #endif
  10391. /* Reset the RCC clock configuration to the default reset state ------------*/
  10392. /* Set HSION bit */
  10393. RCC->CR |= (uint32_t)0x00000001;
  10394. 8025b24: 4b35 ldr r3, [pc, #212] ; (8025bfc <SystemInit+0xd8>)
  10395. 8025b26: 681a ldr r2, [r3, #0]
  10396. 8025b28: f042 0201 orr.w r2, r2, #1
  10397. 8025b2c: 601a str r2, [r3, #0]
  10398. /* Reset CFGR register */
  10399. RCC->CFGR = 0x00000000;
  10400. 8025b2e: 2200 movs r2, #0
  10401. 8025b30: 609a str r2, [r3, #8]
  10402. /* Reset HSEON, CSSON and PLLON bits */
  10403. RCC->CR &= (uint32_t)0xFEF6FFFF;
  10404. 8025b32: 6819 ldr r1, [r3, #0]
  10405. 8025b34: f021 7184 bic.w r1, r1, #17301504 ; 0x1080000
  10406. 8025b38: f421 3180 bic.w r1, r1, #65536 ; 0x10000
  10407. 8025b3c: 6019 str r1, [r3, #0]
  10408. /* Reset PLLCFGR register */
  10409. RCC->PLLCFGR = 0x24003010;
  10410. 8025b3e: 4930 ldr r1, [pc, #192] ; (8025c00 <SystemInit+0xdc>)
  10411. 8025b40: 6059 str r1, [r3, #4]
  10412. /* Reset HSEBYP bit */
  10413. RCC->CR &= (uint32_t)0xFFFBFFFF;
  10414. 8025b42: 6819 ldr r1, [r3, #0]
  10415. * SystemFrequency variable.
  10416. * @param None
  10417. * @retval None
  10418. */
  10419. void SystemInit(void)
  10420. {
  10421. 8025b44: b082 sub sp, #8
  10422. /* Reset PLLCFGR register */
  10423. RCC->PLLCFGR = 0x24003010;
  10424. /* Reset HSEBYP bit */
  10425. RCC->CR &= (uint32_t)0xFFFBFFFF;
  10426. 8025b46: f421 2180 bic.w r1, r1, #262144 ; 0x40000
  10427. 8025b4a: 6019 str r1, [r3, #0]
  10428. /* Disable all interrupts */
  10429. RCC->CIR = 0x00000000;
  10430. 8025b4c: 60da str r2, [r3, #12]
  10431. static void SetSysClock(void)
  10432. {
  10433. /******************************************************************************/
  10434. /* PLL (clocked by HSE) used as System clock source */
  10435. /******************************************************************************/
  10436. __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  10437. 8025b4e: 9200 str r2, [sp, #0]
  10438. 8025b50: 9201 str r2, [sp, #4]
  10439. /* Enable HSE */
  10440. RCC->CR |= ((uint32_t)RCC_CR_HSEON);
  10441. 8025b52: 681a ldr r2, [r3, #0]
  10442. 8025b54: f442 3280 orr.w r2, r2, #65536 ; 0x10000
  10443. 8025b58: 601a str r2, [r3, #0]
  10444. /* Wait till HSE is ready and if Time out is reached exit */
  10445. do
  10446. {
  10447. HSEStatus = RCC->CR & RCC_CR_HSERDY;
  10448. 8025b5a: 681a ldr r2, [r3, #0]
  10449. 8025b5c: f402 3200 and.w r2, r2, #131072 ; 0x20000
  10450. 8025b60: 9201 str r2, [sp, #4]
  10451. StartUpCounter++;
  10452. 8025b62: 9a00 ldr r2, [sp, #0]
  10453. 8025b64: 3201 adds r2, #1
  10454. 8025b66: 9200 str r2, [sp, #0]
  10455. } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  10456. 8025b68: 9a01 ldr r2, [sp, #4]
  10457. 8025b6a: b91a cbnz r2, 8025b74 <SystemInit+0x50>
  10458. 8025b6c: 9a00 ldr r2, [sp, #0]
  10459. 8025b6e: f5b2 6fa0 cmp.w r2, #1280 ; 0x500
  10460. 8025b72: d1f2 bne.n 8025b5a <SystemInit+0x36>
  10461. if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  10462. 8025b74: 4b21 ldr r3, [pc, #132] ; (8025bfc <SystemInit+0xd8>)
  10463. 8025b76: 681b ldr r3, [r3, #0]
  10464. 8025b78: f413 3300 ands.w r3, r3, #131072 ; 0x20000
  10465. {
  10466. HSEStatus = (uint32_t)0x01;
  10467. 8025b7c: bf18 it ne
  10468. 8025b7e: 2301 movne r3, #1
  10469. }
  10470. else
  10471. {
  10472. HSEStatus = (uint32_t)0x00;
  10473. 8025b80: 9301 str r3, [sp, #4]
  10474. }
  10475. if (HSEStatus == (uint32_t)0x01)
  10476. 8025b82: 9b01 ldr r3, [sp, #4]
  10477. 8025b84: 2b01 cmp r3, #1
  10478. 8025b86: d133 bne.n 8025bf0 <SystemInit+0xcc>
  10479. {
  10480. /* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */
  10481. RCC->APB1ENR |= RCC_APB1ENR_PWREN;
  10482. 8025b88: 4b1c ldr r3, [pc, #112] ; (8025bfc <SystemInit+0xd8>)
  10483. 8025b8a: 6c1a ldr r2, [r3, #64] ; 0x40
  10484. 8025b8c: f042 5280 orr.w r2, r2, #268435456 ; 0x10000000
  10485. 8025b90: 641a str r2, [r3, #64] ; 0x40
  10486. PWR->CR |= PWR_CR_VOS;
  10487. 8025b92: 4a1c ldr r2, [pc, #112] ; (8025c04 <SystemInit+0xe0>)
  10488. 8025b94: 6811 ldr r1, [r2, #0]
  10489. 8025b96: f441 4180 orr.w r1, r1, #16384 ; 0x4000
  10490. 8025b9a: 6011 str r1, [r2, #0]
  10491. /* HCLK = SYSCLK / 1*/
  10492. RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
  10493. 8025b9c: 689a ldr r2, [r3, #8]
  10494. 8025b9e: 609a str r2, [r3, #8]
  10495. /* PCLK2 = HCLK / 2*/
  10496. RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
  10497. 8025ba0: 689a ldr r2, [r3, #8]
  10498. 8025ba2: f442 4200 orr.w r2, r2, #32768 ; 0x8000
  10499. 8025ba6: 609a str r2, [r3, #8]
  10500. /* PCLK1 = HCLK / 4*/
  10501. RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
  10502. 8025ba8: 689a ldr r2, [r3, #8]
  10503. 8025baa: f442 52a0 orr.w r2, r2, #5120 ; 0x1400
  10504. 8025bae: 609a str r2, [r3, #8]
  10505. /* Configure the main PLL */
  10506. RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
  10507. 8025bb0: 4a15 ldr r2, [pc, #84] ; (8025c08 <SystemInit+0xe4>)
  10508. 8025bb2: 605a str r2, [r3, #4]
  10509. (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
  10510. /* Enable the main PLL */
  10511. RCC->CR |= RCC_CR_PLLON;
  10512. 8025bb4: 681a ldr r2, [r3, #0]
  10513. 8025bb6: f042 7280 orr.w r2, r2, #16777216 ; 0x1000000
  10514. 8025bba: 601a str r2, [r3, #0]
  10515. /* Wait till the main PLL is ready */
  10516. while((RCC->CR & RCC_CR_PLLRDY) == 0)
  10517. 8025bbc: 6819 ldr r1, [r3, #0]
  10518. 8025bbe: 4a0f ldr r2, [pc, #60] ; (8025bfc <SystemInit+0xd8>)
  10519. 8025bc0: 0189 lsls r1, r1, #6
  10520. 8025bc2: d5fb bpl.n 8025bbc <SystemInit+0x98>
  10521. {
  10522. }
  10523. /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
  10524. FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
  10525. 8025bc4: 4b11 ldr r3, [pc, #68] ; (8025c0c <SystemInit+0xe8>)
  10526. 8025bc6: f240 6105 movw r1, #1541 ; 0x605
  10527. 8025bca: 6019 str r1, [r3, #0]
  10528. /* Select the main PLL as system clock source */
  10529. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
  10530. 8025bcc: 6893 ldr r3, [r2, #8]
  10531. 8025bce: f023 0303 bic.w r3, r3, #3
  10532. 8025bd2: 6093 str r3, [r2, #8]
  10533. RCC->CFGR |= RCC_CFGR_SW_PLL;
  10534. 8025bd4: 6893 ldr r3, [r2, #8]
  10535. 8025bd6: f043 0302 orr.w r3, r3, #2
  10536. 8025bda: 6093 str r3, [r2, #8]
  10537. /* Wait till the main PLL is used as system clock source */
  10538. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
  10539. 8025bdc: 6891 ldr r1, [r2, #8]
  10540. 8025bde: 4b07 ldr r3, [pc, #28] ; (8025bfc <SystemInit+0xd8>)
  10541. 8025be0: f001 010c and.w r1, r1, #12
  10542. 8025be4: 2908 cmp r1, #8
  10543. 8025be6: d1f9 bne.n 8025bdc <SystemInit+0xb8>
  10544. {
  10545. }
  10546. /* Добавил переход на внутренний генератор в случае отказа HSE */
  10547. RCC->CR|=RCC_CR_CSSON;
  10548. 8025be8: 681a ldr r2, [r3, #0]
  10549. 8025bea: f442 2200 orr.w r2, r2, #524288 ; 0x80000
  10550. 8025bee: 601a str r2, [r3, #0]
  10551. /* Configure the Vector Table location add offset address ------------------*/
  10552. #ifdef VECT_TAB_SRAM
  10553. SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
  10554. #else
  10555. SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
  10556. 8025bf0: 4b07 ldr r3, [pc, #28] ; (8025c10 <SystemInit+0xec>)
  10557. 8025bf2: f04f 6200 mov.w r2, #134217728 ; 0x8000000
  10558. 8025bf6: 609a str r2, [r3, #8]
  10559. #endif
  10560. }
  10561. 8025bf8: b002 add sp, #8
  10562. 8025bfa: 4770 bx lr
  10563. 8025bfc: 40023800 .word 0x40023800
  10564. 8025c00: 24003010 .word 0x24003010
  10565. 8025c04: 40007000 .word 0x40007000
  10566. 8025c08: 07405419 .word 0x07405419
  10567. 8025c0c: 40023c00 .word 0x40023c00
  10568. 8025c10: e000ed00 .word 0xe000ed00
  10569. 08025c14 <gpio_hw_config_pin>:
  10570. GPIO_TABLE(EXPAND_AS_DEFS)
  10571. };
  10572. void gpio_hw_config_pin(GPIO_TypeDef *port, uint8_t pin, uint16_t conf) {
  10573. uint8_t shift;
  10574. shift = pin * 2;
  10575. 8025c14: 004b lsls r3, r1, #1
  10576. port->MODER &= ~(GPIO_MODER_MASK << shift);
  10577. 8025c16: b2db uxtb r3, r3
  10578. gpio_pindef_t gpio_pins[] = {
  10579. GPIO_TABLE(EXPAND_AS_DEFS)
  10580. };
  10581. void gpio_hw_config_pin(GPIO_TypeDef *port, uint8_t pin, uint16_t conf) {
  10582. 8025c18: b570 push {r4, r5, r6, lr}
  10583. uint8_t shift;
  10584. shift = pin * 2;
  10585. port->MODER &= ~(GPIO_MODER_MASK << shift);
  10586. 8025c1a: 2403 movs r4, #3
  10587. 8025c1c: 6805 ldr r5, [r0, #0]
  10588. 8025c1e: fa04 f403 lsl.w r4, r4, r3
  10589. 8025c22: 43e4 mvns r4, r4
  10590. 8025c24: 4025 ands r5, r4
  10591. 8025c26: 6005 str r5, [r0, #0]
  10592. port->MODER |= (uint32_t)((conf >> GPIO_MODE_CFG_SHIFT) & GPIO_MODER_MASK) << shift;
  10593. 8025c28: 6806 ldr r6, [r0, #0]
  10594. 8025c2a: f002 0503 and.w r5, r2, #3
  10595. 8025c2e: fa05 f503 lsl.w r5, r5, r3
  10596. 8025c32: 4335 orrs r5, r6
  10597. 8025c34: 6005 str r5, [r0, #0]
  10598. port->OTYPER &= ~(GPIO_TYPER_MASK << pin);
  10599. 8025c36: 6846 ldr r6, [r0, #4]
  10600. 8025c38: 2501 movs r5, #1
  10601. 8025c3a: fa05 f501 lsl.w r5, r5, r1
  10602. 8025c3e: ea26 0505 bic.w r5, r6, r5
  10603. 8025c42: 6045 str r5, [r0, #4]
  10604. port->OTYPER |= (uint32_t)((conf >> GPIO_TYPE_CFG_SHIFT) & GPIO_TYPER_MASK) << pin;
  10605. 8025c44: 6845 ldr r5, [r0, #4]
  10606. 8025c46: f3c2 0680 ubfx r6, r2, #2, #1
  10607. 8025c4a: fa06 f101 lsl.w r1, r6, r1
  10608. 8025c4e: 4329 orrs r1, r5
  10609. 8025c50: 6041 str r1, [r0, #4]
  10610. port->OSPEEDR &= ~(GPIO_SPEEDR_MASK << shift);
  10611. 8025c52: 6881 ldr r1, [r0, #8]
  10612. 8025c54: 4021 ands r1, r4
  10613. 8025c56: 6081 str r1, [r0, #8]
  10614. port->OSPEEDR |= (uint32_t)((conf >> GPIO_SPEED_CFG_SHIFT) & GPIO_SPEEDR_MASK) << shift;
  10615. 8025c58: 6885 ldr r5, [r0, #8]
  10616. 8025c5a: f3c2 1101 ubfx r1, r2, #4, #2
  10617. 8025c5e: fa01 f103 lsl.w r1, r1, r3
  10618. 8025c62: 4329 orrs r1, r5
  10619. 8025c64: 6081 str r1, [r0, #8]
  10620. port->PUPDR &= ~(GPIO_PUPDR_MASK << shift);
  10621. 8025c66: 68c1 ldr r1, [r0, #12]
  10622. 8025c68: 400c ands r4, r1
  10623. 8025c6a: 60c4 str r4, [r0, #12]
  10624. port->PUPDR |= (uint32_t)((conf >> GPIO_PUPD_CFG_SHIFT) & GPIO_PUPDR_MASK) << shift;
  10625. 8025c6c: 68c1 ldr r1, [r0, #12]
  10626. 8025c6e: f3c2 1281 ubfx r2, r2, #6, #2
  10627. 8025c72: fa02 f303 lsl.w r3, r2, r3
  10628. 8025c76: 430b orrs r3, r1
  10629. 8025c78: 60c3 str r3, [r0, #12]
  10630. 8025c7a: bd70 pop {r4, r5, r6, pc}
  10631. 08025c7c <gpio_connect_af>:
  10632. }
  10633. void gpio_connect_af(gpio_t id, uint8_t af_n) {
  10634. 8025c7c: b510 push {r4, lr}
  10635. gpio_pindef_t *pin = &gpio_pins[id];
  10636. 8025c7e: 4b13 ldr r3, [pc, #76] ; (8025ccc <gpio_connect_af+0x50>)
  10637. 8025c80: eb03 02c0 add.w r2, r3, r0, lsl #3
  10638. uint8_t shift;
  10639. if (pin->pin < 8) {
  10640. shift = pin->pin * 4;
  10641. pin->port->AFR[0] &= ~((uint32_t)GPIO_AFR_MASK << shift);
  10642. 8025c84: f853 3030 ldr.w r3, [r3, r0, lsl #3]
  10643. }
  10644. void gpio_connect_af(gpio_t id, uint8_t af_n) {
  10645. gpio_pindef_t *pin = &gpio_pins[id];
  10646. uint8_t shift;
  10647. if (pin->pin < 8) {
  10648. 8025c88: 7912 ldrb r2, [r2, #4]
  10649. 8025c8a: 2a07 cmp r2, #7
  10650. 8025c8c: d80e bhi.n 8025cac <gpio_connect_af+0x30>
  10651. shift = pin->pin * 4;
  10652. 8025c8e: 0092 lsls r2, r2, #2
  10653. pin->port->AFR[0] &= ~((uint32_t)GPIO_AFR_MASK << shift);
  10654. 8025c90: 6a1c ldr r4, [r3, #32]
  10655. 8025c92: b2d2 uxtb r2, r2
  10656. 8025c94: 200f movs r0, #15
  10657. 8025c96: fa00 f002 lsl.w r0, r0, r2
  10658. 8025c9a: ea24 0000 bic.w r0, r4, r0
  10659. 8025c9e: 6218 str r0, [r3, #32]
  10660. pin->port->AFR[0] |= af_n << shift;
  10661. 8025ca0: 6a18 ldr r0, [r3, #32]
  10662. 8025ca2: fa01 f202 lsl.w r2, r1, r2
  10663. 8025ca6: 4302 orrs r2, r0
  10664. 8025ca8: 621a str r2, [r3, #32]
  10665. 8025caa: bd10 pop {r4, pc}
  10666. }
  10667. else {
  10668. shift = (pin->pin - 8) * 4;
  10669. 8025cac: 3a08 subs r2, #8
  10670. 8025cae: 0092 lsls r2, r2, #2
  10671. pin->port->AFR[1] &= ~((uint32_t)GPIO_AFR_MASK << shift);
  10672. 8025cb0: 6a5c ldr r4, [r3, #36] ; 0x24
  10673. 8025cb2: b2d2 uxtb r2, r2
  10674. 8025cb4: 200f movs r0, #15
  10675. 8025cb6: fa00 f002 lsl.w r0, r0, r2
  10676. 8025cba: ea24 0000 bic.w r0, r4, r0
  10677. 8025cbe: 6258 str r0, [r3, #36] ; 0x24
  10678. pin->port->AFR[1] |= af_n << shift;
  10679. 8025cc0: 6a58 ldr r0, [r3, #36] ; 0x24
  10680. 8025cc2: fa01 f202 lsl.w r2, r1, r2
  10681. 8025cc6: 4302 orrs r2, r0
  10682. 8025cc8: 625a str r2, [r3, #36] ; 0x24
  10683. 8025cca: bd10 pop {r4, pc}
  10684. 8025ccc: 200005c0 .word 0x200005c0
  10685. 08025cd0 <gpio_set>:
  10686. }
  10687. }
  10688. }
  10689. void gpio_set(gpio_t pin, bool value) {
  10690. if (gpio_pins[pin].flags & GPIO_INV)
  10691. 8025cd0: 4b0e ldr r3, [pc, #56] ; (8025d0c <gpio_set+0x3c>)
  10692. 8025cd2: eb03 02c0 add.w r2, r3, r0, lsl #3
  10693. 8025cd6: 88d2 ldrh r2, [r2, #6]
  10694. 8025cd8: f002 0210 and.w r2, r2, #16
  10695. 8025cdc: b292 uxth r2, r2
  10696. 8025cde: b10a cbz r2, 8025ce4 <gpio_set+0x14>
  10697. value = !value;
  10698. 8025ce0: f081 0101 eor.w r1, r1, #1
  10699. 8025ce4: 00c2 lsls r2, r0, #3
  10700. if (value)
  10701. 8025ce6: b141 cbz r1, 8025cfa <gpio_set+0x2a>
  10702. gpio_pins[pin].port->BSRRL = 1 << gpio_pins[pin].pin;
  10703. 8025ce8: f853 1030 ldr.w r1, [r3, r0, lsl #3]
  10704. 8025cec: 189b adds r3, r3, r2
  10705. 8025cee: 2201 movs r2, #1
  10706. 8025cf0: 791b ldrb r3, [r3, #4]
  10707. 8025cf2: fa02 f303 lsl.w r3, r2, r3
  10708. 8025cf6: 830b strh r3, [r1, #24]
  10709. 8025cf8: 4770 bx lr
  10710. else
  10711. gpio_pins[pin].port->BSRRH = 1 << gpio_pins[pin].pin;
  10712. 8025cfa: f853 1030 ldr.w r1, [r3, r0, lsl #3]
  10713. 8025cfe: 189b adds r3, r3, r2
  10714. 8025d00: 2201 movs r2, #1
  10715. 8025d02: 791b ldrb r3, [r3, #4]
  10716. 8025d04: fa02 f303 lsl.w r3, r2, r3
  10717. 8025d08: 834b strh r3, [r1, #26]
  10718. 8025d0a: 4770 bx lr
  10719. 8025d0c: 200005c0 .word 0x200005c0
  10720. 08025d10 <gpio_set_config>:
  10721. }
  10722. /*
  10723. * TODO add analog flag and setup ADC pins in a proper way
  10724. */
  10725. static void gpio_set_config(gpio_t id) {
  10726. 8025d10: b570 push {r4, r5, r6, lr}
  10727. gpio_pindef_t *pin = &gpio_pins[id];
  10728. 8025d12: 4e1e ldr r6, [pc, #120] ; (8025d8c <gpio_set_config+0x7c>)
  10729. 8025d14: eb06 05c0 add.w r5, r6, r0, lsl #3
  10730. }
  10731. /*
  10732. * TODO add analog flag and setup ADC pins in a proper way
  10733. */
  10734. static void gpio_set_config(gpio_t id) {
  10735. 8025d18: 4604 mov r4, r0
  10736. gpio_pindef_t *pin = &gpio_pins[id];
  10737. if (pin->flags & GPIO_AF) {
  10738. 8025d1a: 88e9 ldrh r1, [r5, #6]
  10739. 8025d1c: f401 7300 and.w r3, r1, #512 ; 0x200
  10740. 8025d20: b29b uxth r3, r3
  10741. 8025d22: b13b cbz r3, 8025d34 <gpio_set_config+0x24>
  10742. uint8_t af_n = (uint8_t)(pin->flags >> _GPIO_AF_SHIFT);
  10743. gpio_connect_af(id, af_n);
  10744. 8025d24: 0a89 lsrs r1, r1, #10
  10745. 8025d26: f7ff ffa9 bl 8025c7c <gpio_connect_af>
  10746. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_AF_CFG |
  10747. 8025d2a: f856 0034 ldr.w r0, [r6, r4, lsl #3]
  10748. 8025d2e: 7929 ldrb r1, [r5, #4]
  10749. 8025d30: 2232 movs r2, #50 ; 0x32
  10750. 8025d32: e005 b.n 8025d40 <gpio_set_config+0x30>
  10751. GPIO_SPEED_HIGH_CFG);
  10752. }
  10753. else if (pin->flags & GPIO_IN)
  10754. 8025d34: 07cb lsls r3, r1, #31
  10755. 8025d36: d507 bpl.n 8025d48 <gpio_set_config+0x38>
  10756. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_IN_CFG |
  10757. 8025d38: f856 0030 ldr.w r0, [r6, r0, lsl #3]
  10758. 8025d3c: 7929 ldrb r1, [r5, #4]
  10759. 8025d3e: 2230 movs r2, #48 ; 0x30
  10760. ((pin->flags & GPIO_OD) ?
  10761. GPIO_TYPE_OD_CFG : GPIO_TYPE_PP_CFG) |
  10762. GPIO_SPEED_HIGH_CFG);
  10763. gpio_set(id, pin->flags & GPIO_SET);
  10764. }
  10765. }
  10766. 8025d40: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  10767. gpio_connect_af(id, af_n);
  10768. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_AF_CFG |
  10769. GPIO_SPEED_HIGH_CFG);
  10770. }
  10771. else if (pin->flags & GPIO_IN)
  10772. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_IN_CFG |
  10773. 8025d44: f7ff bf66 b.w 8025c14 <gpio_hw_config_pin>
  10774. GPIO_SPEED_HIGH_CFG);
  10775. else if (pin->flags & GPIO_IN_PU) {
  10776. 8025d48: f001 0302 and.w r3, r1, #2
  10777. 8025d4c: b29b uxth r3, r3
  10778. 8025d4e: b123 cbz r3, 8025d5a <gpio_set_config+0x4a>
  10779. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_IN_CFG | GPIO_PU_CFG |
  10780. 8025d50: f856 0030 ldr.w r0, [r6, r0, lsl #3]
  10781. 8025d54: 7929 ldrb r1, [r5, #4]
  10782. 8025d56: 2270 movs r2, #112 ; 0x70
  10783. 8025d58: e00d b.n 8025d76 <gpio_set_config+0x66>
  10784. GPIO_SPEED_HIGH_CFG);
  10785. gpio_set(id, pin->flags & GPIO_SET);
  10786. }
  10787. else if (pin->flags & GPIO_OUT) {
  10788. 8025d5a: f001 0304 and.w r3, r1, #4
  10789. 8025d5e: b29b uxth r3, r3
  10790. 8025d60: b19b cbz r3, 8025d8a <gpio_set_config+0x7a>
  10791. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_OUT_CFG |
  10792. 8025d62: f001 0120 and.w r1, r1, #32
  10793. 8025d66: b28a uxth r2, r1
  10794. 8025d68: f856 0030 ldr.w r0, [r6, r0, lsl #3]
  10795. 8025d6c: 7929 ldrb r1, [r5, #4]
  10796. 8025d6e: 2a00 cmp r2, #0
  10797. 8025d70: bf0c ite eq
  10798. 8025d72: 2231 moveq r2, #49 ; 0x31
  10799. 8025d74: 2235 movne r2, #53 ; 0x35
  10800. 8025d76: f7ff ff4d bl 8025c14 <gpio_hw_config_pin>
  10801. ((pin->flags & GPIO_OD) ?
  10802. GPIO_TYPE_OD_CFG : GPIO_TYPE_PP_CFG) |
  10803. GPIO_SPEED_HIGH_CFG);
  10804. gpio_set(id, pin->flags & GPIO_SET);
  10805. 8025d7a: 88e9 ldrh r1, [r5, #6]
  10806. 8025d7c: 4620 mov r0, r4
  10807. 8025d7e: f3c1 01c0 ubfx r1, r1, #3, #1
  10808. }
  10809. }
  10810. 8025d82: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  10811. else if (pin->flags & GPIO_OUT) {
  10812. gpio_hw_config_pin(pin->port, pin->pin, GPIO_MODE_OUT_CFG |
  10813. ((pin->flags & GPIO_OD) ?
  10814. GPIO_TYPE_OD_CFG : GPIO_TYPE_PP_CFG) |
  10815. GPIO_SPEED_HIGH_CFG);
  10816. gpio_set(id, pin->flags & GPIO_SET);
  10817. 8025d86: f7ff bfa3 b.w 8025cd0 <gpio_set>
  10818. 8025d8a: bd70 pop {r4, r5, r6, pc}
  10819. 8025d8c: 200005c0 .word 0x200005c0
  10820. 08025d90 <gpio_init>:
  10821. }
  10822. }
  10823. void gpio_init(void) {
  10824. 8025d90: b538 push {r3, r4, r5, lr}
  10825. uint32_t i;
  10826. GPIO_DeInit(GPIOA);
  10827. 8025d92: 4812 ldr r0, [pc, #72] ; (8025ddc <gpio_init+0x4c>)
  10828. GPIO_SPEED_HIGH_CFG);
  10829. gpio_set(id, pin->flags & GPIO_SET);
  10830. }
  10831. }
  10832. void gpio_init(void) {
  10833. 8025d94: 4d12 ldr r5, [pc, #72] ; (8025de0 <gpio_init+0x50>)
  10834. uint32_t i;
  10835. GPIO_DeInit(GPIOA);
  10836. 8025d96: f7ff fa7b bl 8025290 <GPIO_DeInit>
  10837. GPIO_DeInit(GPIOB);
  10838. 8025d9a: 4812 ldr r0, [pc, #72] ; (8025de4 <gpio_init+0x54>)
  10839. 8025d9c: f7ff fa78 bl 8025290 <GPIO_DeInit>
  10840. GPIO_DeInit(GPIOC);
  10841. 8025da0: 4811 ldr r0, [pc, #68] ; (8025de8 <gpio_init+0x58>)
  10842. 8025da2: f7ff fa75 bl 8025290 <GPIO_DeInit>
  10843. GPIO_DeInit(GPIOD);
  10844. 8025da6: 4811 ldr r0, [pc, #68] ; (8025dec <gpio_init+0x5c>)
  10845. 8025da8: f7ff fa72 bl 8025290 <GPIO_DeInit>
  10846. GPIO_DeInit(GPIOE);
  10847. 8025dac: 4810 ldr r0, [pc, #64] ; (8025df0 <gpio_init+0x60>)
  10848. 8025dae: f7ff fa6f bl 8025290 <GPIO_DeInit>
  10849. // configure clocks
  10850. RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN |
  10851. 8025db2: 4b10 ldr r3, [pc, #64] ; (8025df4 <gpio_init+0x64>)
  10852. 8025db4: 6b1a ldr r2, [r3, #48] ; 0x30
  10853. 8025db6: f042 021f orr.w r2, r2, #31
  10854. 8025dba: 631a str r2, [r3, #48] ; 0x30
  10855. RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN |
  10856. RCC_AHB1ENR_GPIOEEN;
  10857. // configure gpios
  10858. for (i = 0; i < GPIO_TOTAL_COUNT; i++) {
  10859. 8025dbc: 2400 movs r4, #0
  10860. GPIO_SPEED_HIGH_CFG);
  10861. gpio_set(id, pin->flags & GPIO_SET);
  10862. }
  10863. }
  10864. void gpio_init(void) {
  10865. 8025dbe: eb05 03c4 add.w r3, r5, r4, lsl #3
  10866. RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN |
  10867. RCC_AHB1ENR_GPIOEEN;
  10868. // configure gpios
  10869. for (i = 0; i < GPIO_TOTAL_COUNT; i++) {
  10870. if (gpio_pins[i].flags & GPIO_NOINIT)
  10871. 8025dc2: 88db ldrh r3, [r3, #6]
  10872. 8025dc4: f003 0380 and.w r3, r3, #128 ; 0x80
  10873. 8025dc8: b29b uxth r3, r3
  10874. 8025dca: b913 cbnz r3, 8025dd2 <gpio_init+0x42>
  10875. continue;
  10876. else {
  10877. gpio_set_config(i);
  10878. 8025dcc: b2e0 uxtb r0, r4
  10879. 8025dce: f7ff ff9f bl 8025d10 <gpio_set_config>
  10880. RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN |
  10881. RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN |
  10882. RCC_AHB1ENR_GPIOEEN;
  10883. // configure gpios
  10884. for (i = 0; i < GPIO_TOTAL_COUNT; i++) {
  10885. 8025dd2: 3401 adds r4, #1
  10886. 8025dd4: 2c11 cmp r4, #17
  10887. 8025dd6: d1f2 bne.n 8025dbe <gpio_init+0x2e>
  10888. continue;
  10889. else {
  10890. gpio_set_config(i);
  10891. }
  10892. }
  10893. }
  10894. 8025dd8: bd38 pop {r3, r4, r5, pc}
  10895. 8025dda: bf00 nop
  10896. 8025ddc: 40020000 .word 0x40020000
  10897. 8025de0: 200005c0 .word 0x200005c0
  10898. 8025de4: 40020400 .word 0x40020400
  10899. 8025de8: 40020800 .word 0x40020800
  10900. 8025dec: 40020c00 .word 0x40020c00
  10901. 8025df0: 40021000 .word 0x40021000
  10902. 8025df4: 40023800 .word 0x40023800
  10903. 08025df8 <gpio_invert_output>:
  10904. gpio_pins[pin].port->BSRRH = 1 << gpio_pins[pin].pin;
  10905. }
  10906. void gpio_invert_output(gpio_t pin) {
  10907. gpio_pins[pin].port->ODR ^= 1 << gpio_pins[pin].pin;
  10908. 8025df8: 4a06 ldr r2, [pc, #24] ; (8025e14 <gpio_invert_output+0x1c>)
  10909. 8025dfa: f852 3030 ldr.w r3, [r2, r0, lsl #3]
  10910. 8025dfe: eb02 02c0 add.w r2, r2, r0, lsl #3
  10911. 8025e02: 6959 ldr r1, [r3, #20]
  10912. 8025e04: 7912 ldrb r2, [r2, #4]
  10913. 8025e06: 2001 movs r0, #1
  10914. 8025e08: fa00 f202 lsl.w r2, r0, r2
  10915. 8025e0c: 404a eors r2, r1
  10916. 8025e0e: 615a str r2, [r3, #20]
  10917. 8025e10: 4770 bx lr
  10918. 8025e12: bf00 nop
  10919. 8025e14: 200005c0 .word 0x200005c0
  10920. 08025e18 <gpio_get>:
  10921. }
  10922. bool gpio_get(gpio_t pin) {
  10923. bool value;
  10924. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  10925. 8025e18: 490e ldr r1, [pc, #56] ; (8025e54 <gpio_get+0x3c>)
  10926. 8025e1a: eb01 02c0 add.w r2, r1, r0, lsl #3
  10927. void gpio_invert_output(gpio_t pin) {
  10928. gpio_pins[pin].port->ODR ^= 1 << gpio_pins[pin].pin;
  10929. }
  10930. bool gpio_get(gpio_t pin) {
  10931. 8025e1e: b510 push {r4, lr}
  10932. bool value;
  10933. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  10934. 8025e20: 88d3 ldrh r3, [r2, #6]
  10935. 8025e22: f003 0480 and.w r4, r3, #128 ; 0x80
  10936. 8025e26: b2a4 uxth r4, r4
  10937. 8025e28: b994 cbnz r4, 8025e50 <gpio_get+0x38>
  10938. return false;
  10939. }
  10940. else {
  10941. value = (gpio_pins[pin].port->IDR & (1 << gpio_pins[pin].pin)) >> gpio_pins[pin].pin;
  10942. 8025e2a: f851 1030 ldr.w r1, [r1, r0, lsl #3]
  10943. 8025e2e: 7912 ldrb r2, [r2, #4]
  10944. 8025e30: 6908 ldr r0, [r1, #16]
  10945. 8025e32: 2101 movs r1, #1
  10946. 8025e34: fa01 f102 lsl.w r1, r1, r2
  10947. 8025e38: 4001 ands r1, r0
  10948. return (gpio_pins[pin].flags & GPIO_INV) ? !value : value;
  10949. 8025e3a: f003 0310 and.w r3, r3, #16
  10950. bool value;
  10951. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  10952. return false;
  10953. }
  10954. else {
  10955. value = (gpio_pins[pin].port->IDR & (1 << gpio_pins[pin].pin)) >> gpio_pins[pin].pin;
  10956. 8025e3e: 40d1 lsrs r1, r2
  10957. return (gpio_pins[pin].flags & GPIO_INV) ? !value : value;
  10958. 8025e40: b29b uxth r3, r3
  10959. bool value;
  10960. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  10961. return false;
  10962. }
  10963. else {
  10964. value = (gpio_pins[pin].port->IDR & (1 << gpio_pins[pin].pin)) >> gpio_pins[pin].pin;
  10965. 8025e42: bf0c ite eq
  10966. 8025e44: 2000 moveq r0, #0
  10967. 8025e46: 2001 movne r0, #1
  10968. return (gpio_pins[pin].flags & GPIO_INV) ? !value : value;
  10969. 8025e48: b11b cbz r3, 8025e52 <gpio_get+0x3a>
  10970. 8025e4a: f080 0001 eor.w r0, r0, #1
  10971. 8025e4e: bd10 pop {r4, pc}
  10972. }
  10973. bool gpio_get(gpio_t pin) {
  10974. bool value;
  10975. if (gpio_pins[pin].flags & GPIO_NOINIT) {
  10976. return false;
  10977. 8025e50: 2000 movs r0, #0
  10978. }
  10979. else {
  10980. value = (gpio_pins[pin].port->IDR & (1 << gpio_pins[pin].pin)) >> gpio_pins[pin].pin;
  10981. return (gpio_pins[pin].flags & GPIO_INV) ? !value : value;
  10982. }
  10983. }
  10984. 8025e52: bd10 pop {r4, pc}
  10985. 8025e54: 200005c0 .word 0x200005c0
  10986. 08025e58 <TM_RTC_SetDateTime>:
  10987. /* Устанавливаем новое время */
  10988. TM_RTC_GetDateTimeFromUnix(&newData, unixTime);
  10989. TM_RTC_SetDateTime(&newData, TM_RTC_Format_BIN);
  10990. }
  10991. TM_RTC_Result_t TM_RTC_SetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  10992. 8025e58: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  10993. TM_RTC_t tmp;
  10994. /* Check date and time validation */
  10995. if (format == TM_RTC_Format_BCD) {
  10996. 8025e5c: 2901 cmp r1, #1
  10997. /* Устанавливаем новое время */
  10998. TM_RTC_GetDateTimeFromUnix(&newData, unixTime);
  10999. TM_RTC_SetDateTime(&newData, TM_RTC_Format_BIN);
  11000. }
  11001. TM_RTC_Result_t TM_RTC_SetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  11002. 8025e5e: 4603 mov r3, r0
  11003. 8025e60: 460e mov r6, r1
  11004. 8025e62: 79c0 ldrb r0, [r0, #7]
  11005. TM_RTC_t tmp;
  11006. /* Check date and time validation */
  11007. if (format == TM_RTC_Format_BCD) {
  11008. 8025e64: d137 bne.n 8025ed6 <TM_RTC_SetDateTime+0x7e>
  11009. tmp.date = TM_RTC_BCD2BIN(data->date);
  11010. tmp.month = TM_RTC_BCD2BIN(data->month);
  11011. 8025e66: 7a1c ldrb r4, [r3, #8]
  11012. tmp.year = TM_RTC_BCD2BIN(data->year);
  11013. 8025e68: 7a5d ldrb r5, [r3, #9]
  11014. tmp.hours = TM_RTC_BCD2BIN(data->hours);
  11015. tmp.minutes = TM_RTC_BCD2BIN(data->minutes);
  11016. tmp.seconds = TM_RTC_BCD2BIN(data->seconds);
  11017. 8025e6a: f893 8000 ldrb.w r8, [r3]
  11018. TM_RTC_Result_t TM_RTC_SetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  11019. TM_RTC_t tmp;
  11020. /* Check date and time validation */
  11021. if (format == TM_RTC_Format_BCD) {
  11022. tmp.date = TM_RTC_BCD2BIN(data->date);
  11023. 8025e6e: 220a movs r2, #10
  11024. 8025e70: 0901 lsrs r1, r0, #4
  11025. 8025e72: f000 000f and.w r0, r0, #15
  11026. 8025e76: fb02 0001 mla r0, r2, r1, r0
  11027. tmp.month = TM_RTC_BCD2BIN(data->month);
  11028. 8025e7a: 0921 lsrs r1, r4, #4
  11029. 8025e7c: f004 040f and.w r4, r4, #15
  11030. 8025e80: fb02 4101 mla r1, r2, r1, r4
  11031. tmp.year = TM_RTC_BCD2BIN(data->year);
  11032. 8025e84: 092c lsrs r4, r5, #4
  11033. 8025e86: f005 050f and.w r5, r5, #15
  11034. 8025e8a: fb02 5404 mla r4, r2, r4, r5
  11035. tmp.hours = TM_RTC_BCD2BIN(data->hours);
  11036. 8025e8e: 795d ldrb r5, [r3, #5]
  11037. 8025e90: ea4f 1c15 mov.w ip, r5, lsr #4
  11038. 8025e94: f005 050f and.w r5, r5, #15
  11039. 8025e98: fb02 5c0c mla ip, r2, ip, r5
  11040. tmp.minutes = TM_RTC_BCD2BIN(data->minutes);
  11041. 8025e9c: 791d ldrb r5, [r3, #4]
  11042. 8025e9e: 092f lsrs r7, r5, #4
  11043. 8025ea0: f005 050f and.w r5, r5, #15
  11044. 8025ea4: fb02 5707 mla r7, r2, r7, r5
  11045. tmp.seconds = TM_RTC_BCD2BIN(data->seconds);
  11046. 8025ea8: ea4f 1518 mov.w r5, r8, lsr #4
  11047. 8025eac: f008 080f and.w r8, r8, #15
  11048. 8025eb0: fb02 8505 mla r5, r2, r5, r8
  11049. tmp.day = TM_RTC_BCD2BIN(data->day);
  11050. 8025eb4: f893 8006 ldrb.w r8, [r3, #6]
  11051. 8025eb8: ea4f 1918 mov.w r9, r8, lsr #4
  11052. 8025ebc: f008 080f and.w r8, r8, #15
  11053. 8025ec0: fb02 8209 mla r2, r2, r9, r8
  11054. TM_RTC_Result_t TM_RTC_SetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  11055. TM_RTC_t tmp;
  11056. /* Check date and time validation */
  11057. if (format == TM_RTC_Format_BCD) {
  11058. tmp.date = TM_RTC_BCD2BIN(data->date);
  11059. 8025ec4: b2c0 uxtb r0, r0
  11060. tmp.month = TM_RTC_BCD2BIN(data->month);
  11061. 8025ec6: b2c9 uxtb r1, r1
  11062. tmp.year = TM_RTC_BCD2BIN(data->year);
  11063. 8025ec8: b2e4 uxtb r4, r4
  11064. tmp.hours = TM_RTC_BCD2BIN(data->hours);
  11065. 8025eca: fa5f fc8c uxtb.w ip, ip
  11066. tmp.minutes = TM_RTC_BCD2BIN(data->minutes);
  11067. 8025ece: b2ff uxtb r7, r7
  11068. tmp.seconds = TM_RTC_BCD2BIN(data->seconds);
  11069. 8025ed0: b2ed uxtb r5, r5
  11070. tmp.day = TM_RTC_BCD2BIN(data->day);
  11071. 8025ed2: b2d2 uxtb r2, r2
  11072. 8025ed4: e006 b.n 8025ee4 <TM_RTC_SetDateTime+0x8c>
  11073. } else {
  11074. tmp.date = data->date;
  11075. tmp.month = data->month;
  11076. 8025ed6: 7a19 ldrb r1, [r3, #8]
  11077. tmp.year = data->year;
  11078. 8025ed8: 7a5c ldrb r4, [r3, #9]
  11079. tmp.hours = data->hours;
  11080. 8025eda: f893 c005 ldrb.w ip, [r3, #5]
  11081. tmp.minutes = data->minutes;
  11082. 8025ede: 791f ldrb r7, [r3, #4]
  11083. tmp.seconds = data->seconds;
  11084. 8025ee0: 781d ldrb r5, [r3, #0]
  11085. tmp.day = data->day;
  11086. 8025ee2: 799a ldrb r2, [r3, #6]
  11087. }
  11088. /* Check year and month */
  11089. if (
  11090. 8025ee4: 2c63 cmp r4, #99 ; 0x63
  11091. 8025ee6: d86c bhi.n 8025fc2 <TM_RTC_SetDateTime+0x16a>
  11092. tmp.year > 99 ||
  11093. 8025ee8: 2900 cmp r1, #0
  11094. 8025eea: d06a beq.n 8025fc2 <TM_RTC_SetDateTime+0x16a>
  11095. tmp.month == 0 ||
  11096. 8025eec: 290c cmp r1, #12
  11097. 8025eee: d868 bhi.n 8025fc2 <TM_RTC_SetDateTime+0x16a>
  11098. tmp.month > 12 ||
  11099. 8025ef0: 2800 cmp r0, #0
  11100. 8025ef2: d066 beq.n 8025fc2 <TM_RTC_SetDateTime+0x16a>
  11101. tmp.date == 0 ||
  11102. tmp.date > TM_RTC_Months[TM_RTC_LEAP_YEAR(2000 + tmp.year) ? 1 : 0][tmp.month - 1] ||
  11103. 8025ef4: f014 0f03 tst.w r4, #3
  11104. 8025ef8: d10a bne.n 8025f10 <TM_RTC_SetDateTime+0xb8>
  11105. 8025efa: f504 69fa add.w r9, r4, #2000 ; 0x7d0
  11106. 8025efe: f04f 0864 mov.w r8, #100 ; 0x64
  11107. 8025f02: fb99 faf8 sdiv sl, r9, r8
  11108. 8025f06: fb08 981a mls r8, r8, sl, r9
  11109. 8025f0a: f1b8 0f00 cmp.w r8, #0
  11110. 8025f0e: d10c bne.n 8025f2a <TM_RTC_SetDateTime+0xd2>
  11111. 8025f10: f504 64fa add.w r4, r4, #2000 ; 0x7d0
  11112. 8025f14: f44f 78c8 mov.w r8, #400 ; 0x190
  11113. 8025f18: fb94 f9f8 sdiv r9, r4, r8
  11114. 8025f1c: fb08 4419 mls r4, r8, r9, r4
  11115. 8025f20: f1d4 0401 rsbs r4, r4, #1
  11116. 8025f24: bf38 it cc
  11117. 8025f26: 2400 movcc r4, #0
  11118. 8025f28: e000 b.n 8025f2c <TM_RTC_SetDateTime+0xd4>
  11119. 8025f2a: 2401 movs r4, #1
  11120. 8025f2c: f8df 80a8 ldr.w r8, [pc, #168] ; 8025fd8 <TM_RTC_SetDateTime+0x180>
  11121. 8025f30: f04f 090c mov.w r9, #12
  11122. 8025f34: fb09 8404 mla r4, r9, r4, r8
  11123. 8025f38: 1861 adds r1, r4, r1
  11124. /* Check year and month */
  11125. if (
  11126. tmp.year > 99 ||
  11127. tmp.month == 0 ||
  11128. tmp.month > 12 ||
  11129. tmp.date == 0 ||
  11130. 8025f3a: f811 1c01 ldrb.w r1, [r1, #-1]
  11131. 8025f3e: 4281 cmp r1, r0
  11132. 8025f40: d33f bcc.n 8025fc2 <TM_RTC_SetDateTime+0x16a>
  11133. tmp.date > TM_RTC_Months[TM_RTC_LEAP_YEAR(2000 + tmp.year) ? 1 : 0][tmp.month - 1] ||
  11134. 8025f42: f1bc 0f17 cmp.w ip, #23
  11135. 8025f46: d83c bhi.n 8025fc2 <TM_RTC_SetDateTime+0x16a>
  11136. tmp.hours > 23 ||
  11137. 8025f48: 2f3b cmp r7, #59 ; 0x3b
  11138. 8025f4a: d83a bhi.n 8025fc2 <TM_RTC_SetDateTime+0x16a>
  11139. tmp.minutes > 59 ||
  11140. 8025f4c: 2d3b cmp r5, #59 ; 0x3b
  11141. 8025f4e: d838 bhi.n 8025fc2 <TM_RTC_SetDateTime+0x16a>
  11142. tmp.seconds > 59 ||
  11143. 8025f50: 2a00 cmp r2, #0
  11144. 8025f52: d036 beq.n 8025fc2 <TM_RTC_SetDateTime+0x16a>
  11145. tmp.day == 0 ||
  11146. 8025f54: 2a07 cmp r2, #7
  11147. 8025f56: d834 bhi.n 8025fc2 <TM_RTC_SetDateTime+0x16a>
  11148. /* Invalid date */
  11149. return TM_RTC_Result_Error;
  11150. }
  11151. /* Fill time */
  11152. RTC_TimeStruct.RTC_Hours = data->hours;
  11153. 8025f58: 795a ldrb r2, [r3, #5]
  11154. 8025f5a: 4d1b ldr r5, [pc, #108] ; (8025fc8 <TM_RTC_SetDateTime+0x170>)
  11155. RTC_TimeStruct.RTC_Minutes = data->minutes;
  11156. RTC_TimeStruct.RTC_Seconds = data->seconds;
  11157. /* Fill date */
  11158. RTC_DateStruct.RTC_Date = data->date;
  11159. 8025f5c: 4c1b ldr r4, [pc, #108] ; (8025fcc <TM_RTC_SetDateTime+0x174>)
  11160. /* Invalid date */
  11161. return TM_RTC_Result_Error;
  11162. }
  11163. /* Fill time */
  11164. RTC_TimeStruct.RTC_Hours = data->hours;
  11165. 8025f5e: 702a strb r2, [r5, #0]
  11166. RTC_TimeStruct.RTC_Minutes = data->minutes;
  11167. 8025f60: 791a ldrb r2, [r3, #4]
  11168. RTC_DateStruct.RTC_Month = data->month;
  11169. RTC_DateStruct.RTC_Year = data->year;
  11170. RTC_DateStruct.RTC_WeekDay = data->day;
  11171. /* Set the RTC time base to 1s and hours format to 24h */
  11172. RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
  11173. 8025f62: 481b ldr r0, [pc, #108] ; (8025fd0 <TM_RTC_SetDateTime+0x178>)
  11174. return TM_RTC_Result_Error;
  11175. }
  11176. /* Fill time */
  11177. RTC_TimeStruct.RTC_Hours = data->hours;
  11178. RTC_TimeStruct.RTC_Minutes = data->minutes;
  11179. 8025f64: 706a strb r2, [r5, #1]
  11180. RTC_TimeStruct.RTC_Seconds = data->seconds;
  11181. 8025f66: 781a ldrb r2, [r3, #0]
  11182. 8025f68: 70aa strb r2, [r5, #2]
  11183. /* Fill date */
  11184. RTC_DateStruct.RTC_Date = data->date;
  11185. 8025f6a: 79da ldrb r2, [r3, #7]
  11186. 8025f6c: 70a2 strb r2, [r4, #2]
  11187. RTC_DateStruct.RTC_Month = data->month;
  11188. 8025f6e: 7a1a ldrb r2, [r3, #8]
  11189. 8025f70: 7062 strb r2, [r4, #1]
  11190. RTC_DateStruct.RTC_Year = data->year;
  11191. 8025f72: 7a5a ldrb r2, [r3, #9]
  11192. RTC_DateStruct.RTC_WeekDay = data->day;
  11193. 8025f74: 799b ldrb r3, [r3, #6]
  11194. RTC_TimeStruct.RTC_Minutes = data->minutes;
  11195. RTC_TimeStruct.RTC_Seconds = data->seconds;
  11196. /* Fill date */
  11197. RTC_DateStruct.RTC_Date = data->date;
  11198. RTC_DateStruct.RTC_Month = data->month;
  11199. RTC_DateStruct.RTC_Year = data->year;
  11200. 8025f76: 70e2 strb r2, [r4, #3]
  11201. RTC_DateStruct.RTC_WeekDay = data->day;
  11202. /* Set the RTC time base to 1s and hours format to 24h */
  11203. RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
  11204. RTC_InitStruct.RTC_AsynchPrediv = RTC_ASYNC_PREDIV;
  11205. 8025f78: 221f movs r2, #31
  11206. RTC_DateStruct.RTC_Month = data->month;
  11207. RTC_DateStruct.RTC_Year = data->year;
  11208. RTC_DateStruct.RTC_WeekDay = data->day;
  11209. /* Set the RTC time base to 1s and hours format to 24h */
  11210. RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
  11211. 8025f7a: 2700 movs r7, #0
  11212. RTC_InitStruct.RTC_AsynchPrediv = RTC_ASYNC_PREDIV;
  11213. 8025f7c: 6042 str r2, [r0, #4]
  11214. RTC_InitStruct.RTC_SynchPrediv = RTC_SYNC_PREDIV;
  11215. 8025f7e: f502 7278 add.w r2, r2, #992 ; 0x3e0
  11216. RTC_TimeStruct.RTC_Seconds = data->seconds;
  11217. /* Fill date */
  11218. RTC_DateStruct.RTC_Date = data->date;
  11219. RTC_DateStruct.RTC_Month = data->month;
  11220. RTC_DateStruct.RTC_Year = data->year;
  11221. RTC_DateStruct.RTC_WeekDay = data->day;
  11222. 8025f82: 7023 strb r3, [r4, #0]
  11223. /* Set the RTC time base to 1s and hours format to 24h */
  11224. RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
  11225. 8025f84: 6007 str r7, [r0, #0]
  11226. RTC_InitStruct.RTC_AsynchPrediv = RTC_ASYNC_PREDIV;
  11227. RTC_InitStruct.RTC_SynchPrediv = RTC_SYNC_PREDIV;
  11228. 8025f86: 6082 str r2, [r0, #8]
  11229. RTC_Init(&RTC_InitStruct);
  11230. 8025f88: f7ff fb66 bl 8025658 <RTC_Init>
  11231. /* Set time */
  11232. if (format == TM_RTC_Format_BCD) {
  11233. 8025f8c: 2e01 cmp r6, #1
  11234. 8025f8e: d105 bne.n 8025f9c <TM_RTC_SetDateTime+0x144>
  11235. RTC_SetTime(RTC_Format_BCD, &RTC_TimeStruct);
  11236. 8025f90: 4630 mov r0, r6
  11237. 8025f92: 4629 mov r1, r5
  11238. 8025f94: f7ff fba4 bl 80256e0 <RTC_SetTime>
  11239. RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);
  11240. }
  11241. /* Set date */
  11242. if (format == TM_RTC_Format_BCD) {
  11243. RTC_SetDate(RTC_Format_BCD, &RTC_DateStruct);
  11244. 8025f98: 4630 mov r0, r6
  11245. 8025f9a: e004 b.n 8025fa6 <TM_RTC_SetDateTime+0x14e>
  11246. /* Set time */
  11247. if (format == TM_RTC_Format_BCD) {
  11248. RTC_SetTime(RTC_Format_BCD, &RTC_TimeStruct);
  11249. } else {
  11250. RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);
  11251. 8025f9c: 4638 mov r0, r7
  11252. 8025f9e: 4629 mov r1, r5
  11253. 8025fa0: f7ff fb9e bl 80256e0 <RTC_SetTime>
  11254. /* Set date */
  11255. if (format == TM_RTC_Format_BCD) {
  11256. RTC_SetDate(RTC_Format_BCD, &RTC_DateStruct);
  11257. } else {
  11258. RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct);
  11259. 8025fa4: 4638 mov r0, r7
  11260. 8025fa6: 4621 mov r1, r4
  11261. 8025fa8: f7ff fc08 bl 80257bc <RTC_SetDate>
  11262. }
  11263. if (TM_RTC_Status != RTC_STATUS_ZERO) {
  11264. 8025fac: 4b09 ldr r3, [pc, #36] ; (8025fd4 <TM_RTC_SetDateTime+0x17c>)
  11265. 8025fae: 6818 ldr r0, [r3, #0]
  11266. 8025fb0: b140 cbz r0, 8025fc4 <TM_RTC_SetDateTime+0x16c>
  11267. /* Write backup registers */
  11268. RTC_WriteBackupRegister(RTC_STATUS_REG, RTC_STATUS_TIME_OK);
  11269. 8025fb2: 2013 movs r0, #19
  11270. 8025fb4: f244 3121 movw r1, #17185 ; 0x4321
  11271. 8025fb8: f7ff fc6a bl 8025890 <RTC_WriteBackupRegister>
  11272. }
  11273. /* Return OK */
  11274. return TM_RTC_Result_Ok;
  11275. 8025fbc: 2000 movs r0, #0
  11276. 8025fbe: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  11277. tmp.seconds > 59 ||
  11278. tmp.day == 0 ||
  11279. tmp.day > 7
  11280. ) {
  11281. /* Invalid date */
  11282. return TM_RTC_Result_Error;
  11283. 8025fc2: 2001 movs r0, #1
  11284. RTC_WriteBackupRegister(RTC_STATUS_REG, RTC_STATUS_TIME_OK);
  11285. }
  11286. /* Return OK */
  11287. return TM_RTC_Result_Ok;
  11288. }
  11289. 8025fc4: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  11290. 8025fc8: 2000e4c0 .word 0x2000e4c0
  11291. 8025fcc: 2000e4d0 .word 0x2000e4d0
  11292. 8025fd0: 2000e4c4 .word 0x2000e4c4
  11293. 8025fd4: 20001948 .word 0x20001948
  11294. 8025fd8: 20000648 .word 0x20000648
  11295. 08025fdc <TM_RTC_Config>:
  11296. uint16_t TM_RTC_GetDaysInYear(uint8_t year) {
  11297. /* Return days in year */
  11298. return TM_RTC_DAYS_IN_YEAR(2000 + year);
  11299. }
  11300. void TM_RTC_Config(TM_RTC_ClockSource_t source) {
  11301. 8025fdc: b508 push {r3, lr}
  11302. if (source == TM_RTC_ClockSource_Internal) {
  11303. 8025fde: b950 cbnz r0, 8025ff6 <TM_RTC_Config+0x1a>
  11304. /* Enable the LSI OSC */
  11305. RCC_LSICmd(ENABLE);
  11306. 8025fe0: 2001 movs r0, #1
  11307. 8025fe2: f7ff fa37 bl 8025454 <RCC_LSICmd>
  11308. /* Wait till LSI is ready */
  11309. while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
  11310. 8025fe6: 2061 movs r0, #97 ; 0x61
  11311. 8025fe8: f7ff fae6 bl 80255b8 <RCC_GetFlagStatus>
  11312. 8025fec: 2800 cmp r0, #0
  11313. 8025fee: d0fa beq.n 8025fe6 <TM_RTC_Config+0xa>
  11314. /* Select the RTC Clock Source */
  11315. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
  11316. 8025ff0: f44f 7000 mov.w r0, #512 ; 0x200
  11317. 8025ff4: e00a b.n 802600c <TM_RTC_Config+0x30>
  11318. } else if (source == TM_RTC_ClockSource_External) {
  11319. 8025ff6: 2801 cmp r0, #1
  11320. 8025ff8: d10a bne.n 8026010 <TM_RTC_Config+0x34>
  11321. /* Enable the LSE OSC */
  11322. RCC_LSEConfig(RCC_LSE_ON);
  11323. 8025ffa: f7ff fa1b bl 8025434 <RCC_LSEConfig>
  11324. /* Wait till LSE is ready */
  11325. while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
  11326. 8025ffe: 2041 movs r0, #65 ; 0x41
  11327. 8026000: f7ff fada bl 80255b8 <RCC_GetFlagStatus>
  11328. 8026004: 2800 cmp r0, #0
  11329. 8026006: d0fa beq.n 8025ffe <TM_RTC_Config+0x22>
  11330. /* Select the RTC Clock Source */
  11331. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
  11332. 8026008: f44f 7080 mov.w r0, #256 ; 0x100
  11333. 802600c: f7ff fa6e bl 80254ec <RCC_RTCCLKConfig>
  11334. }
  11335. /* Enable the RTC Clock */
  11336. RCC_RTCCLKCmd(ENABLE);
  11337. 8026010: 2001 movs r0, #1
  11338. 8026012: f7ff fa83 bl 802551c <RCC_RTCCLKCmd>
  11339. /* Wait for register synchronization */
  11340. RTC_WaitForSynchro();
  11341. 8026016: f7ff fb41 bl 802569c <RTC_WaitForSynchro>
  11342. /* Write status */
  11343. RTC_WriteBackupRegister(RTC_STATUS_REG, RTC_STATUS_INIT_OK);
  11344. 802601a: 2013 movs r0, #19
  11345. 802601c: f241 2134 movw r1, #4660 ; 0x1234
  11346. }
  11347. 8026020: e8bd 4008 ldmia.w sp!, {r3, lr}
  11348. /* Wait for register synchronization */
  11349. RTC_WaitForSynchro();
  11350. /* Write status */
  11351. RTC_WriteBackupRegister(RTC_STATUS_REG, RTC_STATUS_INIT_OK);
  11352. 8026024: f7ff bc34 b.w 8025890 <RTC_WriteBackupRegister>
  11353. 08026028 <TM_RTC_GetUnixTimeStamp>:
  11354. /* Enable wakeup command */
  11355. RTC_WakeUpCmd(ENABLE);
  11356. }
  11357. }
  11358. uint32_t TM_RTC_GetUnixTimeStamp(TM_RTC_t* data) {
  11359. 8026028: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  11360. uint32_t days = 0, seconds = 0;
  11361. uint16_t i;
  11362. uint16_t year = (uint16_t) (data->year + 2000);
  11363. 802602c: 7a42 ldrb r2, [r0, #9]
  11364. 802602e: f240 73b2 movw r3, #1970 ; 0x7b2
  11365. 8026032: f502 62fa add.w r2, r2, #2000 ; 0x7d0
  11366. 8026036: 2100 movs r1, #0
  11367. if (year < TM_RTC_OFFSET_YEAR) {
  11368. return 0;
  11369. }
  11370. /* Days in back years */
  11371. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  11372. days += TM_RTC_DAYS_IN_YEAR(i);
  11373. 8026038: f44f 75c8 mov.w r5, #400 ; 0x190
  11374. 802603c: 2664 movs r6, #100 ; 0x64
  11375. 802603e: 079c lsls r4, r3, #30
  11376. 8026040: d108 bne.n 8026054 <TM_RTC_GetUnixTimeStamp+0x2c>
  11377. 8026042: fbb3 f4f6 udiv r4, r3, r6
  11378. 8026046: fb06 3414 mls r4, r6, r4, r3
  11379. 802604a: b2a4 uxth r4, r4
  11380. 802604c: b114 cbz r4, 8026054 <TM_RTC_GetUnixTimeStamp+0x2c>
  11381. 802604e: f44f 74b7 mov.w r4, #366 ; 0x16e
  11382. 8026052: e008 b.n 8026066 <TM_RTC_GetUnixTimeStamp+0x3e>
  11383. 8026054: fbb3 f4f5 udiv r4, r3, r5
  11384. 8026058: fb05 3414 mls r4, r5, r4, r3
  11385. 802605c: b2a4 uxth r4, r4
  11386. 802605e: 2c00 cmp r4, #0
  11387. 8026060: d0f5 beq.n 802604e <TM_RTC_GetUnixTimeStamp+0x26>
  11388. 8026062: f240 146d movw r4, #365 ; 0x16d
  11389. /* Year is below offset year */
  11390. if (year < TM_RTC_OFFSET_YEAR) {
  11391. return 0;
  11392. }
  11393. /* Days in back years */
  11394. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  11395. 8026066: 3301 adds r3, #1
  11396. 8026068: b29b uxth r3, r3
  11397. 802606a: 4293 cmp r3, r2
  11398. days += TM_RTC_DAYS_IN_YEAR(i);
  11399. 802606c: 4421 add r1, r4
  11400. /* Year is below offset year */
  11401. if (year < TM_RTC_OFFSET_YEAR) {
  11402. return 0;
  11403. }
  11404. /* Days in back years */
  11405. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  11406. 802606e: d3e6 bcc.n 802603e <TM_RTC_GetUnixTimeStamp+0x16>
  11407. days += TM_RTC_DAYS_IN_YEAR(i);
  11408. }
  11409. /* Days in current year */
  11410. for (i = 1; i < data->month; i++) {
  11411. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  11412. 8026070: 2364 movs r3, #100 ; 0x64
  11413. 8026072: fbb2 f7f3 udiv r7, r2, r3
  11414. 8026076: fb03 2317 mls r3, r3, r7, r2
  11415. 802607a: b29f uxth r7, r3
  11416. 802607c: f44f 73c8 mov.w r3, #400 ; 0x190
  11417. 8026080: fbb2 f4f3 udiv r4, r2, r3
  11418. 8026084: fb03 2414 mls r4, r3, r4, r2
  11419. 8026088: b2a4 uxth r4, r4
  11420. 802608a: f1d4 0401 rsbs r4, r4, #1
  11421. 802608e: bf38 it cc
  11422. 8026090: 2400 movcc r4, #0
  11423. /* Days in back years */
  11424. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  11425. days += TM_RTC_DAYS_IN_YEAR(i);
  11426. }
  11427. /* Days in current year */
  11428. for (i = 1; i < data->month; i++) {
  11429. 8026092: 7a06 ldrb r6, [r0, #8]
  11430. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  11431. 8026094: f8df c058 ldr.w ip, [pc, #88] ; 80260f0 <TM_RTC_GetUnixTimeStamp+0xc8>
  11432. 8026098: 2300 movs r3, #0
  11433. 802609a: f002 0203 and.w r2, r2, #3
  11434. 802609e: f04f 080c mov.w r8, #12
  11435. 80260a2: e00c b.n 80260be <TM_RTC_GetUnixTimeStamp+0x96>
  11436. 80260a4: b922 cbnz r2, 80260b0 <TM_RTC_GetUnixTimeStamp+0x88>
  11437. 80260a6: 2f00 cmp r7, #0
  11438. 80260a8: bf0c ite eq
  11439. 80260aa: 4625 moveq r5, r4
  11440. 80260ac: 2501 movne r5, #1
  11441. 80260ae: e000 b.n 80260b2 <TM_RTC_GetUnixTimeStamp+0x8a>
  11442. 80260b0: 4625 mov r5, r4
  11443. 80260b2: fb08 3505 mla r5, r8, r5, r3
  11444. 80260b6: 3301 adds r3, #1
  11445. 80260b8: f81c 5005 ldrb.w r5, [ip, r5]
  11446. 80260bc: 1949 adds r1, r1, r5
  11447. /* Days in back years */
  11448. for (i = TM_RTC_OFFSET_YEAR; i < year; i++) {
  11449. days += TM_RTC_DAYS_IN_YEAR(i);
  11450. }
  11451. /* Days in current year */
  11452. for (i = 1; i < data->month; i++) {
  11453. 80260be: 1c5d adds r5, r3, #1
  11454. 80260c0: b2ad uxth r5, r5
  11455. 80260c2: 42b5 cmp r5, r6
  11456. 80260c4: d3ee bcc.n 80260a4 <TM_RTC_GetUnixTimeStamp+0x7c>
  11457. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  11458. }
  11459. /* Day starts with 1 */
  11460. days += data->date - 1;
  11461. 80260c6: 79c3 ldrb r3, [r0, #7]
  11462. seconds = days * TM_RTC_SECONDS_PER_DAY;
  11463. seconds += data->hours * TM_RTC_SECONDS_PER_HOUR;
  11464. 80260c8: 7944 ldrb r4, [r0, #5]
  11465. /* Days in current year */
  11466. for (i = 1; i < data->month; i++) {
  11467. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  11468. }
  11469. /* Day starts with 1 */
  11470. days += data->date - 1;
  11471. 80260ca: 3b01 subs r3, #1
  11472. 80260cc: 1859 adds r1, r3, r1
  11473. seconds = days * TM_RTC_SECONDS_PER_DAY;
  11474. seconds += data->hours * TM_RTC_SECONDS_PER_HOUR;
  11475. seconds += data->minutes * TM_RTC_SECONDS_PER_MINUTE;
  11476. 80260ce: 7903 ldrb r3, [r0, #4]
  11477. 80260d0: 009a lsls r2, r3, #2
  11478. 80260d2: 019b lsls r3, r3, #6
  11479. 80260d4: 1a9a subs r2, r3, r2
  11480. days += TM_RTC_Months[TM_RTC_LEAP_YEAR(year)][i - 1];
  11481. }
  11482. /* Day starts with 1 */
  11483. days += data->date - 1;
  11484. seconds = days * TM_RTC_SECONDS_PER_DAY;
  11485. seconds += data->hours * TM_RTC_SECONDS_PER_HOUR;
  11486. 80260d6: f44f 6361 mov.w r3, #3600 ; 0xe10
  11487. 80260da: fb03 2304 mla r3, r3, r4, r2
  11488. seconds += data->minutes * TM_RTC_SECONDS_PER_MINUTE;
  11489. seconds += data->seconds;
  11490. 80260de: 7802 ldrb r2, [r0, #0]
  11491. /* seconds = days * 86400; */
  11492. return seconds;
  11493. }
  11494. 80260e0: 4802 ldr r0, [pc, #8] ; (80260ec <TM_RTC_GetUnixTimeStamp+0xc4>)
  11495. }
  11496. /* Day starts with 1 */
  11497. days += data->date - 1;
  11498. seconds = days * TM_RTC_SECONDS_PER_DAY;
  11499. seconds += data->hours * TM_RTC_SECONDS_PER_HOUR;
  11500. seconds += data->minutes * TM_RTC_SECONDS_PER_MINUTE;
  11501. 80260e2: 189b adds r3, r3, r2
  11502. seconds += data->seconds;
  11503. /* seconds = days * 86400; */
  11504. return seconds;
  11505. }
  11506. 80260e4: fb00 3001 mla r0, r0, r1, r3
  11507. 80260e8: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  11508. 80260ec: 00015180 .word 0x00015180
  11509. 80260f0: 20000648 .word 0x20000648
  11510. 080260f4 <TM_RTC_GetDateTime>:
  11511. /* Return status from set date time function */
  11512. return TM_RTC_SetDateTime(&tmp, TM_RTC_Format_BIN);
  11513. }
  11514. void TM_RTC_GetDateTime(TM_RTC_t* data, TM_RTC_Format_t format) {
  11515. 80260f4: b538 push {r3, r4, r5, lr}
  11516. 80260f6: 4604 mov r4, r0
  11517. uint32_t unix;
  11518. /* Get time */
  11519. if (format == TM_RTC_Format_BIN) {
  11520. 80260f8: 460d mov r5, r1
  11521. 80260fa: b909 cbnz r1, 8026100 <TM_RTC_GetDateTime+0xc>
  11522. RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct);
  11523. 80260fc: 4608 mov r0, r1
  11524. 80260fe: e000 b.n 8026102 <TM_RTC_GetDateTime+0xe>
  11525. } else {
  11526. RTC_GetTime(RTC_Format_BCD, &RTC_TimeStruct);
  11527. 8026100: 2001 movs r0, #1
  11528. 8026102: 4911 ldr r1, [pc, #68] ; (8026148 <TM_RTC_GetDateTime+0x54>)
  11529. 8026104: f7ff fb38 bl 8025778 <RTC_GetTime>
  11530. }
  11531. /* Format hours */
  11532. data->hours = RTC_TimeStruct.RTC_Hours;
  11533. 8026108: 4b0f ldr r3, [pc, #60] ; (8026148 <TM_RTC_GetDateTime+0x54>)
  11534. 802610a: 781a ldrb r2, [r3, #0]
  11535. 802610c: 7162 strb r2, [r4, #5]
  11536. data->minutes = RTC_TimeStruct.RTC_Minutes;
  11537. 802610e: 785a ldrb r2, [r3, #1]
  11538. data->seconds = RTC_TimeStruct.RTC_Seconds;
  11539. 8026110: 789b ldrb r3, [r3, #2]
  11540. RTC_GetTime(RTC_Format_BCD, &RTC_TimeStruct);
  11541. }
  11542. /* Format hours */
  11543. data->hours = RTC_TimeStruct.RTC_Hours;
  11544. data->minutes = RTC_TimeStruct.RTC_Minutes;
  11545. 8026112: 7122 strb r2, [r4, #4]
  11546. data->seconds = RTC_TimeStruct.RTC_Seconds;
  11547. 8026114: 7023 strb r3, [r4, #0]
  11548. /* Get subseconds */
  11549. data->subseconds = RTC->SSR;
  11550. 8026116: 4b0d ldr r3, [pc, #52] ; (802614c <TM_RTC_GetDateTime+0x58>)
  11551. 8026118: 6a9b ldr r3, [r3, #40] ; 0x28
  11552. 802611a: 8063 strh r3, [r4, #2]
  11553. /* Get date */
  11554. if (format == TM_RTC_Format_BIN) {
  11555. 802611c: b90d cbnz r5, 8026122 <TM_RTC_GetDateTime+0x2e>
  11556. RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
  11557. 802611e: 4628 mov r0, r5
  11558. 8026120: e000 b.n 8026124 <TM_RTC_GetDateTime+0x30>
  11559. } else {
  11560. RTC_GetDate(RTC_Format_BCD, &RTC_DateStruct);
  11561. 8026122: 2001 movs r0, #1
  11562. 8026124: 490a ldr r1, [pc, #40] ; (8026150 <TM_RTC_GetDateTime+0x5c>)
  11563. 8026126: f7ff fb93 bl 8025850 <RTC_GetDate>
  11564. }
  11565. /* Format date */
  11566. data->year = RTC_DateStruct.RTC_Year;
  11567. 802612a: 4b09 ldr r3, [pc, #36] ; (8026150 <TM_RTC_GetDateTime+0x5c>)
  11568. 802612c: 78da ldrb r2, [r3, #3]
  11569. 802612e: 7262 strb r2, [r4, #9]
  11570. data->month = RTC_DateStruct.RTC_Month;
  11571. 8026130: 785a ldrb r2, [r3, #1]
  11572. 8026132: 7222 strb r2, [r4, #8]
  11573. data->date = RTC_DateStruct.RTC_Date;
  11574. 8026134: 789a ldrb r2, [r3, #2]
  11575. data->day = RTC_DateStruct.RTC_WeekDay;
  11576. 8026136: 781b ldrb r3, [r3, #0]
  11577. }
  11578. /* Format date */
  11579. data->year = RTC_DateStruct.RTC_Year;
  11580. data->month = RTC_DateStruct.RTC_Month;
  11581. data->date = RTC_DateStruct.RTC_Date;
  11582. 8026138: 71e2 strb r2, [r4, #7]
  11583. data->day = RTC_DateStruct.RTC_WeekDay;
  11584. 802613a: 71a3 strb r3, [r4, #6]
  11585. /* Calculate unix offset */
  11586. unix = TM_RTC_GetUnixTimeStamp(data);
  11587. 802613c: 4620 mov r0, r4
  11588. 802613e: f7ff ff73 bl 8026028 <TM_RTC_GetUnixTimeStamp>
  11589. data->unix = unix;
  11590. 8026142: 60e0 str r0, [r4, #12]
  11591. 8026144: bd38 pop {r3, r4, r5, pc}
  11592. 8026146: bf00 nop
  11593. 8026148: 2000e4c0 .word 0x2000e4c0
  11594. 802614c: 40002800 .word 0x40002800
  11595. 8026150: 2000e4d0 .word 0x2000e4d0
  11596. 08026154 <TM_RTC_Init>:
  11597. }
  11598. }
  11599. uint32_t TM_RTC_Init(TM_RTC_ClockSource_t source)
  11600. {
  11601. 8026154: b5f0 push {r4, r5, r6, r7, lr}
  11602. uint32_t status;
  11603. uint8_t stat = 1;
  11604. TM_RTC_t datatime;
  11605. /* Enable PWR peripheral clock */
  11606. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  11607. 8026156: 2101 movs r1, #1
  11608. }
  11609. }
  11610. uint32_t TM_RTC_Init(TM_RTC_ClockSource_t source)
  11611. {
  11612. 8026158: b085 sub sp, #20
  11613. 802615a: 4605 mov r5, r0
  11614. uint32_t status;
  11615. uint8_t stat = 1;
  11616. TM_RTC_t datatime;
  11617. /* Enable PWR peripheral clock */
  11618. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  11619. 802615c: f04f 5080 mov.w r0, #268435456 ; 0x10000000
  11620. 8026160: f7ff f9ee bl 8025540 <RCC_APB1PeriphClockCmd>
  11621. /* Allow access to BKP Domain */
  11622. PWR_BackupAccessCmd(ENABLE);
  11623. 8026164: 2001 movs r0, #1
  11624. 8026166: f7ff f95f bl 8025428 <PWR_BackupAccessCmd>
  11625. /* Get RTC status */
  11626. status = RTC_ReadBackupRegister(RTC_STATUS_REG);
  11627. 802616a: 2013 movs r0, #19
  11628. 802616c: f7ff fba0 bl 80258b0 <RTC_ReadBackupRegister>
  11629. if (status == RTC_STATUS_TIME_OK)
  11630. 8026170: f244 3321 movw r3, #17185 ; 0x4321
  11631. 8026174: 4298 cmp r0, r3
  11632. 8026176: 4e25 ldr r6, [pc, #148] ; (802620c <TM_RTC_Init+0xb8>)
  11633. 8026178: d113 bne.n 80261a2 <TM_RTC_Init+0x4e>
  11634. {
  11635. TM_RTC_Status = RTC_STATUS_TIME_OK;
  11636. 802617a: 6030 str r0, [r6, #0]
  11637. /* Start internal clock if we choose internal clock */
  11638. if (source == TM_RTC_ClockSource_Internal)
  11639. 802617c: b915 cbnz r5, 8026184 <TM_RTC_Init+0x30>
  11640. TM_RTC_Config(TM_RTC_ClockSource_Internal);
  11641. 802617e: 4628 mov r0, r5
  11642. 8026180: f7ff ff2c bl 8025fdc <TM_RTC_Config>
  11643. /* Wait for RTC APB registers synchronisation (needed after start-up from Reset) */
  11644. RTC_WaitForSynchro();
  11645. 8026184: f7ff fa8a bl 802569c <RTC_WaitForSynchro>
  11646. /* Clear interrupt flags */
  11647. RTC_ClearITPendingBit(RTC_IT_WUT);
  11648. 8026188: f44f 4080 mov.w r0, #16384 ; 0x4000
  11649. 802618c: f7ff fbb8 bl 8025900 <RTC_ClearITPendingBit>
  11650. EXTI->PR = 0x00400000;
  11651. 8026190: 4b1f ldr r3, [pc, #124] ; (8026210 <TM_RTC_Init+0xbc>)
  11652. 8026192: f44f 0280 mov.w r2, #4194304 ; 0x400000
  11653. 8026196: 615a str r2, [r3, #20]
  11654. /* Get date and time */
  11655. TM_RTC_GetDateTime(&datatime, TM_RTC_Format_BIN);
  11656. 8026198: 4668 mov r0, sp
  11657. 802619a: 2100 movs r1, #0
  11658. 802619c: f7ff ffaa bl 80260f4 <TM_RTC_GetDateTime>
  11659. 80261a0: e02f b.n 8026202 <TM_RTC_Init+0xae>
  11660. }
  11661. else if (status == RTC_STATUS_INIT_OK)
  11662. 80261a2: f241 2734 movw r7, #4660 ; 0x1234
  11663. 80261a6: 42b8 cmp r0, r7
  11664. 80261a8: d10f bne.n 80261ca <TM_RTC_Init+0x76>
  11665. {
  11666. TM_RTC_Status = RTC_STATUS_INIT_OK;
  11667. 80261aa: 6030 str r0, [r6, #0]
  11668. /* Start internal clock if we choose internal clock */
  11669. if (source == TM_RTC_ClockSource_Internal)
  11670. 80261ac: b915 cbnz r5, 80261b4 <TM_RTC_Init+0x60>
  11671. TM_RTC_Config(TM_RTC_ClockSource_Internal);
  11672. 80261ae: 4628 mov r0, r5
  11673. 80261b0: f7ff ff14 bl 8025fdc <TM_RTC_Config>
  11674. /* Wait for RTC APB registers synchronisation (needed after start-up from Reset) */
  11675. RTC_WaitForSynchro();
  11676. 80261b4: f7ff fa72 bl 802569c <RTC_WaitForSynchro>
  11677. /* Clear interrupt flags */
  11678. RTC_ClearITPendingBit(RTC_IT_WUT);
  11679. 80261b8: f44f 4080 mov.w r0, #16384 ; 0x4000
  11680. 80261bc: f7ff fba0 bl 8025900 <RTC_ClearITPendingBit>
  11681. EXTI->PR = 0x00400000;
  11682. 80261c0: 4b13 ldr r3, [pc, #76] ; (8026210 <TM_RTC_Init+0xbc>)
  11683. 80261c2: f44f 0280 mov.w r2, #4194304 ; 0x400000
  11684. 80261c6: 615a str r2, [r3, #20]
  11685. 80261c8: e01b b.n 8026202 <TM_RTC_Init+0xae>
  11686. /* Get date and time */
  11687. //TM_RTC_GetDateTime(&datatime, TM_RTC_Format_BIN);
  11688. }
  11689. else
  11690. {
  11691. TM_RTC_Status = RTC_STATUS_ZERO;
  11692. 80261ca: 2400 movs r4, #0
  11693. /* Return status = 0 -> RTC Never initialized before */
  11694. stat = RTC_STATUS_ZERO;
  11695. /* Config RTC */
  11696. TM_RTC_Config(source);
  11697. 80261cc: 4628 mov r0, r5
  11698. /* Get date and time */
  11699. //TM_RTC_GetDateTime(&datatime, TM_RTC_Format_BIN);
  11700. }
  11701. else
  11702. {
  11703. TM_RTC_Status = RTC_STATUS_ZERO;
  11704. 80261ce: 6034 str r4, [r6, #0]
  11705. /* Return status = 0 -> RTC Never initialized before */
  11706. stat = RTC_STATUS_ZERO;
  11707. /* Config RTC */
  11708. TM_RTC_Config(source);
  11709. 80261d0: f7ff ff04 bl 8025fdc <TM_RTC_Config>
  11710. datatime.day = 1;
  11711. datatime.month = 1;
  11712. datatime.year = 0;
  11713. datatime.hours = 0;
  11714. datatime.minutes = 0;
  11715. datatime.seconds = 0;
  11716. 80261d4: a804 add r0, sp, #16
  11717. stat = RTC_STATUS_ZERO;
  11718. /* Config RTC */
  11719. TM_RTC_Config(source);
  11720. /* Set date and time */
  11721. datatime.date = 1;
  11722. 80261d6: 2301 movs r3, #1
  11723. datatime.day = 1;
  11724. datatime.month = 1;
  11725. datatime.year = 0;
  11726. datatime.hours = 0;
  11727. datatime.minutes = 0;
  11728. datatime.seconds = 0;
  11729. 80261d8: f800 4d10 strb.w r4, [r0, #-16]!
  11730. /* Set date and time */
  11731. TM_RTC_SetDateTime(&datatime, TM_RTC_Format_BIN);
  11732. 80261dc: 4621 mov r1, r4
  11733. 80261de: 4668 mov r0, sp
  11734. stat = RTC_STATUS_ZERO;
  11735. /* Config RTC */
  11736. TM_RTC_Config(source);
  11737. /* Set date and time */
  11738. datatime.date = 1;
  11739. 80261e0: f88d 3007 strb.w r3, [sp, #7]
  11740. datatime.day = 1;
  11741. 80261e4: f88d 3006 strb.w r3, [sp, #6]
  11742. datatime.month = 1;
  11743. 80261e8: f88d 3008 strb.w r3, [sp, #8]
  11744. datatime.year = 0;
  11745. 80261ec: f88d 4009 strb.w r4, [sp, #9]
  11746. datatime.hours = 0;
  11747. 80261f0: f88d 4005 strb.w r4, [sp, #5]
  11748. datatime.minutes = 0;
  11749. 80261f4: f88d 4004 strb.w r4, [sp, #4]
  11750. datatime.seconds = 0;
  11751. /* Set date and time */
  11752. TM_RTC_SetDateTime(&datatime, TM_RTC_Format_BIN);
  11753. 80261f8: f7ff fe2e bl 8025e58 <TM_RTC_SetDateTime>
  11754. /* Initialized OK */
  11755. TM_RTC_Status = RTC_STATUS_INIT_OK;
  11756. 80261fc: 6037 str r7, [r6, #0]
  11757. }
  11758. /* If first time initialized */
  11759. if (stat == RTC_STATUS_ZERO)
  11760. return 0;
  11761. 80261fe: 4620 mov r0, r4
  11762. 8026200: e001 b.n 8026206 <TM_RTC_Init+0xb2>
  11763. return TM_RTC_Status;
  11764. 8026202: 4b02 ldr r3, [pc, #8] ; (802620c <TM_RTC_Init+0xb8>)
  11765. 8026204: 6818 ldr r0, [r3, #0]
  11766. }
  11767. 8026206: b005 add sp, #20
  11768. 8026208: bdf0 pop {r4, r5, r6, r7, pc}
  11769. 802620a: bf00 nop
  11770. 802620c: 20001948 .word 0x20001948
  11771. 8026210: 40013c00 .word 0x40013c00
  11772. 08026214 <TM_RTC_RequestHandler>:
  11773. /* Read data from backup register */
  11774. return *(uint32_t *)((&RTC->BKP0R) + 4 * location);
  11775. }
  11776. /* Callbacks */
  11777. __weak void TM_RTC_RequestHandler(void) {
  11778. 8026214: 4770 bx lr
  11779. 08026216 <TM_RTC_AlarmAHandler>:
  11780. /* If user needs this function, then they should be defined separatelly in your project */
  11781. }
  11782. __weak void TM_RTC_AlarmAHandler(void) {
  11783. 8026216: 4770 bx lr
  11784. 08026218 <TM_RTC_AlarmBHandler>:
  11785. /* If user needs this function, then they should be defined separatelly in your project */
  11786. }
  11787. __weak void TM_RTC_AlarmBHandler(void) {
  11788. 8026218: 4770 bx lr
  11789. 802621a: 0000 movs r0, r0
  11790. 0802621c <RTC_WKUP_IRQHandler>:
  11791. /* If user needs this function, then they should be defined separatelly in your project */
  11792. }
  11793. /* Private RTC IRQ handlers */
  11794. void RTC_WKUP_IRQHandler(void) {
  11795. 802621c: b508 push {r3, lr}
  11796. /* Check for RTC interrupt */
  11797. if (RTC_GetITStatus(RTC_IT_WUT) != RESET) {
  11798. 802621e: f44f 4080 mov.w r0, #16384 ; 0x4000
  11799. 8026222: f7ff fb55 bl 80258d0 <RTC_GetITStatus>
  11800. 8026226: b128 cbz r0, 8026234 <RTC_WKUP_IRQHandler+0x18>
  11801. /* Clear interrupt flags */
  11802. RTC_ClearITPendingBit(RTC_IT_WUT);
  11803. 8026228: f44f 4080 mov.w r0, #16384 ; 0x4000
  11804. 802622c: f7ff fb68 bl 8025900 <RTC_ClearITPendingBit>
  11805. /* Call user function */
  11806. TM_RTC_RequestHandler();
  11807. 8026230: f7ff fff0 bl 8026214 <TM_RTC_RequestHandler>
  11808. }
  11809. /* Clear EXTI line 22 bit */
  11810. EXTI->PR = 0x00400000;
  11811. 8026234: 4b02 ldr r3, [pc, #8] ; (8026240 <RTC_WKUP_IRQHandler+0x24>)
  11812. 8026236: f44f 0280 mov.w r2, #4194304 ; 0x400000
  11813. 802623a: 615a str r2, [r3, #20]
  11814. 802623c: bd08 pop {r3, pc}
  11815. 802623e: bf00 nop
  11816. 8026240: 40013c00 .word 0x40013c00
  11817. 08026244 <RTC_Alarm_IRQHandler>:
  11818. }
  11819. void RTC_Alarm_IRQHandler(void) {
  11820. 8026244: b508 push {r3, lr}
  11821. /* RTC Alarm A check */
  11822. if (RTC_GetITStatus(RTC_IT_ALRA) != RESET) {
  11823. 8026246: f44f 5080 mov.w r0, #4096 ; 0x1000
  11824. 802624a: f7ff fb41 bl 80258d0 <RTC_GetITStatus>
  11825. 802624e: b128 cbz r0, 802625c <RTC_Alarm_IRQHandler+0x18>
  11826. /* Clear RTC Alarm A interrupt flag */
  11827. RTC_ClearITPendingBit(RTC_IT_ALRA);
  11828. 8026250: f44f 5080 mov.w r0, #4096 ; 0x1000
  11829. 8026254: f7ff fb54 bl 8025900 <RTC_ClearITPendingBit>
  11830. /* Call user function for Alarm A */
  11831. TM_RTC_AlarmAHandler();
  11832. 8026258: f7ff ffdd bl 8026216 <TM_RTC_AlarmAHandler>
  11833. }
  11834. /* RTC Alarm B check */
  11835. if (RTC_GetITStatus(RTC_IT_ALRB) != RESET) {
  11836. 802625c: f44f 5000 mov.w r0, #8192 ; 0x2000
  11837. 8026260: f7ff fb36 bl 80258d0 <RTC_GetITStatus>
  11838. 8026264: b128 cbz r0, 8026272 <RTC_Alarm_IRQHandler+0x2e>
  11839. /* Clear RTC Alarm A interrupt flag */
  11840. RTC_ClearITPendingBit(RTC_IT_ALRB);
  11841. 8026266: f44f 5000 mov.w r0, #8192 ; 0x2000
  11842. 802626a: f7ff fb49 bl 8025900 <RTC_ClearITPendingBit>
  11843. /* Call user function for Alarm B */
  11844. TM_RTC_AlarmBHandler();
  11845. 802626e: f7ff ffd3 bl 8026218 <TM_RTC_AlarmBHandler>
  11846. }
  11847. /* Clear EXTI line 17 bit */
  11848. EXTI->PR = 0x00020000;
  11849. 8026272: 4b02 ldr r3, [pc, #8] ; (802627c <RTC_Alarm_IRQHandler+0x38>)
  11850. 8026274: f44f 3200 mov.w r2, #131072 ; 0x20000
  11851. 8026278: 615a str r2, [r3, #20]
  11852. 802627a: bd08 pop {r3, pc}
  11853. 802627c: 40013c00 .word 0x40013c00
  11854. 08026280 <RTC_SetProfTime>:
  11855. /**
  11856. * @brief Установливает время срабатывания профилактики сульфатации
  11857. */
  11858. void RTC_SetProfTime(char *str)
  11859. {
  11860. 8026280: b530 push {r4, r5, lr}
  11861. uint32_t unixTime;
  11862. uint8_t i = 0;
  11863. /* Get date */
  11864. tmp.date = 0;
  11865. while (TM_RTC_CHARISNUM(*(str + i))) {
  11866. 8026282: 2200 movs r2, #0
  11867. /**
  11868. * @brief Установливает время срабатывания профилактики сульфатации
  11869. */
  11870. void RTC_SetProfTime(char *str)
  11871. {
  11872. 8026284: b085 sub sp, #20
  11873. TM_RTC_t tmp;
  11874. uint32_t unixTime;
  11875. uint8_t i = 0;
  11876. 8026286: 4613 mov r3, r2
  11877. /* Get date */
  11878. tmp.date = 0;
  11879. while (TM_RTC_CHARISNUM(*(str + i))) {
  11880. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11881. 8026288: 250a movs r5, #10
  11882. uint32_t unixTime;
  11883. uint8_t i = 0;
  11884. /* Get date */
  11885. tmp.date = 0;
  11886. while (TM_RTC_CHARISNUM(*(str + i))) {
  11887. 802628a: e006 b.n 802629a <RTC_SetProfTime+0x1a>
  11888. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11889. 802628c: fb05 1202 mla r2, r5, r2, r1
  11890. 8026290: 3a30 subs r2, #48 ; 0x30
  11891. i++;
  11892. 8026292: 3301 adds r3, #1
  11893. uint8_t i = 0;
  11894. /* Get date */
  11895. tmp.date = 0;
  11896. while (TM_RTC_CHARISNUM(*(str + i))) {
  11897. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11898. 8026294: f002 02ff and.w r2, r2, #255 ; 0xff
  11899. i++;
  11900. 8026298: b2db uxtb r3, r3
  11901. uint32_t unixTime;
  11902. uint8_t i = 0;
  11903. /* Get date */
  11904. tmp.date = 0;
  11905. while (TM_RTC_CHARISNUM(*(str + i))) {
  11906. 802629a: 5cc1 ldrb r1, [r0, r3]
  11907. 802629c: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  11908. 80262a0: 2c09 cmp r4, #9
  11909. 80262a2: d9f3 bls.n 802628c <RTC_SetProfTime+0xc>
  11910. tmp.date = tmp.date * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11911. i++;
  11912. }
  11913. i++;
  11914. 80262a4: 3301 adds r3, #1
  11915. 80262a6: f88d 2007 strb.w r2, [sp, #7]
  11916. 80262aa: b2db uxtb r3, r3
  11917. /* Get month */
  11918. tmp.month = 0;
  11919. while (TM_RTC_CHARISNUM(*(str + i))) {
  11920. 80262ac: 2200 movs r2, #0
  11921. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11922. 80262ae: 250a movs r5, #10
  11923. }
  11924. i++;
  11925. /* Get month */
  11926. tmp.month = 0;
  11927. while (TM_RTC_CHARISNUM(*(str + i))) {
  11928. 80262b0: e006 b.n 80262c0 <RTC_SetProfTime+0x40>
  11929. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11930. 80262b2: fb05 1202 mla r2, r5, r2, r1
  11931. 80262b6: 3a30 subs r2, #48 ; 0x30
  11932. i++;
  11933. 80262b8: 3301 adds r3, #1
  11934. i++;
  11935. /* Get month */
  11936. tmp.month = 0;
  11937. while (TM_RTC_CHARISNUM(*(str + i))) {
  11938. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11939. 80262ba: f002 02ff and.w r2, r2, #255 ; 0xff
  11940. i++;
  11941. 80262be: b2db uxtb r3, r3
  11942. }
  11943. i++;
  11944. /* Get month */
  11945. tmp.month = 0;
  11946. while (TM_RTC_CHARISNUM(*(str + i))) {
  11947. 80262c0: 5cc1 ldrb r1, [r0, r3]
  11948. 80262c2: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  11949. 80262c6: 2c09 cmp r4, #9
  11950. 80262c8: d9f3 bls.n 80262b2 <RTC_SetProfTime+0x32>
  11951. tmp.month = tmp.month * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11952. i++;
  11953. }
  11954. //i++;
  11955. i+=3;
  11956. 80262ca: 3303 adds r3, #3
  11957. 80262cc: f88d 2008 strb.w r2, [sp, #8]
  11958. 80262d0: b2db uxtb r3, r3
  11959. /* Get year */
  11960. tmp.year = 0;
  11961. while (TM_RTC_CHARISNUM(*(str + i))) {
  11962. 80262d2: 2200 movs r2, #0
  11963. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11964. 80262d4: 250a movs r5, #10
  11965. //i++;
  11966. i+=3;
  11967. /* Get year */
  11968. tmp.year = 0;
  11969. while (TM_RTC_CHARISNUM(*(str + i))) {
  11970. 80262d6: e006 b.n 80262e6 <RTC_SetProfTime+0x66>
  11971. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11972. 80262d8: fb05 1202 mla r2, r5, r2, r1
  11973. 80262dc: 3a30 subs r2, #48 ; 0x30
  11974. i++;
  11975. 80262de: 3301 adds r3, #1
  11976. i+=3;
  11977. /* Get year */
  11978. tmp.year = 0;
  11979. while (TM_RTC_CHARISNUM(*(str + i))) {
  11980. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11981. 80262e0: f002 02ff and.w r2, r2, #255 ; 0xff
  11982. i++;
  11983. 80262e4: b2db uxtb r3, r3
  11984. //i++;
  11985. i+=3;
  11986. /* Get year */
  11987. tmp.year = 0;
  11988. while (TM_RTC_CHARISNUM(*(str + i))) {
  11989. 80262e6: 5cc1 ldrb r1, [r0, r3]
  11990. 80262e8: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  11991. 80262ec: 2c09 cmp r4, #9
  11992. 80262ee: d9f3 bls.n 80262d8 <RTC_SetProfTime+0x58>
  11993. tmp.year = tmp.year * 10 + TM_RTC_CHAR2NUM(*(str + i));
  11994. i++;
  11995. }
  11996. i++;
  11997. i++;
  11998. 80262f0: 3302 adds r3, #2
  11999. 80262f2: f88d 2009 strb.w r2, [sp, #9]
  12000. 80262f6: b2db uxtb r3, r3
  12001. /* Get hours */
  12002. tmp.hours = 0;
  12003. while (TM_RTC_CHARISNUM(*(str + i))) {
  12004. 80262f8: 2200 movs r2, #0
  12005. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12006. 80262fa: 250a movs r5, #10
  12007. i++;
  12008. i++;
  12009. /* Get hours */
  12010. tmp.hours = 0;
  12011. while (TM_RTC_CHARISNUM(*(str + i))) {
  12012. 80262fc: e006 b.n 802630c <RTC_SetProfTime+0x8c>
  12013. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12014. 80262fe: fb05 1202 mla r2, r5, r2, r1
  12015. 8026302: 3a30 subs r2, #48 ; 0x30
  12016. i++;
  12017. 8026304: 3301 adds r3, #1
  12018. i++;
  12019. /* Get hours */
  12020. tmp.hours = 0;
  12021. while (TM_RTC_CHARISNUM(*(str + i))) {
  12022. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12023. 8026306: f002 02ff and.w r2, r2, #255 ; 0xff
  12024. i++;
  12025. 802630a: b2db uxtb r3, r3
  12026. i++;
  12027. i++;
  12028. /* Get hours */
  12029. tmp.hours = 0;
  12030. while (TM_RTC_CHARISNUM(*(str + i))) {
  12031. 802630c: 5cc1 ldrb r1, [r0, r3]
  12032. 802630e: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12033. 8026312: 2c09 cmp r4, #9
  12034. 8026314: d9f3 bls.n 80262fe <RTC_SetProfTime+0x7e>
  12035. tmp.hours = tmp.hours * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12036. i++;
  12037. }
  12038. i++;
  12039. 8026316: 3301 adds r3, #1
  12040. 8026318: f88d 2005 strb.w r2, [sp, #5]
  12041. 802631c: b2db uxtb r3, r3
  12042. /* Get minutes */
  12043. tmp.minutes = 0;
  12044. while (TM_RTC_CHARISNUM(*(str + i))) {
  12045. 802631e: 2200 movs r2, #0
  12046. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12047. 8026320: 250a movs r5, #10
  12048. }
  12049. i++;
  12050. /* Get minutes */
  12051. tmp.minutes = 0;
  12052. while (TM_RTC_CHARISNUM(*(str + i))) {
  12053. 8026322: e006 b.n 8026332 <RTC_SetProfTime+0xb2>
  12054. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12055. 8026324: fb05 1202 mla r2, r5, r2, r1
  12056. 8026328: 3a30 subs r2, #48 ; 0x30
  12057. i++;
  12058. 802632a: 3301 adds r3, #1
  12059. i++;
  12060. /* Get minutes */
  12061. tmp.minutes = 0;
  12062. while (TM_RTC_CHARISNUM(*(str + i))) {
  12063. tmp.minutes = tmp.minutes * 10 + TM_RTC_CHAR2NUM(*(str + i));
  12064. 802632c: f002 02ff and.w r2, r2, #255 ; 0xff
  12065. i++;
  12066. 8026330: b2db uxtb r3, r3
  12067. }
  12068. i++;
  12069. /* Get minutes */
  12070. tmp.minutes = 0;
  12071. while (TM_RTC_CHARISNUM(*(str + i))) {
  12072. 8026332: 5cc1 ldrb r1, [r0, r3]
  12073. 8026334: f1a1 0430 sub.w r4, r1, #48 ; 0x30
  12074. 8026338: 2c09 cmp r4, #9
  12075. 802633a: d9f3 bls.n 8026324 <RTC_SetProfTime+0xa4>
  12076. i++;
  12077. }
  12078. i++;
  12079. /* Get seconds */
  12080. tmp.seconds = 0;
  12081. 802633c: 2300 movs r3, #0
  12082. 802633e: f88d 3000 strb.w r3, [sp]
  12083. /* Устанавливаем +1 для профилактики */
  12084. tmp.year += 1;
  12085. 8026342: f89d 3009 ldrb.w r3, [sp, #9]
  12086. 8026346: f88d 2004 strb.w r2, [sp, #4]
  12087. 802634a: 3301 adds r3, #1
  12088. unixTime = TM_RTC_GetUnixTimeStamp(&tmp);
  12089. 802634c: 4668 mov r0, sp
  12090. /* Get seconds */
  12091. tmp.seconds = 0;
  12092. /* Устанавливаем +1 для профилактики */
  12093. tmp.year += 1;
  12094. 802634e: f88d 3009 strb.w r3, [sp, #9]
  12095. unixTime = TM_RTC_GetUnixTimeStamp(&tmp);
  12096. 8026352: f7ff fe69 bl 8026028 <TM_RTC_GetUnixTimeStamp>
  12097. if (location > 18) {
  12098. return;
  12099. }
  12100. /* Write data to backup register */
  12101. *(uint32_t *)((&RTC->BKP0R) + 4 * location) = value;
  12102. 8026356: 4b02 ldr r3, [pc, #8] ; (8026360 <RTC_SetProfTime+0xe0>)
  12103. 8026358: 6018 str r0, [r3, #0]
  12104. /* Устанавливаем +1 для профилактики */
  12105. tmp.year += 1;
  12106. unixTime = TM_RTC_GetUnixTimeStamp(&tmp);
  12107. TM_RTC_WriteBackupRegister(RTC_BKP_DR0, unixTime);
  12108. 802635a: b005 add sp, #20
  12109. 802635c: bd30 pop {r4, r5, pc}
  12110. 802635e: bf00 nop
  12111. 8026360: 40002850 .word 0x40002850
  12112. 08026364 <spi_tx_rx>:
  12113. //static TN_MUTEX spi_mutex;
  12114. static uint8_t spi_tx_rx(uint8_t byte) {
  12115. while (!(SPI2->SR & SPI_SR_TXE)) {}
  12116. 8026364: 4907 ldr r1, [pc, #28] ; (8026384 <spi_tx_rx+0x20>)
  12117. 8026366: 890a ldrh r2, [r1, #8]
  12118. 8026368: 4b06 ldr r3, [pc, #24] ; (8026384 <spi_tx_rx+0x20>)
  12119. 802636a: f002 0202 and.w r2, r2, #2
  12120. 802636e: b292 uxth r2, r2
  12121. 8026370: 2a00 cmp r2, #0
  12122. 8026372: d0f8 beq.n 8026366 <spi_tx_rx+0x2>
  12123. SPI2->DR = byte;
  12124. 8026374: 8198 strh r0, [r3, #12]
  12125. while (!(SPI2->SR & SPI_SR_RXNE)) {}
  12126. 8026376: 891a ldrh r2, [r3, #8]
  12127. 8026378: 07d2 lsls r2, r2, #31
  12128. 802637a: d5fc bpl.n 8026376 <spi_tx_rx+0x12>
  12129. return SPI2->DR;
  12130. 802637c: 4b01 ldr r3, [pc, #4] ; (8026384 <spi_tx_rx+0x20>)
  12131. 802637e: 8998 ldrh r0, [r3, #12]
  12132. }
  12133. 8026380: b2c0 uxtb r0, r0
  12134. 8026382: 4770 bx lr
  12135. 8026384: 40003800 .word 0x40003800
  12136. 08026388 <send_addr>:
  12137. status = spi_tx_rx(0);
  12138. } while (status & SR_WIP);
  12139. SPI_FLASH_CS_H();
  12140. }
  12141. static inline void send_addr(int addr) {
  12142. 8026388: b510 push {r4, lr}
  12143. 802638a: 4604 mov r4, r0
  12144. spi_tx_rx((addr >> 16) & 0xFF);
  12145. 802638c: f3c0 4007 ubfx r0, r0, #16, #8
  12146. 8026390: f7ff ffe8 bl 8026364 <spi_tx_rx>
  12147. spi_tx_rx((addr >> 8) & 0xFF);
  12148. 8026394: f3c4 2007 ubfx r0, r4, #8, #8
  12149. 8026398: f7ff ffe4 bl 8026364 <spi_tx_rx>
  12150. spi_tx_rx(addr & 0xFF);
  12151. 802639c: b2e0 uxtb r0, r4
  12152. }
  12153. 802639e: e8bd 4010 ldmia.w sp!, {r4, lr}
  12154. }
  12155. static inline void send_addr(int addr) {
  12156. spi_tx_rx((addr >> 16) & 0xFF);
  12157. spi_tx_rx((addr >> 8) & 0xFF);
  12158. spi_tx_rx(addr & 0xFF);
  12159. 80263a2: f7ff bfdf b.w 8026364 <spi_tx_rx>
  12160. 080263a6 <wait_write_enable>:
  12161. spi_flash_desc_t spi_flash_desc;
  12162. static inline void wait_write_enable(void) {
  12163. uint8_t status;
  12164. // spi_cs_down();
  12165. SPI_FLASH_CS_L();
  12166. 80263a6: 2005 movs r0, #5
  12167. #define SR_WEL (1 << 1)
  12168. #define SR_SRWD (1 << 7)
  12169. spi_flash_desc_t spi_flash_desc;
  12170. static inline void wait_write_enable(void) {
  12171. 80263a8: b508 push {r3, lr}
  12172. uint8_t status;
  12173. // spi_cs_down();
  12174. SPI_FLASH_CS_L();
  12175. 80263aa: 2100 movs r1, #0
  12176. 80263ac: f7ff fc90 bl 8025cd0 <gpio_set>
  12177. spi_tx_rx(CMD_RDSR);
  12178. 80263b0: 2005 movs r0, #5
  12179. 80263b2: f7ff ffd7 bl 8026364 <spi_tx_rx>
  12180. do {
  12181. status = spi_tx_rx(0);
  12182. 80263b6: 2000 movs r0, #0
  12183. 80263b8: f7ff ffd4 bl 8026364 <spi_tx_rx>
  12184. } while (!(status & SR_WEL));
  12185. 80263bc: f000 0002 and.w r0, r0, #2
  12186. 80263c0: b2c0 uxtb r0, r0
  12187. 80263c2: 2800 cmp r0, #0
  12188. 80263c4: d0f7 beq.n 80263b6 <wait_write_enable+0x10>
  12189. // spi_cs_up();
  12190. SPI_FLASH_CS_H();
  12191. 80263c6: 2005 movs r0, #5
  12192. 80263c8: 2101 movs r1, #1
  12193. }
  12194. 80263ca: e8bd 4008 ldmia.w sp!, {r3, lr}
  12195. spi_tx_rx(CMD_RDSR);
  12196. do {
  12197. status = spi_tx_rx(0);
  12198. } while (!(status & SR_WEL));
  12199. // spi_cs_up();
  12200. SPI_FLASH_CS_H();
  12201. 80263ce: f7ff bc7f b.w 8025cd0 <gpio_set>
  12202. 080263d2 <wait_write_end>:
  12203. }
  12204. static inline void wait_write_end(void) {
  12205. uint8_t status;
  12206. SPI_FLASH_CS_L();
  12207. 80263d2: 2005 movs r0, #5
  12208. } while (!(status & SR_WEL));
  12209. // spi_cs_up();
  12210. SPI_FLASH_CS_H();
  12211. }
  12212. static inline void wait_write_end(void) {
  12213. 80263d4: b508 push {r3, lr}
  12214. uint8_t status;
  12215. SPI_FLASH_CS_L();
  12216. 80263d6: 2100 movs r1, #0
  12217. 80263d8: f7ff fc7a bl 8025cd0 <gpio_set>
  12218. spi_tx_rx(CMD_RDSR);
  12219. 80263dc: 2005 movs r0, #5
  12220. 80263de: f7ff ffc1 bl 8026364 <spi_tx_rx>
  12221. do {
  12222. status = spi_tx_rx(0);
  12223. 80263e2: 2000 movs r0, #0
  12224. 80263e4: f7ff ffbe bl 8026364 <spi_tx_rx>
  12225. } while (status & SR_WIP);
  12226. 80263e8: 07c1 lsls r1, r0, #31
  12227. 80263ea: d4fa bmi.n 80263e2 <wait_write_end+0x10>
  12228. SPI_FLASH_CS_H();
  12229. 80263ec: 2005 movs r0, #5
  12230. 80263ee: 2101 movs r1, #1
  12231. }
  12232. 80263f0: e8bd 4008 ldmia.w sp!, {r3, lr}
  12233. SPI_FLASH_CS_L();
  12234. spi_tx_rx(CMD_RDSR);
  12235. do {
  12236. status = spi_tx_rx(0);
  12237. } while (status & SR_WIP);
  12238. SPI_FLASH_CS_H();
  12239. 80263f4: f7ff bc6c b.w 8025cd0 <gpio_set>
  12240. 080263f8 <spi_flash_read>:
  12241. *((uint8_t *)buf++) = spi_tx_rx(0);
  12242. SPI_FLASH_CS_H();
  12243. return 0;
  12244. }
  12245. ssize_t spi_flash_read(int addr, void *buf, size_t len, uint32_t timeout) {
  12246. 80263f8: b570 push {r4, r5, r6, lr}
  12247. 80263fa: 4605 mov r5, r0
  12248. 80263fc: 460c mov r4, r1
  12249. ssize_t ret = 0;
  12250. // ret = tn_mutex_lock(&spi_mutex, timeout);
  12251. // if (ret != TERR_NO_ERR)
  12252. // return ret;
  12253. SPI_FLASH_CS_L();
  12254. 80263fe: 2005 movs r0, #5
  12255. 8026400: 2100 movs r1, #0
  12256. *((uint8_t *)buf++) = spi_tx_rx(0);
  12257. SPI_FLASH_CS_H();
  12258. return 0;
  12259. }
  12260. ssize_t spi_flash_read(int addr, void *buf, size_t len, uint32_t timeout) {
  12261. 8026402: 4616 mov r6, r2
  12262. ssize_t ret = 0;
  12263. // ret = tn_mutex_lock(&spi_mutex, timeout);
  12264. // if (ret != TERR_NO_ERR)
  12265. // return ret;
  12266. SPI_FLASH_CS_L();
  12267. 8026404: f7ff fc64 bl 8025cd0 <gpio_set>
  12268. spi_tx_rx(CMD_READ);
  12269. 8026408: 2003 movs r0, #3
  12270. 802640a: f7ff ffab bl 8026364 <spi_tx_rx>
  12271. send_addr(addr);
  12272. 802640e: 4628 mov r0, r5
  12273. 8026410: f7ff ffba bl 8026388 <send_addr>
  12274. *((uint8_t *)buf++) = spi_tx_rx(0);
  12275. SPI_FLASH_CS_H();
  12276. return 0;
  12277. }
  12278. ssize_t spi_flash_read(int addr, void *buf, size_t len, uint32_t timeout) {
  12279. 8026414: 19a6 adds r6, r4, r6
  12280. // return ret;
  12281. SPI_FLASH_CS_L();
  12282. spi_tx_rx(CMD_READ);
  12283. send_addr(addr);
  12284. while (len--)
  12285. 8026416: e004 b.n 8026422 <spi_flash_read+0x2a>
  12286. *((uint8_t *)buf++) = spi_tx_rx(0);
  12287. 8026418: 2000 movs r0, #0
  12288. 802641a: f7ff ffa3 bl 8026364 <spi_tx_rx>
  12289. 802641e: f804 0b01 strb.w r0, [r4], #1
  12290. // return ret;
  12291. SPI_FLASH_CS_L();
  12292. spi_tx_rx(CMD_READ);
  12293. send_addr(addr);
  12294. while (len--)
  12295. 8026422: 42b4 cmp r4, r6
  12296. 8026424: d1f8 bne.n 8026418 <spi_flash_read+0x20>
  12297. *((uint8_t *)buf++) = spi_tx_rx(0);
  12298. SPI_FLASH_CS_H();
  12299. 8026426: 2005 movs r0, #5
  12300. 8026428: 2101 movs r1, #1
  12301. 802642a: f7ff fc51 bl 8025cd0 <gpio_set>
  12302. // tn_mutex_unlock(&spi_mutex);
  12303. return len;
  12304. }
  12305. 802642e: f04f 30ff mov.w r0, #4294967295
  12306. 8026432: bd70 pop {r4, r5, r6, pc}
  12307. 08026434 <spi_flash_pp>:
  12308. // ret = tn_mutex_lock(&spi_mutex, timeout);
  12309. // if (ret != TERR_NO_ERR)
  12310. // return ret;
  12311. // don't allow page wrapping
  12312. ssize_t ret = 0;
  12313. if ((addr & 0xFF) + len > 0xFF)
  12314. 8026434: b2c3 uxtb r3, r0
  12315. return len;
  12316. }
  12317. #define TIMEOUT 10000
  12318. uint16_t spi_flash_pp(int addr, const void *buf, size_t len, uint32_t timeout) {
  12319. 8026436: b570 push {r4, r5, r6, lr}
  12320. 8026438: 4615 mov r5, r2
  12321. // ret = tn_mutex_lock(&spi_mutex, timeout);
  12322. // if (ret != TERR_NO_ERR)
  12323. // return ret;
  12324. // don't allow page wrapping
  12325. ssize_t ret = 0;
  12326. if ((addr & 0xFF) + len > 0xFF)
  12327. 802643a: 18d2 adds r2, r2, r3
  12328. 802643c: 2aff cmp r2, #255 ; 0xff
  12329. len = 0x100 - (addr & 0xFF);
  12330. 802643e: bf88 it hi
  12331. 8026440: f5c3 7580 rsbhi r5, r3, #256 ; 0x100
  12332. return len;
  12333. }
  12334. #define TIMEOUT 10000
  12335. uint16_t spi_flash_pp(int addr, const void *buf, size_t len, uint32_t timeout) {
  12336. 8026444: 4604 mov r4, r0
  12337. 8026446: 460e mov r6, r1
  12338. ssize_t ret = 0;
  12339. if ((addr & 0xFF) + len > 0xFF)
  12340. len = 0x100 - (addr & 0xFF);
  12341. ret = len;
  12342. SPI_FLASH_CS_L();
  12343. 8026448: 2005 movs r0, #5
  12344. 802644a: 2100 movs r1, #0
  12345. 802644c: f7ff fc40 bl 8025cd0 <gpio_set>
  12346. spi_tx_rx(CMD_WREN);
  12347. 8026450: 2006 movs r0, #6
  12348. 8026452: f7ff ff87 bl 8026364 <spi_tx_rx>
  12349. SPI_FLASH_CS_H();
  12350. 8026456: 2005 movs r0, #5
  12351. 8026458: 2101 movs r1, #1
  12352. 802645a: f7ff fc39 bl 8025cd0 <gpio_set>
  12353. wait_write_enable();
  12354. 802645e: f7ff ffa2 bl 80263a6 <wait_write_enable>
  12355. SPI_FLASH_CS_L();
  12356. 8026462: 2100 movs r1, #0
  12357. 8026464: 2005 movs r0, #5
  12358. 8026466: f7ff fc33 bl 8025cd0 <gpio_set>
  12359. spi_tx_rx(CMD_PP);
  12360. 802646a: 2002 movs r0, #2
  12361. 802646c: f7ff ff7a bl 8026364 <spi_tx_rx>
  12362. send_addr(addr);
  12363. 8026470: 4620 mov r0, r4
  12364. 8026472: f7ff ff89 bl 8026388 <send_addr>
  12365. while (len--)
  12366. 8026476: 2400 movs r4, #0
  12367. 8026478: e003 b.n 8026482 <spi_flash_pp+0x4e>
  12368. spi_tx_rx(*((uint8_t *)buf++));
  12369. 802647a: 5d30 ldrb r0, [r6, r4]
  12370. 802647c: f7ff ff72 bl 8026364 <spi_tx_rx>
  12371. 8026480: 3401 adds r4, #1
  12372. wait_write_enable();
  12373. SPI_FLASH_CS_L();
  12374. spi_tx_rx(CMD_PP);
  12375. send_addr(addr);
  12376. while (len--)
  12377. 8026482: 42ac cmp r4, r5
  12378. 8026484: d1f9 bne.n 802647a <spi_flash_pp+0x46>
  12379. spi_tx_rx(*((uint8_t *)buf++));
  12380. SPI_FLASH_CS_H();
  12381. 8026486: 2005 movs r0, #5
  12382. 8026488: 2101 movs r1, #1
  12383. 802648a: f7ff fc21 bl 8025cd0 <gpio_set>
  12384. wait_write_end();
  12385. 802648e: f7ff ffa0 bl 80263d2 <wait_write_end>
  12386. // tn_mutex_unlock(&spi_mutex);
  12387. return ret;
  12388. }
  12389. 8026492: b2a0 uxth r0, r4
  12390. 8026494: bd70 pop {r4, r5, r6, pc}
  12391. 08026496 <spi_flash_write>:
  12392. ssize_t spi_flash_write(int addr, const void *buf, size_t len, uint32_t timeout) {
  12393. 8026496: b5f8 push {r3, r4, r5, r6, r7, lr}
  12394. 8026498: 4607 mov r7, r0
  12395. 802649a: 460e mov r6, r1
  12396. 802649c: 4615 mov r5, r2
  12397. int ret = 0, offset = 0;
  12398. 802649e: 2400 movs r4, #0
  12399. do {
  12400. ret = spi_flash_pp(addr + offset, buf + offset, len - offset, 0);
  12401. 80264a0: 1938 adds r0, r7, r4
  12402. 80264a2: 1931 adds r1, r6, r4
  12403. 80264a4: 1b2a subs r2, r5, r4
  12404. 80264a6: 2300 movs r3, #0
  12405. 80264a8: f7ff ffc4 bl 8026434 <spi_flash_pp>
  12406. offset += ret;
  12407. 80264ac: 1824 adds r4, r4, r0
  12408. } while (len - offset);
  12409. 80264ae: 42a5 cmp r5, r4
  12410. 80264b0: d1f6 bne.n 80264a0 <spi_flash_write+0xa>
  12411. return 0;
  12412. }
  12413. 80264b2: 2000 movs r0, #0
  12414. 80264b4: bdf8 pop {r3, r4, r5, r6, r7, pc}
  12415. 080264b6 <spi_flash_erase_sector>:
  12416. wait_write_end();
  12417. return 0;
  12418. }
  12419. int spi_flash_erase_sector(int addr, uint32_t timeout) {
  12420. 80264b6: b510 push {r4, lr}
  12421. int ret = 0;
  12422. // ret = tn_mutex_lock(&spi_mutex, timeout);
  12423. // if (ret != TERR_NO_ERR)
  12424. // return ret;
  12425. SPI_FLASH_CS_L();
  12426. 80264b8: 2100 movs r1, #0
  12427. wait_write_end();
  12428. return 0;
  12429. }
  12430. int spi_flash_erase_sector(int addr, uint32_t timeout) {
  12431. 80264ba: 4604 mov r4, r0
  12432. int ret = 0;
  12433. // ret = tn_mutex_lock(&spi_mutex, timeout);
  12434. // if (ret != TERR_NO_ERR)
  12435. // return ret;
  12436. SPI_FLASH_CS_L();
  12437. 80264bc: 2005 movs r0, #5
  12438. 80264be: f7ff fc07 bl 8025cd0 <gpio_set>
  12439. spi_tx_rx(CMD_WREN);
  12440. 80264c2: 2006 movs r0, #6
  12441. 80264c4: f7ff ff4e bl 8026364 <spi_tx_rx>
  12442. SPI_FLASH_CS_H();
  12443. 80264c8: 2005 movs r0, #5
  12444. 80264ca: 2101 movs r1, #1
  12445. 80264cc: f7ff fc00 bl 8025cd0 <gpio_set>
  12446. wait_write_enable();
  12447. 80264d0: f7ff ff69 bl 80263a6 <wait_write_enable>
  12448. SPI_FLASH_CS_L();
  12449. 80264d4: 2100 movs r1, #0
  12450. 80264d6: 2005 movs r0, #5
  12451. 80264d8: f7ff fbfa bl 8025cd0 <gpio_set>
  12452. spi_tx_rx(CMD_SE);
  12453. 80264dc: 2020 movs r0, #32
  12454. 80264de: f7ff ff41 bl 8026364 <spi_tx_rx>
  12455. send_addr(addr);
  12456. 80264e2: 4620 mov r0, r4
  12457. 80264e4: f7ff ff50 bl 8026388 <send_addr>
  12458. SPI_FLASH_CS_H();
  12459. 80264e8: 2005 movs r0, #5
  12460. 80264ea: 2101 movs r1, #1
  12461. 80264ec: f7ff fbf0 bl 8025cd0 <gpio_set>
  12462. wait_write_end();
  12463. 80264f0: f7ff ff6f bl 80263d2 <wait_write_end>
  12464. // tn_mutex_unlock(&spi_mutex);
  12465. return 0;
  12466. }
  12467. 80264f4: 2000 movs r0, #0
  12468. 80264f6: bd10 pop {r4, pc}
  12469. 080264f8 <spi_flash_init>:
  12470. bool spi_flash_init(void) {
  12471. uint32_t i, ptable, bitsize = 0;
  12472. uint8_t tmp[4];
  12473. spi_flash_desc.present = false;
  12474. 80264f8: 4b28 ldr r3, [pc, #160] ; (802659c <spi_flash_init+0xa4>)
  12475. // tn_mutex_unlock(&spi_mutex);
  12476. return 0;
  12477. }
  12478. bool spi_flash_init(void) {
  12479. 80264fa: b513 push {r0, r1, r4, lr}
  12480. uint32_t i, ptable, bitsize = 0;
  12481. uint8_t tmp[4];
  12482. spi_flash_desc.present = false;
  12483. 80264fc: 2400 movs r4, #0
  12484. 80264fe: 701c strb r4, [r3, #0]
  12485. static void spi_init_(void) {
  12486. // tn_mutex_create(&spi_mutex, TN_MUTEX_ATTR_INHERIT, 0);
  12487. //tn_sem_create(&xact.ready, 0, 1);
  12488. RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;
  12489. 8026500: 4b27 ldr r3, [pc, #156] ; (80265a0 <spi_flash_init+0xa8>)
  12490. 8026502: 6c1a ldr r2, [r3, #64] ; 0x40
  12491. 8026504: f442 4280 orr.w r2, r2, #16384 ; 0x4000
  12492. 8026508: 641a str r2, [r3, #64] ; 0x40
  12493. RCC->APB1RSTR |= RCC_APB1RSTR_SPI2RST;
  12494. 802650a: 6a1a ldr r2, [r3, #32]
  12495. 802650c: f442 4200 orr.w r2, r2, #32768 ; 0x8000
  12496. 8026510: 621a str r2, [r3, #32]
  12497. RCC->APB1RSTR &= ~RCC_APB1RSTR_SPI2RST;
  12498. 8026512: 6a1a ldr r2, [r3, #32]
  12499. 8026514: f422 4200 bic.w r2, r2, #32768 ; 0x8000
  12500. 8026518: 621a str r2, [r3, #32]
  12501. SPI2->CR1 &= ~SPI_CR1_SPE;
  12502. 802651a: f5a3 3300 sub.w r3, r3, #131072 ; 0x20000
  12503. spi_tx_rx((addr >> 8) & 0xFF);
  12504. spi_tx_rx(addr & 0xFF);
  12505. }
  12506. static int spi_flash_read_sfdp(int addr, void *buf, size_t len) {
  12507. SPI_FLASH_CS_L();
  12508. 802651e: 4621 mov r1, r4
  12509. RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;
  12510. RCC->APB1RSTR |= RCC_APB1RSTR_SPI2RST;
  12511. RCC->APB1RSTR &= ~RCC_APB1RSTR_SPI2RST;
  12512. SPI2->CR1 &= ~SPI_CR1_SPE;
  12513. 8026520: 881a ldrh r2, [r3, #0]
  12514. 8026522: f022 0240 bic.w r2, r2, #64 ; 0x40
  12515. 8026526: 0412 lsls r2, r2, #16
  12516. 8026528: 0c12 lsrs r2, r2, #16
  12517. 802652a: 801a strh r2, [r3, #0]
  12518. //SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_BR_1 | SPI_CR1_SSM | SPI_CR1_SSI;
  12519. SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI;
  12520. 802652c: f44f 7241 mov.w r2, #772 ; 0x304
  12521. 8026530: 801a strh r2, [r3, #0]
  12522. SPI2->CR2 = 0;//SPI_CR2_SSOE;
  12523. 8026532: 809c strh r4, [r3, #4]
  12524. SPI2->CR1 |= SPI_CR1_SPE;
  12525. 8026534: 881a ldrh r2, [r3, #0]
  12526. 8026536: b292 uxth r2, r2
  12527. 8026538: f042 0240 orr.w r2, r2, #64 ; 0x40
  12528. 802653c: 801a strh r2, [r3, #0]
  12529. spi_tx_rx((addr >> 8) & 0xFF);
  12530. spi_tx_rx(addr & 0xFF);
  12531. }
  12532. static int spi_flash_read_sfdp(int addr, void *buf, size_t len) {
  12533. SPI_FLASH_CS_L();
  12534. 802653e: 2005 movs r0, #5
  12535. 8026540: f7ff fbc6 bl 8025cd0 <gpio_set>
  12536. spi_tx_rx(CMD_RDSFDP);
  12537. 8026544: 205a movs r0, #90 ; 0x5a
  12538. 8026546: f7ff ff0d bl 8026364 <spi_tx_rx>
  12539. send_addr(addr);
  12540. 802654a: 4620 mov r0, r4
  12541. 802654c: f7ff ff1c bl 8026388 <send_addr>
  12542. spi_tx_rx(0);
  12543. 8026550: 4620 mov r0, r4
  12544. 8026552: f7ff ff07 bl 8026364 <spi_tx_rx>
  12545. while (len--)
  12546. *((uint8_t *)buf++) = spi_tx_rx(0);
  12547. 8026556: 2000 movs r0, #0
  12548. 8026558: f7ff ff04 bl 8026364 <spi_tx_rx>
  12549. 802655c: ab01 add r3, sp, #4
  12550. 802655e: 5518 strb r0, [r3, r4]
  12551. 8026560: 3401 adds r4, #1
  12552. static int spi_flash_read_sfdp(int addr, void *buf, size_t len) {
  12553. SPI_FLASH_CS_L();
  12554. spi_tx_rx(CMD_RDSFDP);
  12555. send_addr(addr);
  12556. spi_tx_rx(0);
  12557. while (len--)
  12558. 8026562: 2c04 cmp r4, #4
  12559. 8026564: d1f7 bne.n 8026556 <spi_flash_init+0x5e>
  12560. *((uint8_t *)buf++) = spi_tx_rx(0);
  12561. SPI_FLASH_CS_H();
  12562. 8026566: 2005 movs r0, #5
  12563. 8026568: 2101 movs r1, #1
  12564. 802656a: f7ff fbb1 bl 8025cd0 <gpio_set>
  12565. spi_init_();
  12566. // check SFDP magic
  12567. spi_flash_read_sfdp(0, tmp, 4);
  12568. if (!(tmp[0] == 0x53 && tmp[1] == 0x46 &&
  12569. 802656e: f89d 3004 ldrb.w r3, [sp, #4]
  12570. 8026572: 2b53 cmp r3, #83 ; 0x53
  12571. 8026574: d110 bne.n 8026598 <spi_flash_init+0xa0>
  12572. 8026576: f89d 3005 ldrb.w r3, [sp, #5]
  12573. 802657a: 2b46 cmp r3, #70 ; 0x46
  12574. 802657c: d10c bne.n 8026598 <spi_flash_init+0xa0>
  12575. 802657e: f89d 3006 ldrb.w r3, [sp, #6]
  12576. 8026582: 2b44 cmp r3, #68 ; 0x44
  12577. 8026584: d108 bne.n 8026598 <spi_flash_init+0xa0>
  12578. 8026586: f89d 0007 ldrb.w r0, [sp, #7]
  12579. 802658a: f1b0 0c50 subs.w ip, r0, #80 ; 0x50
  12580. 802658e: f1dc 0000 rsbs r0, ip, #0
  12581. 8026592: eb50 000c adcs.w r0, r0, ip
  12582. 8026596: e000 b.n 802659a <spi_flash_init+0xa2>
  12583. tmp[2] == 0x44 && tmp[3] == 0x50))
  12584. return 0;
  12585. 8026598: 2000 movs r0, #0
  12586. if (!spi_flash_desc.sector_size)
  12587. return;
  12588. spi_flash_desc.present = true;
  12589. */
  12590. }
  12591. 802659a: bd1c pop {r2, r3, r4, pc}
  12592. 802659c: 2000e4f0 .word 0x2000e4f0
  12593. 80265a0: 40023800 .word 0x40023800
  12594. 080265a4 <spi_flash_test>:
  12595. #define bufsize2 (countof(txbuf2)-1)
  12596. uint8_t rxbuf1[bufsize1] = {0};
  12597. uint8_t rxbuf2[bufsize2] = {0};
  12598. void spi_flash_test(void) {
  12599. 80265a4: b510 push {r4, lr}
  12600. if (!spi_flash_init())
  12601. 80265a6: f7ff ffa7 bl 80264f8 <spi_flash_init>
  12602. 80265aa: 2800 cmp r0, #0
  12603. 80265ac: d04a beq.n 8026644 <spi_flash_test+0xa0>
  12604. return;
  12605. int ret = 0, addr = 0, offset = 0;
  12606. spi_flash_read(0, rxbuf1, bufsize1, 0);
  12607. 80265ae: 2000 movs r0, #0
  12608. 80265b0: f640 62f9 movw r2, #3833 ; 0xef9
  12609. 80265b4: 4603 mov r3, r0
  12610. 80265b6: 4924 ldr r1, [pc, #144] ; (8026648 <spi_flash_test+0xa4>)
  12611. 80265b8: f7ff ff1e bl 80263f8 <spi_flash_read>
  12612. spi_flash_erase_sector(0,0);
  12613. 80265bc: 2000 movs r0, #0
  12614. 80265be: 4601 mov r1, r0
  12615. 80265c0: f7ff ff79 bl 80264b6 <spi_flash_erase_sector>
  12616. spi_flash_read(0, rxbuf1, bufsize1, 0);
  12617. 80265c4: 2000 movs r0, #0
  12618. 80265c6: 4920 ldr r1, [pc, #128] ; (8026648 <spi_flash_test+0xa4>)
  12619. 80265c8: f640 62f9 movw r2, #3833 ; 0xef9
  12620. 80265cc: 4603 mov r3, r0
  12621. 80265ce: f7ff ff13 bl 80263f8 <spi_flash_read>
  12622. spi_flash_write(addr, txbuf1, bufsize1, 0);
  12623. 80265d2: 2000 movs r0, #0
  12624. 80265d4: 4603 mov r3, r0
  12625. 80265d6: 491d ldr r1, [pc, #116] ; (802664c <spi_flash_test+0xa8>)
  12626. 80265d8: f640 62f9 movw r2, #3833 ; 0xef9
  12627. 80265dc: f7ff ff5b bl 8026496 <spi_flash_write>
  12628. memset(rxbuf1, 0, bufsize1);
  12629. 80265e0: 2100 movs r1, #0
  12630. 80265e2: f640 62f9 movw r2, #3833 ; 0xef9
  12631. 80265e6: 4818 ldr r0, [pc, #96] ; (8026648 <spi_flash_test+0xa4>)
  12632. 80265e8: f7fb f8e6 bl 80217b8 <memset>
  12633. spi_flash_read(0, rxbuf1, bufsize1, 0);
  12634. 80265ec: 2000 movs r0, #0
  12635. 80265ee: 4916 ldr r1, [pc, #88] ; (8026648 <spi_flash_test+0xa4>)
  12636. 80265f0: f640 62f9 movw r2, #3833 ; 0xef9
  12637. 80265f4: 4603 mov r3, r0
  12638. 80265f6: f7ff feff bl 80263f8 <spi_flash_read>
  12639. if (memcmp(txbuf1, rxbuf1, bufsize1) != 0)
  12640. 80265fa: 4814 ldr r0, [pc, #80] ; (802664c <spi_flash_test+0xa8>)
  12641. 80265fc: 4912 ldr r1, [pc, #72] ; (8026648 <spi_flash_test+0xa4>)
  12642. 80265fe: f640 62f9 movw r2, #3833 ; 0xef9
  12643. 8026602: f7fa ffed bl 80215e0 <memcmp>
  12644. 8026606: 4604 mov r4, r0
  12645. 8026608: b9e0 cbnz r0, 8026644 <spi_flash_test+0xa0>
  12646. return;
  12647. spi_flash_erase_sector(0,0);
  12648. 802660a: 4601 mov r1, r0
  12649. 802660c: f7ff ff53 bl 80264b6 <spi_flash_erase_sector>
  12650. spi_flash_read(0, rxbuf1, bufsize1, 0);
  12651. 8026610: 4623 mov r3, r4
  12652. 8026612: 4620 mov r0, r4
  12653. 8026614: 490c ldr r1, [pc, #48] ; (8026648 <spi_flash_test+0xa4>)
  12654. 8026616: f640 62f9 movw r2, #3833 ; 0xef9
  12655. 802661a: f7ff feed bl 80263f8 <spi_flash_read>
  12656. spi_flash_write(0, txbuf2, bufsize2, 0);
  12657. 802661e: 4623 mov r3, r4
  12658. 8026620: 224e movs r2, #78 ; 0x4e
  12659. 8026622: 4620 mov r0, r4
  12660. 8026624: 490a ldr r1, [pc, #40] ; (8026650 <spi_flash_test+0xac>)
  12661. 8026626: f7ff ff36 bl 8026496 <spi_flash_write>
  12662. memset(rxbuf2, 0, bufsize2);
  12663. 802662a: 4621 mov r1, r4
  12664. 802662c: 224e movs r2, #78 ; 0x4e
  12665. 802662e: 4809 ldr r0, [pc, #36] ; (8026654 <spi_flash_test+0xb0>)
  12666. 8026630: f7fb f8c2 bl 80217b8 <memset>
  12667. spi_flash_read(0, rxbuf2, bufsize2, 0);
  12668. 8026634: 4907 ldr r1, [pc, #28] ; (8026654 <spi_flash_test+0xb0>)
  12669. 8026636: 4620 mov r0, r4
  12670. 8026638: 224e movs r2, #78 ; 0x4e
  12671. 802663a: 4623 mov r3, r4
  12672. spi_flash_desc.sector_size,
  12673. spi_flash_desc.sector_size * spi_flash_desc.sector_count);
  12674. return 0;
  12675. */
  12676. }
  12677. 802663c: e8bd 4010 ldmia.w sp!, {r4, lr}
  12678. spi_flash_read(0, rxbuf1, bufsize1, 0);
  12679. spi_flash_write(0, txbuf2, bufsize2, 0);
  12680. memset(rxbuf2, 0, bufsize2);
  12681. spi_flash_read(0, rxbuf2, bufsize2, 0);
  12682. 8026640: f7ff beda b.w 80263f8 <spi_flash_read>
  12683. 8026644: bd10 pop {r4, pc}
  12684. 8026646: bf00 nop
  12685. 8026648: 2000194c .word 0x2000194c
  12686. 802664c: 200006af .word 0x200006af
  12687. 8026650: 20000660 .word 0x20000660
  12688. 8026654: 20002845 .word 0x20002845
  12689. 08026658 <NVIC_EncodePriority.constprop.0>:
  12690. \param [in] SubPriority Subpriority value (starting from 0).
  12691. \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority().
  12692. */
  12693. __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
  12694. {
  12695. uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */
  12696. 8026658: f000 0007 and.w r0, r0, #7
  12697. uint32_t PreemptPriorityBits;
  12698. uint32_t SubPriorityBits;
  12699. PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp;
  12700. 802665c: f1c0 0307 rsb r3, r0, #7
  12701. SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS;
  12702. 8026660: 1d02 adds r2, r0, #4
  12703. {
  12704. uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */
  12705. uint32_t PreemptPriorityBits;
  12706. uint32_t SubPriorityBits;
  12707. PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp;
  12708. 8026662: 2b04 cmp r3, #4
  12709. 8026664: bf28 it cs
  12710. 8026666: 2304 movcs r3, #4
  12711. SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS;
  12712. 8026668: 2a06 cmp r2, #6
  12713. 802666a: d901 bls.n 8026670 <NVIC_EncodePriority.constprop.0+0x18>
  12714. 802666c: 3803 subs r0, #3
  12715. 802666e: e000 b.n 8026672 <NVIC_EncodePriority.constprop.0+0x1a>
  12716. 8026670: 2000 movs r0, #0
  12717. return (
  12718. ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) |
  12719. 8026672: 2201 movs r2, #1
  12720. 8026674: fa02 f303 lsl.w r3, r2, r3
  12721. 8026678: 3b01 subs r3, #1
  12722. 802667a: f003 0305 and.w r3, r3, #5
  12723. ((SubPriority & ((1 << (SubPriorityBits )) - 1)))
  12724. );
  12725. }
  12726. 802667e: fa03 f000 lsl.w r0, r3, r0
  12727. 8026682: 4770 bx lr
  12728. 08026684 <uart_hw_init>:
  12729. uint32_t ups_tx_fifo[UPS_RBUF_SIZE];
  12730. SemaphoreHandle_t xSem_rx_buf;
  12731. USART_InitTypeDef USART_InitStructure;
  12732. void uart_hw_init(USART_TypeDef *uart, uint32_t baud, uint16_t wordlen, uint16_t parity, uint16_t stop) {
  12733. 8026684: b570 push {r4, r5, r6, lr}
  12734. if (wordlen == 8)
  12735. wordlen_tmp = USART_WordLength_8b;
  12736. if (wordlen == 9)
  12737. wordlen_tmp = USART_WordLength_9b;
  12738. USART_InitStructure.USART_BaudRate = baud;
  12739. 8026686: 4d34 ldr r5, [pc, #208] ; (8026758 <uart_hw_init+0xd4>)
  12740. uint32_t ups_tx_fifo[UPS_RBUF_SIZE];
  12741. SemaphoreHandle_t xSem_rx_buf;
  12742. USART_InitTypeDef USART_InitStructure;
  12743. void uart_hw_init(USART_TypeDef *uart, uint32_t baud, uint16_t wordlen, uint16_t parity, uint16_t stop) {
  12744. 8026688: f8bd 6010 ldrh.w r6, [sp, #16]
  12745. wordlen_tmp = USART_WordLength_9b;
  12746. USART_InitStructure.USART_BaudRate = baud;
  12747. USART_InitStructure.USART_WordLength = wordlen_tmp;
  12748. USART_InitStructure.USART_StopBits = stop;
  12749. USART_InitStructure.USART_Parity = parity;
  12750. 802668c: 812b strh r3, [r5, #8]
  12751. void uart_hw_init(USART_TypeDef *uart, uint32_t baud, uint16_t wordlen, uint16_t parity, uint16_t stop) {
  12752. uint16_t wordlen_tmp;
  12753. if (wordlen == 8)
  12754. wordlen_tmp = USART_WordLength_8b;
  12755. if (wordlen == 9)
  12756. 802668e: 2a09 cmp r2, #9
  12757. 8026690: bf0c ite eq
  12758. 8026692: f44f 5280 moveq.w r2, #4096 ; 0x1000
  12759. 8026696: 2200 movne r2, #0
  12760. USART_InitStructure.USART_BaudRate = baud;
  12761. USART_InitStructure.USART_WordLength = wordlen_tmp;
  12762. USART_InitStructure.USART_StopBits = stop;
  12763. USART_InitStructure.USART_Parity = parity;
  12764. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  12765. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  12766. 8026698: 230c movs r3, #12
  12767. if (wordlen == 9)
  12768. wordlen_tmp = USART_WordLength_9b;
  12769. USART_InitStructure.USART_BaudRate = baud;
  12770. USART_InitStructure.USART_WordLength = wordlen_tmp;
  12771. USART_InitStructure.USART_StopBits = stop;
  12772. 802669a: 80ee strh r6, [r5, #6]
  12773. USART_InitStructure.USART_Parity = parity;
  12774. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  12775. 802669c: 2600 movs r6, #0
  12776. uint32_t ups_tx_fifo[UPS_RBUF_SIZE];
  12777. SemaphoreHandle_t xSem_rx_buf;
  12778. USART_InitTypeDef USART_InitStructure;
  12779. void uart_hw_init(USART_TypeDef *uart, uint32_t baud, uint16_t wordlen, uint16_t parity, uint16_t stop) {
  12780. 802669e: 4604 mov r4, r0
  12781. USART_InitStructure.USART_BaudRate = baud;
  12782. USART_InitStructure.USART_WordLength = wordlen_tmp;
  12783. USART_InitStructure.USART_StopBits = stop;
  12784. USART_InitStructure.USART_Parity = parity;
  12785. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  12786. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  12787. 80266a0: 816b strh r3, [r5, #10]
  12788. if (wordlen == 8)
  12789. wordlen_tmp = USART_WordLength_8b;
  12790. if (wordlen == 9)
  12791. wordlen_tmp = USART_WordLength_9b;
  12792. USART_InitStructure.USART_BaudRate = baud;
  12793. 80266a2: 6029 str r1, [r5, #0]
  12794. USART_InitStructure.USART_WordLength = wordlen_tmp;
  12795. 80266a4: 80aa strh r2, [r5, #4]
  12796. USART_InitStructure.USART_StopBits = stop;
  12797. USART_InitStructure.USART_Parity = parity;
  12798. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  12799. 80266a6: 81ae strh r6, [r5, #12]
  12800. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  12801. USART_DeInit(uart);
  12802. 80266a8: f7ff f942 bl 8025930 <USART_DeInit>
  12803. if (uart == USART1) {
  12804. 80266ac: 4b2b ldr r3, [pc, #172] ; (802675c <uart_hw_init+0xd8>)
  12805. 80266ae: 429c cmp r4, r3
  12806. 80266b0: d111 bne.n 80266d6 <uart_hw_init+0x52>
  12807. RCC->APB2ENR |= RCC_APB2Periph_USART1;
  12808. 80266b2: f503 3394 add.w r3, r3, #75776 ; 0x12800
  12809. 80266b6: 6c5a ldr r2, [r3, #68] ; 0x44
  12810. 80266b8: f042 0210 orr.w r2, r2, #16
  12811. 80266bc: 645a str r2, [r3, #68] ; 0x44
  12812. \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).
  12813. */
  12814. __STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void)
  12815. {
  12816. return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */
  12817. 80266be: 4b28 ldr r3, [pc, #160] ; (8026760 <uart_hw_init+0xdc>)
  12818. 80266c0: 68d8 ldr r0, [r3, #12]
  12819. NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0x05, 0));
  12820. 80266c2: f3c0 2002 ubfx r0, r0, #8, #3
  12821. 80266c6: f7ff ffc7 bl 8026658 <NVIC_EncodePriority.constprop.0>
  12822. __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  12823. {
  12824. if(IRQn < 0) {
  12825. SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */
  12826. else {
  12827. NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
  12828. 80266ca: 4b26 ldr r3, [pc, #152] ; (8026764 <uart_hw_init+0xe0>)
  12829. 80266cc: 0100 lsls r0, r0, #4
  12830. 80266ce: f883 0325 strb.w r0, [r3, #805] ; 0x325
  12831. \param [in] IRQn External interrupt number. Value cannot be negative.
  12832. */
  12833. __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
  12834. {
  12835. /* NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); enable interrupt */
  12836. NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */
  12837. 80266d2: 2220 movs r2, #32
  12838. 80266d4: e028 b.n 8026728 <uart_hw_init+0xa4>
  12839. USART_Cmd(USART1, ENABLE);
  12840. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  12841. USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
  12842. }
  12843. if (uart == USART2) {
  12844. 80266d6: 4b24 ldr r3, [pc, #144] ; (8026768 <uart_hw_init+0xe4>)
  12845. 80266d8: 429c cmp r4, r3
  12846. 80266da: d111 bne.n 8026700 <uart_hw_init+0x7c>
  12847. RCC->APB1ENR |= RCC_APB1Periph_USART2;
  12848. 80266dc: f503 33fa add.w r3, r3, #128000 ; 0x1f400
  12849. 80266e0: 6c1a ldr r2, [r3, #64] ; 0x40
  12850. 80266e2: f442 3200 orr.w r2, r2, #131072 ; 0x20000
  12851. 80266e6: 641a str r2, [r3, #64] ; 0x40
  12852. \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).
  12853. */
  12854. __STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void)
  12855. {
  12856. return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */
  12857. 80266e8: 4b1d ldr r3, [pc, #116] ; (8026760 <uart_hw_init+0xdc>)
  12858. 80266ea: 68d8 ldr r0, [r3, #12]
  12859. NVIC_SetPriority(USART2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0x05, 0));
  12860. 80266ec: f3c0 2002 ubfx r0, r0, #8, #3
  12861. 80266f0: f7ff ffb2 bl 8026658 <NVIC_EncodePriority.constprop.0>
  12862. __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  12863. {
  12864. if(IRQn < 0) {
  12865. SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */
  12866. else {
  12867. NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
  12868. 80266f4: 4b1b ldr r3, [pc, #108] ; (8026764 <uart_hw_init+0xe0>)
  12869. 80266f6: 0100 lsls r0, r0, #4
  12870. 80266f8: f883 0326 strb.w r0, [r3, #806] ; 0x326
  12871. \param [in] IRQn External interrupt number. Value cannot be negative.
  12872. */
  12873. __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
  12874. {
  12875. /* NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); enable interrupt */
  12876. NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */
  12877. 80266fc: 2240 movs r2, #64 ; 0x40
  12878. 80266fe: e013 b.n 8026728 <uart_hw_init+0xa4>
  12879. USART_Cmd(USART2, ENABLE);
  12880. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  12881. USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
  12882. }
  12883. if (uart == USART3) {
  12884. 8026700: 4b1a ldr r3, [pc, #104] ; (802676c <uart_hw_init+0xe8>)
  12885. 8026702: 429c cmp r4, r3
  12886. 8026704: d127 bne.n 8026756 <uart_hw_init+0xd2>
  12887. RCC->APB1ENR |= RCC_APB1Periph_USART3;
  12888. 8026706: f503 33f8 add.w r3, r3, #126976 ; 0x1f000
  12889. 802670a: 6c1a ldr r2, [r3, #64] ; 0x40
  12890. 802670c: f442 2280 orr.w r2, r2, #262144 ; 0x40000
  12891. 8026710: 641a str r2, [r3, #64] ; 0x40
  12892. \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).
  12893. */
  12894. __STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void)
  12895. {
  12896. return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */
  12897. 8026712: 4b13 ldr r3, [pc, #76] ; (8026760 <uart_hw_init+0xdc>)
  12898. 8026714: 68d8 ldr r0, [r3, #12]
  12899. NVIC_SetPriority(USART3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0x05, 0));
  12900. 8026716: f3c0 2002 ubfx r0, r0, #8, #3
  12901. 802671a: f7ff ff9d bl 8026658 <NVIC_EncodePriority.constprop.0>
  12902. __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  12903. {
  12904. if(IRQn < 0) {
  12905. SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */
  12906. else {
  12907. NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
  12908. 802671e: 4b11 ldr r3, [pc, #68] ; (8026764 <uart_hw_init+0xe0>)
  12909. 8026720: 0100 lsls r0, r0, #4
  12910. 8026722: f883 0327 strb.w r0, [r3, #807] ; 0x327
  12911. \param [in] IRQn External interrupt number. Value cannot be negative.
  12912. */
  12913. __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
  12914. {
  12915. /* NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); enable interrupt */
  12916. NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */
  12917. 8026726: 2280 movs r2, #128 ; 0x80
  12918. 8026728: 605a str r2, [r3, #4]
  12919. NVIC_EnableIRQ(USART3_IRQn);
  12920. USART_Init(USART3, &USART_InitStructure);
  12921. 802672a: 4620 mov r0, r4
  12922. 802672c: 4629 mov r1, r5
  12923. 802672e: f7ff f953 bl 80259d8 <USART_Init>
  12924. USART_Cmd(USART3, ENABLE);
  12925. 8026732: 4620 mov r0, r4
  12926. 8026734: 2101 movs r1, #1
  12927. 8026736: f7ff f9a9 bl 8025a8c <USART_Cmd>
  12928. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  12929. 802673a: 4620 mov r0, r4
  12930. 802673c: 2201 movs r2, #1
  12931. 802673e: f240 5125 movw r1, #1317 ; 0x525
  12932. 8026742: f7ff f9af bl 8025aa4 <USART_ITConfig>
  12933. USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
  12934. 8026746: 4620 mov r0, r4
  12935. 8026748: f240 7127 movw r1, #1831 ; 0x727
  12936. 802674c: 4632 mov r2, r6
  12937. }
  12938. }
  12939. 802674e: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  12940. NVIC_SetPriority(USART3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0x05, 0));
  12941. NVIC_EnableIRQ(USART3_IRQn);
  12942. USART_Init(USART3, &USART_InitStructure);
  12943. USART_Cmd(USART3, ENABLE);
  12944. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  12945. USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
  12946. 8026752: f7ff b9a7 b.w 8025aa4 <USART_ITConfig>
  12947. 8026756: bd70 pop {r4, r5, r6, pc}
  12948. 8026758: 2000e83c .word 0x2000e83c
  12949. 802675c: 40011000 .word 0x40011000
  12950. 8026760: e000ed00 .word 0xe000ed00
  12951. 8026764: e000e100 .word 0xe000e100
  12952. 8026768: 40004400 .word 0x40004400
  12953. 802676c: 40004800 .word 0x40004800
  12954. 08026770 <InitUSART>:
  12955. }
  12956. }
  12957. void InitUSART(void) {
  12958. 8026770: b507 push {r0, r1, r2, lr}
  12959. xSem_rx_buf = xSemaphoreCreateCounting( UPS_RBUF_SIZE, 0 );
  12960. 8026772: 2100 movs r1, #0
  12961. 8026774: 2064 movs r0, #100 ; 0x64
  12962. 8026776: f001 fc2f bl 8027fd8 <xQueueCreateCountingSemaphore>
  12963. 802677a: 4b0a ldr r3, [pc, #40] ; (80267a4 <InitUSART+0x34>)
  12964. rbuf32_init(&ups_tx_rbuf, ups_tx_fifo, UPS_RBUF_SIZE);
  12965. 802677c: 490a ldr r1, [pc, #40] ; (80267a8 <InitUSART+0x38>)
  12966. USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
  12967. }
  12968. }
  12969. void InitUSART(void) {
  12970. xSem_rx_buf = xSemaphoreCreateCounting( UPS_RBUF_SIZE, 0 );
  12971. 802677e: 6018 str r0, [r3, #0]
  12972. rbuf32_init(&ups_tx_rbuf, ups_tx_fifo, UPS_RBUF_SIZE);
  12973. 8026780: 2264 movs r2, #100 ; 0x64
  12974. 8026782: 480a ldr r0, [pc, #40] ; (80267ac <InitUSART+0x3c>)
  12975. 8026784: f001 fad4 bl 8027d30 <rbuf32_init>
  12976. rbuf32_init(&ups_rx_rbuf, ups_rx_fifo, UPS_RBUF_SIZE);
  12977. 8026788: 2264 movs r2, #100 ; 0x64
  12978. 802678a: 4809 ldr r0, [pc, #36] ; (80267b0 <InitUSART+0x40>)
  12979. 802678c: 4909 ldr r1, [pc, #36] ; (80267b4 <InitUSART+0x44>)
  12980. 802678e: f001 facf bl 8027d30 <rbuf32_init>
  12981. uart_hw_init(UPS_USART, UPS_USART_BAUD, UPS_USART_WORD_LEN, UPS_USART_PARITY, UPS_USART_STOP_BIT);
  12982. 8026792: 2300 movs r3, #0
  12983. 8026794: 9300 str r3, [sp, #0]
  12984. 8026796: 4808 ldr r0, [pc, #32] ; (80267b8 <InitUSART+0x48>)
  12985. 8026798: f44f 6116 mov.w r1, #2400 ; 0x960
  12986. 802679c: 2208 movs r2, #8
  12987. 802679e: f7ff ff71 bl 8026684 <uart_hw_init>
  12988. }
  12989. 80267a2: bd0e pop {r1, r2, r3, pc}
  12990. 80267a4: 2000e84c .word 0x2000e84c
  12991. 80267a8: 2000e50c .word 0x2000e50c
  12992. 80267ac: 2000e82c .word 0x2000e82c
  12993. 80267b0: 2000e4fc .word 0x2000e4fc
  12994. 80267b4: 2000e69c .word 0x2000e69c
  12995. 80267b8: 40004400 .word 0x40004400
  12996. 080267bc <ups_send_block>:
  12997. }
  12998. int ups_send_block(void *data, uint8_t len) {
  12999. int i = 0;
  13000. uint32_t s_temp = 0;
  13001. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  13002. 80267bc: 4a0f ldr r2, [pc, #60] ; (80267fc <ups_send_block+0x40>)
  13003. 80267be: 8993 ldrh r3, [r2, #12]
  13004. 80267c0: f023 0380 bic.w r3, r3, #128 ; 0x80
  13005. 80267c4: 041b lsls r3, r3, #16
  13006. 80267c6: 0c1b lsrs r3, r3, #16
  13007. rbuf32_put(&ups_tx_rbuf, (uint32_t)(byte));
  13008. }
  13009. UPS_USART->CR1 |= USART_CR1_TXEIE;
  13010. }
  13011. int ups_send_block(void *data, uint8_t len) {
  13012. 80267c8: b570 push {r4, r5, r6, lr}
  13013. 80267ca: 4606 mov r6, r0
  13014. 80267cc: 460d mov r5, r1
  13015. int i = 0;
  13016. uint32_t s_temp = 0;
  13017. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  13018. 80267ce: 8193 strh r3, [r2, #12]
  13019. }
  13020. UPS_USART->CR1 |= USART_CR1_TXEIE;
  13021. }
  13022. int ups_send_block(void *data, uint8_t len) {
  13023. int i = 0;
  13024. 80267d0: 2400 movs r4, #0
  13025. uint32_t s_temp = 0;
  13026. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  13027. //DBG printf("STOP \r\n");
  13028. while (i < len) {
  13029. 80267d2: e008 b.n 80267e6 <ups_send_block+0x2a>
  13030. if (!rbuf_isfull(&ups_tx_rbuf)) {
  13031. 80267d4: 480a ldr r0, [pc, #40] ; (8026800 <ups_send_block+0x44>)
  13032. 80267d6: f001 fab1 bl 8027d3c <rbuf_isfull>
  13033. 80267da: b930 cbnz r0, 80267ea <ups_send_block+0x2e>
  13034. s_temp = ((uint8_t *)data)[i++];
  13035. 80267dc: 5d31 ldrb r1, [r6, r4]
  13036. rbuf32_put(&ups_tx_rbuf, s_temp);
  13037. 80267de: 4808 ldr r0, [pc, #32] ; (8026800 <ups_send_block+0x44>)
  13038. uint32_t s_temp = 0;
  13039. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  13040. //DBG printf("STOP \r\n");
  13041. while (i < len) {
  13042. if (!rbuf_isfull(&ups_tx_rbuf)) {
  13043. s_temp = ((uint8_t *)data)[i++];
  13044. 80267e0: 3401 adds r4, #1
  13045. rbuf32_put(&ups_tx_rbuf, s_temp);
  13046. 80267e2: f001 facc bl 8027d7e <rbuf32_put>
  13047. int ups_send_block(void *data, uint8_t len) {
  13048. int i = 0;
  13049. uint32_t s_temp = 0;
  13050. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  13051. //DBG printf("STOP \r\n");
  13052. while (i < len) {
  13053. 80267e6: 42ac cmp r4, r5
  13054. 80267e8: dbf4 blt.n 80267d4 <ups_send_block+0x18>
  13055. rbuf32_put(&ups_tx_rbuf, s_temp);
  13056. }
  13057. else
  13058. break;
  13059. }
  13060. UPS_USART->CR1 |= USART_CR1_TXEIE;
  13061. 80267ea: 4b04 ldr r3, [pc, #16] ; (80267fc <ups_send_block+0x40>)
  13062. 80267ec: 899a ldrh r2, [r3, #12]
  13063. 80267ee: b292 uxth r2, r2
  13064. 80267f0: f042 0280 orr.w r2, r2, #128 ; 0x80
  13065. 80267f4: 819a strh r2, [r3, #12]
  13066. return i;
  13067. }
  13068. 80267f6: 4620 mov r0, r4
  13069. 80267f8: bd70 pop {r4, r5, r6, pc}
  13070. 80267fa: bf00 nop
  13071. 80267fc: 40004400 .word 0x40004400
  13072. 8026800: 2000e82c .word 0x2000e82c
  13073. 08026804 <ups_getchar>:
  13074. int ups_getchar(unsigned int timeout) {
  13075. int res;
  13076. res = xSemaphoreTake( xSem_rx_buf, (TickType_t)timeout );
  13077. 8026804: 4b09 ldr r3, [pc, #36] ; (802682c <ups_getchar+0x28>)
  13078. }
  13079. UPS_USART->CR1 |= USART_CR1_TXEIE;
  13080. return i;
  13081. }
  13082. int ups_getchar(unsigned int timeout) {
  13083. 8026806: b507 push {r0, r1, r2, lr}
  13084. int res;
  13085. res = xSemaphoreTake( xSem_rx_buf, (TickType_t)timeout );
  13086. 8026808: 2100 movs r1, #0
  13087. }
  13088. UPS_USART->CR1 |= USART_CR1_TXEIE;
  13089. return i;
  13090. }
  13091. int ups_getchar(unsigned int timeout) {
  13092. 802680a: 4602 mov r2, r0
  13093. int res;
  13094. res = xSemaphoreTake( xSem_rx_buf, (TickType_t)timeout );
  13095. 802680c: 6818 ldr r0, [r3, #0]
  13096. 802680e: 460b mov r3, r1
  13097. 8026810: f001 fd2c bl 802826c <xQueueGenericReceive>
  13098. 8026814: 9001 str r0, [sp, #4]
  13099. if (res == pdFALSE) {
  13100. 8026816: b128 cbz r0, 8026824 <ups_getchar+0x20>
  13101. return -1;
  13102. }
  13103. rbuf32_get(&ups_rx_rbuf, &res);
  13104. 8026818: 4805 ldr r0, [pc, #20] ; (8026830 <ups_getchar+0x2c>)
  13105. 802681a: a901 add r1, sp, #4
  13106. 802681c: f001 fa9a bl 8027d54 <rbuf32_get>
  13107. // DBG printf("STOP \r\n");
  13108. // DBG printf("wr: %d 0x%x\r\n", rs485_rx_rbuf.read_index,res);
  13109. return res;
  13110. 8026820: 9801 ldr r0, [sp, #4]
  13111. 8026822: e001 b.n 8026828 <ups_getchar+0x24>
  13112. int ups_getchar(unsigned int timeout) {
  13113. int res;
  13114. res = xSemaphoreTake( xSem_rx_buf, (TickType_t)timeout );
  13115. if (res == pdFALSE) {
  13116. return -1;
  13117. 8026824: f04f 30ff mov.w r0, #4294967295
  13118. }
  13119. rbuf32_get(&ups_rx_rbuf, &res);
  13120. // DBG printf("STOP \r\n");
  13121. // DBG printf("wr: %d 0x%x\r\n", rs485_rx_rbuf.read_index,res);
  13122. return res;
  13123. }
  13124. 8026828: bd0e pop {r1, r2, r3, pc}
  13125. 802682a: bf00 nop
  13126. 802682c: 2000e84c .word 0x2000e84c
  13127. 8026830: 2000e4fc .word 0x2000e4fc
  13128. 08026834 <USART1_IRQHandler>:
  13129. portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
  13130. }
  13131. }
  13132. void USART1_IRQHandler(void) {
  13133. 8026834: 4770 bx lr
  13134. 8026836: 0000 movs r0, r0
  13135. 08026838 <USART2_IRQHandler>:
  13136. }
  13137. void USART2_IRQHandler(void) {
  13138. 8026838: b513 push {r0, r1, r4, lr}
  13139. inline void rs232_irq_handler(void)
  13140. {
  13141. uint32_t c = 0;
  13142. 802683a: 2300 movs r3, #0
  13143. 802683c: 9301 str r3, [sp, #4]
  13144. static BaseType_t xHigherPriorityTaskWoken = pdFALSE;
  13145. if ((UPS_USART->SR & USART_SR_ORE)) {
  13146. 802683e: 4b26 ldr r3, [pc, #152] ; (80268d8 <USART2_IRQHandler+0xa0>)
  13147. 8026840: 881a ldrh r2, [r3, #0]
  13148. 8026842: f002 0208 and.w r2, r2, #8
  13149. 8026846: b292 uxth r2, r2
  13150. 8026848: b112 cbz r2, 8026850 <USART2_IRQHandler+0x18>
  13151. c = (uint32_t)UPS_USART->DR;
  13152. 802684a: 889b ldrh r3, [r3, #4]
  13153. 802684c: b29b uxth r3, r3
  13154. 802684e: 9301 str r3, [sp, #4]
  13155. //DBG printf("overrunRS485\r\n");
  13156. }
  13157. if (USART_GetITStatus(UPS_USART, USART_IT_TXE) != RESET) {
  13158. 8026850: 4c21 ldr r4, [pc, #132] ; (80268d8 <USART2_IRQHandler+0xa0>)
  13159. 8026852: f240 7127 movw r1, #1831 ; 0x727
  13160. 8026856: 4620 mov r0, r4
  13161. 8026858: f7ff f93d bl 8025ad6 <USART_GetITStatus>
  13162. 802685c: b1c0 cbz r0, 8026890 <USART2_IRQHandler+0x58>
  13163. if(rbuf32_get(&ups_tx_rbuf, &c)) {
  13164. 802685e: 481f ldr r0, [pc, #124] ; (80268dc <USART2_IRQHandler+0xa4>)
  13165. 8026860: a901 add r1, sp, #4
  13166. 8026862: f001 fa77 bl 8027d54 <rbuf32_get>
  13167. 8026866: b118 cbz r0, 8026870 <USART2_IRQHandler+0x38>
  13168. UPS_USART->DR = (uint16_t)c;
  13169. 8026868: f8bd 3004 ldrh.w r3, [sp, #4]
  13170. 802686c: 80a3 strh r3, [r4, #4]
  13171. 802686e: e00a b.n 8026886 <USART2_IRQHandler+0x4e>
  13172. //DBG printf("wr: %d 0x%x\r\n", rs485_tx_rbuf.read_index,c);
  13173. }
  13174. else {
  13175. UPS_USART->CR1 &= ~USART_CR1_TXEIE;
  13176. 8026870: 89a3 ldrh r3, [r4, #12]
  13177. 8026872: f023 0380 bic.w r3, r3, #128 ; 0x80
  13178. 8026876: 041b lsls r3, r3, #16
  13179. 8026878: 0c1b lsrs r3, r3, #16
  13180. 802687a: 81a3 strh r3, [r4, #12]
  13181. UPS_USART->CR1 |= USART_CR1_RXNEIE;
  13182. 802687c: 89a3 ldrh r3, [r4, #12]
  13183. 802687e: b29b uxth r3, r3
  13184. 8026880: f043 0320 orr.w r3, r3, #32
  13185. 8026884: 81a3 strh r3, [r4, #12]
  13186. }
  13187. USART_ClearITPendingBit(UPS_USART, USART_IT_TXE);
  13188. 8026886: 4814 ldr r0, [pc, #80] ; (80268d8 <USART2_IRQHandler+0xa0>)
  13189. 8026888: f240 7127 movw r1, #1831 ; 0x727
  13190. 802688c: f7ff f943 bl 8025b16 <USART_ClearITPendingBit>
  13191. }
  13192. if(USART_GetITStatus(UPS_USART, USART_IT_RXNE) != RESET)
  13193. 8026890: 4c11 ldr r4, [pc, #68] ; (80268d8 <USART2_IRQHandler+0xa0>)
  13194. 8026892: f240 5125 movw r1, #1317 ; 0x525
  13195. 8026896: 4620 mov r0, r4
  13196. 8026898: f7ff f91d bl 8025ad6 <USART_GetITStatus>
  13197. 802689c: b1d8 cbz r0, 80268d6 <USART2_IRQHandler+0x9e>
  13198. {
  13199. c = (uint32_t)UPS_USART->DR;
  13200. 802689e: 88a3 ldrh r3, [r4, #4]
  13201. //DBG printf("read: %d 0x%x\r\n", rs485_rx_rbuf.write_index,c);
  13202. if (!rbuf_isfull(&ups_rx_rbuf))
  13203. 80268a0: 480f ldr r0, [pc, #60] ; (80268e0 <USART2_IRQHandler+0xa8>)
  13204. }
  13205. USART_ClearITPendingBit(UPS_USART, USART_IT_TXE);
  13206. }
  13207. if(USART_GetITStatus(UPS_USART, USART_IT_RXNE) != RESET)
  13208. {
  13209. c = (uint32_t)UPS_USART->DR;
  13210. 80268a2: b29b uxth r3, r3
  13211. 80268a4: 9301 str r3, [sp, #4]
  13212. //DBG printf("read: %d 0x%x\r\n", rs485_rx_rbuf.write_index,c);
  13213. if (!rbuf_isfull(&ups_rx_rbuf))
  13214. 80268a6: f001 fa49 bl 8027d3c <rbuf_isfull>
  13215. 80268aa: b918 cbnz r0, 80268b4 <USART2_IRQHandler+0x7c>
  13216. rbuf32_put(&ups_rx_rbuf, c);
  13217. 80268ac: 480c ldr r0, [pc, #48] ; (80268e0 <USART2_IRQHandler+0xa8>)
  13218. 80268ae: 9901 ldr r1, [sp, #4]
  13219. 80268b0: f001 fa65 bl 8027d7e <rbuf32_put>
  13220. USART_ClearITPendingBit(UPS_USART, USART_IT_RXNE);
  13221. 80268b4: 4808 ldr r0, [pc, #32] ; (80268d8 <USART2_IRQHandler+0xa0>)
  13222. xSemaphoreGiveFromISR(xSem_rx_buf, &xHigherPriorityTaskWoken);
  13223. 80268b6: 4c0b ldr r4, [pc, #44] ; (80268e4 <USART2_IRQHandler+0xac>)
  13224. {
  13225. c = (uint32_t)UPS_USART->DR;
  13226. //DBG printf("read: %d 0x%x\r\n", rs485_rx_rbuf.write_index,c);
  13227. if (!rbuf_isfull(&ups_rx_rbuf))
  13228. rbuf32_put(&ups_rx_rbuf, c);
  13229. USART_ClearITPendingBit(UPS_USART, USART_IT_RXNE);
  13230. 80268b8: f240 5125 movw r1, #1317 ; 0x525
  13231. 80268bc: f7ff f92b bl 8025b16 <USART_ClearITPendingBit>
  13232. xSemaphoreGiveFromISR(xSem_rx_buf, &xHigherPriorityTaskWoken);
  13233. 80268c0: 4b09 ldr r3, [pc, #36] ; (80268e8 <USART2_IRQHandler+0xb0>)
  13234. 80268c2: 4621 mov r1, r4
  13235. 80268c4: 6818 ldr r0, [r3, #0]
  13236. 80268c6: f001 fc9f bl 8028208 <xQueueGiveFromISR>
  13237. portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
  13238. 80268ca: 6823 ldr r3, [r4, #0]
  13239. 80268cc: b11b cbz r3, 80268d6 <USART2_IRQHandler+0x9e>
  13240. 80268ce: 4b07 ldr r3, [pc, #28] ; (80268ec <USART2_IRQHandler+0xb4>)
  13241. 80268d0: f04f 5280 mov.w r2, #268435456 ; 0x10000000
  13242. 80268d4: 601a str r2, [r3, #0]
  13243. }
  13244. void USART2_IRQHandler(void) {
  13245. rs232_irq_handler();
  13246. }
  13247. 80268d6: bd1c pop {r2, r3, r4, pc}
  13248. 80268d8: 40004400 .word 0x40004400
  13249. 80268dc: 2000e82c .word 0x2000e82c
  13250. 80268e0: 2000e4fc .word 0x2000e4fc
  13251. 80268e4: 20002894 .word 0x20002894
  13252. 80268e8: 2000e84c .word 0x2000e84c
  13253. 80268ec: e000ed04 .word 0xe000ed04
  13254. 080268f0 <USART3_IRQHandler>:
  13255. void USART3_IRQHandler(void) {
  13256. 80268f0: 4770 bx lr
  13257. 80268f2: 0000 movs r0, r0
  13258. 080268f4 <InitTask>:
  13259. /**
  13260. * @brief Задача инициализации. Запускает основные задачи девайса и умирает.
  13261. * @retval
  13262. */
  13263. void InitTask(void *params)
  13264. {
  13265. 80268f4: b51f push {r0, r1, r2, r3, r4, lr}
  13266. // -----------------------------------------------------------------------------
  13267. #ifdef LED_ENABLE
  13268. LED_Init();
  13269. /* Простая мигалка для подтверждения живучести контроллера */
  13270. xTaskCreate(vTaskLedBlink, "LED_Blink", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);//&xTaskToKill
  13271. 80268f6: 2400 movs r4, #0
  13272. void InitTask(void *params)
  13273. {
  13274. // -----------------------------------------------------------------------------
  13275. // xTaskCreate(vTaskWdt, "WDT", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  13276. // -----------------------------------------------------------------------------
  13277. InitUSART();
  13278. 80268f8: f7ff ff3a bl 8026770 <InitUSART>
  13279. ups_megatec_init();
  13280. 80268fc: f001 fa04 bl 8027d08 <ups_megatec_init>
  13281. // -----------------------------------------------------------------------------
  13282. // RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
  13283. /* SETTINGS_SetDefaultDebug();
  13284. SETTINGS_Save();*/
  13285. SETTINGS_Load();
  13286. 8026900: f001 f816 bl 8027930 <SETTINGS_Load>
  13287. set_mode_jumper();
  13288. 8026904: f001 f8f6 bl 8027af4 <set_mode_jumper>
  13289. #endif
  13290. // -----------------------------------------------------------------------------
  13291. // -----------------------------------------------------------------------------
  13292. #ifdef LED_ENABLE
  13293. LED_Init();
  13294. 8026908: f001 f873 bl 80279f2 <LED_Init>
  13295. /* Простая мигалка для подтверждения живучести контроллера */
  13296. xTaskCreate(vTaskLedBlink, "LED_Blink", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);//&xTaskToKill
  13297. 802690c: 2280 movs r2, #128 ; 0x80
  13298. 802690e: 4623 mov r3, r4
  13299. 8026910: 4914 ldr r1, [pc, #80] ; (8026964 <InitTask+0x70>)
  13300. 8026912: 9400 str r4, [sp, #0]
  13301. 8026914: 9401 str r4, [sp, #4]
  13302. 8026916: 9402 str r4, [sp, #8]
  13303. 8026918: 9403 str r4, [sp, #12]
  13304. 802691a: 4813 ldr r0, [pc, #76] ; (8026968 <InitTask+0x74>)
  13305. 802691c: f001 fd84 bl 8028428 <xTaskGenericCreate>
  13306. #endif
  13307. // -----------------------------------------------------------------------------
  13308. // -----------------------------------------------------------------------------
  13309. #ifdef BUTTON_ENABLE
  13310. BUTTON_Init();
  13311. 8026920: f001 f8a0 bl 8027a64 <BUTTON_Init>
  13312. xTaskCreate(vTaskButtons, "Buttons", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  13313. 8026924: 4911 ldr r1, [pc, #68] ; (802696c <InitTask+0x78>)
  13314. 8026926: 9400 str r4, [sp, #0]
  13315. 8026928: 2280 movs r2, #128 ; 0x80
  13316. 802692a: 4623 mov r3, r4
  13317. 802692c: 9401 str r4, [sp, #4]
  13318. 802692e: 9402 str r4, [sp, #8]
  13319. 8026930: 9403 str r4, [sp, #12]
  13320. 8026932: 480f ldr r0, [pc, #60] ; (8026970 <InitTask+0x7c>)
  13321. 8026934: f001 fd78 bl 8028428 <xTaskGenericCreate>
  13322. //xTaskCreate( d_inouts_task, "inouts_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  13323. // xTaskCreate( d_inouts_test, "d_inouts_test", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  13324. // -----------------------------------------------------------------------------
  13325. #ifdef RTC_ENABLE
  13326. TM_RTC_Init(TM_RTC_ClockSource_External); // Так было
  13327. 8026938: 2001 movs r0, #1
  13328. 802693a: f7ff fc0b bl 8026154 <TM_RTC_Init>
  13329. #endif
  13330. // -----------------------------------------------------------------------------
  13331. // -----------------------------------------------------------------------------
  13332. #ifdef NET_ENABLE
  13333. ETH_BSP_Config();
  13334. 802693e: f00c fc01 bl 8033144 <ETH_BSP_Config>
  13335. LwIP_Init();
  13336. 8026942: f00c fa15 bl 8032d70 <LwIP_Init>
  13337. #ifdef WEB_SERVER_ENABLE
  13338. HTTP_Init();
  13339. 8026946: f002 fc37 bl 80291b8 <HTTP_Init>
  13340. //TEST_IO();
  13341. /* Контроль успешной загрузки. Сброс флага bootry */
  13342. /* Сброс флага и сохранение нового значения во флеш памяти происходт после
  13343. некоторой задержки для запуска всех задач */
  13344. vTaskDelay(4000);
  13345. 802694a: f44f 607a mov.w r0, #4000 ; 0xfa0
  13346. 802694e: f002 f801 bl 8028954 <vTaskDelay>
  13347. /* if (!dhcp)
  13348. SNMP_SendUserTrap(DEVICE_REBOOTED);
  13349. printf("Hello world\r\n");*/
  13350. vTaskDelete(NULL);
  13351. 8026952: 4620 mov r0, r4
  13352. 8026954: f001 fe40 bl 80285d8 <vTaskDelete>
  13353. taskYIELD();
  13354. }
  13355. 8026958: b004 add sp, #16
  13356. 802695a: e8bd 4010 ldmia.w sp!, {r4, lr}
  13357. SNMP_SendUserTrap(DEVICE_REBOOTED);
  13358. printf("Hello world\r\n");*/
  13359. vTaskDelete(NULL);
  13360. taskYIELD();
  13361. 802695e: f002 b9d5 b.w 8028d0c <vPortYield>
  13362. 8026962: bf00 nop
  13363. 8026964: 08033d28 .word 0x08033d28
  13364. 8026968: 080279d5 .word 0x080279d5
  13365. 802696c: 08033d32 .word 0x08033d32
  13366. 8026970: 08027ae1 .word 0x08027ae1
  13367. 08026974 <main>:
  13368. void vApplicationTickHook(void) {
  13369. }
  13370. int main()
  13371. {
  13372. 8026974: b51f push {r0, r1, r2, r3, r4, lr}
  13373. This function disables IRQ interrupts by setting the I-bit in the CPSR.
  13374. Can only be executed in Privileged modes.
  13375. */
  13376. __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
  13377. {
  13378. __ASM volatile ("cpsid i" : : : "memory");
  13379. 8026976: b672 cpsid i
  13380. //TIM_Cmd(TIM13, DISABLE);
  13381. //TIM_ClearITPendingBit(TIM13, TIM_IT_Update);
  13382. __disable_irq();
  13383. NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x20000);
  13384. 8026978: f04f 6000 mov.w r0, #134217728 ; 0x8000000
  13385. 802697c: f44f 3100 mov.w r1, #131072 ; 0x20000
  13386. 8026980: f7fe fbb0 bl 80250e4 <NVIC_SetVectorTable>
  13387. __STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
  13388. {
  13389. uint32_t reg_value;
  13390. uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */
  13391. reg_value = SCB->AIRCR; /* read old register configuration */
  13392. 8026984: 4a17 ldr r2, [pc, #92] ; (80269e4 <main+0x70>)
  13393. 8026986: 68d1 ldr r1, [r2, #12]
  13394. reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */
  13395. 8026988: f64f 03ff movw r3, #63743 ; 0xf8ff
  13396. 802698c: 400b ands r3, r1
  13397. reg_value = (reg_value |
  13398. 802698e: f043 63bf orr.w r3, r3, #100139008 ; 0x5f80000
  13399. 8026992: f443 3300 orr.w r3, r3, #131072 ; 0x20000
  13400. ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  13401. (PriorityGroupTmp << 8)); /* Insert write key and priorty group */
  13402. SCB->AIRCR = reg_value;
  13403. 8026996: 60d3 str r3, [r2, #12]
  13404. NVIC_SetPriorityGrouping(0);
  13405. NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
  13406. 8026998: f44f 7040 mov.w r0, #768 ; 0x300
  13407. 802699c: f7fe fb64 bl 8025068 <NVIC_PriorityGroupConfig>
  13408. This function enables IRQ interrupts by clearing the I-bit in the CPSR.
  13409. Can only be executed in Privileged modes.
  13410. */
  13411. __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
  13412. {
  13413. __ASM volatile ("cpsie i" : : : "memory");
  13414. 80269a0: b662 cpsie i
  13415. __enable_irq();
  13416. //WDG_Init();
  13417. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
  13418. 80269a2: 2101 movs r1, #1
  13419. 80269a4: f44f 5080 mov.w r0, #4096 ; 0x1000
  13420. 80269a8: f7fe fdbe bl 8025528 <RCC_AHB1PeriphClockCmd>
  13421. /* Clear flash error flags if were set */
  13422. FLASH_ClearFlag(FLASH_FLAG_PGPERR);
  13423. 80269ac: 2040 movs r0, #64 ; 0x40
  13424. gpio_init();
  13425. spi_flash_test();
  13426. // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  13427. xTaskCreate( InitTask, "InitTask", 1000, NULL, tskIDLE_PRIORITY, NULL);
  13428. 80269ae: 2400 movs r4, #0
  13429. //WDG_Init();
  13430. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
  13431. /* Clear flash error flags if were set */
  13432. FLASH_ClearFlag(FLASH_FLAG_PGPERR);
  13433. 80269b0: f7fe fbce bl 8025150 <FLASH_ClearFlag>
  13434. FLASH_ClearFlag(FLASH_FLAG_PGSERR);
  13435. 80269b4: 2080 movs r0, #128 ; 0x80
  13436. 80269b6: f7fe fbcb bl 8025150 <FLASH_ClearFlag>
  13437. gpio_init();
  13438. 80269ba: f7ff f9e9 bl 8025d90 <gpio_init>
  13439. spi_flash_test();
  13440. 80269be: f7ff fdf1 bl 80265a4 <spi_flash_test>
  13441. // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  13442. xTaskCreate( InitTask, "InitTask", 1000, NULL, tskIDLE_PRIORITY, NULL);
  13443. 80269c2: 4909 ldr r1, [pc, #36] ; (80269e8 <main+0x74>)
  13444. 80269c4: 9400 str r4, [sp, #0]
  13445. 80269c6: f44f 727a mov.w r2, #1000 ; 0x3e8
  13446. 80269ca: 4623 mov r3, r4
  13447. 80269cc: 9401 str r4, [sp, #4]
  13448. 80269ce: 9402 str r4, [sp, #8]
  13449. 80269d0: 9403 str r4, [sp, #12]
  13450. 80269d2: 4806 ldr r0, [pc, #24] ; (80269ec <main+0x78>)
  13451. 80269d4: f001 fd28 bl 8028428 <xTaskGenericCreate>
  13452. vTaskStartScheduler();
  13453. 80269d8: f001 fe58 bl 802868c <vTaskStartScheduler>
  13454. /*while(1)
  13455. {
  13456. }*/
  13457. }
  13458. 80269dc: 4620 mov r0, r4
  13459. 80269de: b004 add sp, #16
  13460. 80269e0: bd10 pop {r4, pc}
  13461. 80269e2: bf00 nop
  13462. 80269e4: e000ed00 .word 0xe000ed00
  13463. 80269e8: 08033d3a .word 0x08033d3a
  13464. 80269ec: 080268f5 .word 0x080268f5
  13465. 080269f0 <NMI_Handler>:
  13466. * @brief This function handles NMI exception.
  13467. * @param None
  13468. * @retval None
  13469. */
  13470. void NMI_Handler(void)
  13471. {
  13472. 80269f0: 4770 bx lr
  13473. 80269f2: 0000 movs r0, r0
  13474. 080269f4 <HardFault_Output>:
  13475. }
  13476. void HardFault_Output(uint32_t *sp)
  13477. {
  13478. 80269f4: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  13479. uint32_t r0 = sp[0];
  13480. uint32_t r1 = sp[1];
  13481. 80269f8: e890 0808 ldmia.w r0, {r3, fp}
  13482. uint32_t r2 = sp[2];
  13483. 80269fc: f8d0 a008 ldr.w sl, [r0, #8]
  13484. uint32_t r3 = sp[3];
  13485. 8026a00: f8d0 900c ldr.w r9, [r0, #12]
  13486. uint32_t r12 = sp[4];
  13487. 8026a04: f8d0 8010 ldr.w r8, [r0, #16]
  13488. uint32_t lr = sp[5];
  13489. 8026a08: 6947 ldr r7, [r0, #20]
  13490. uint32_t pc = sp[6];
  13491. 8026a0a: 6986 ldr r6, [r0, #24]
  13492. uint32_t psr = sp[7];
  13493. 8026a0c: 69c5 ldr r5, [r0, #28]
  13494. printf("HardFault:\n\r");
  13495. 8026a0e: 9301 str r3, [sp, #4]
  13496. void NMI_Handler(void)
  13497. {
  13498. }
  13499. void HardFault_Output(uint32_t *sp)
  13500. {
  13501. 8026a10: 4604 mov r4, r0
  13502. uint32_t r12 = sp[4];
  13503. uint32_t lr = sp[5];
  13504. uint32_t pc = sp[6];
  13505. uint32_t psr = sp[7];
  13506. printf("HardFault:\n\r");
  13507. 8026a12: 4816 ldr r0, [pc, #88] ; (8026a6c <HardFault_Output+0x78>)
  13508. 8026a14: f000 fbbc bl 8027190 <tfp_printf>
  13509. /* Print CFSR register */
  13510. /* Print CPU registers */
  13511. printf("\n\rRegisters:\n\r");
  13512. 8026a18: 4815 ldr r0, [pc, #84] ; (8026a70 <HardFault_Output+0x7c>)
  13513. 8026a1a: f000 fbb9 bl 8027190 <tfp_printf>
  13514. printf("SP 0x%08lx\n\r", (uint32_t)sp);
  13515. 8026a1e: 4815 ldr r0, [pc, #84] ; (8026a74 <HardFault_Output+0x80>)
  13516. 8026a20: 4621 mov r1, r4
  13517. 8026a22: f000 fbb5 bl 8027190 <tfp_printf>
  13518. printf("R0 0x%08lx\n\r", r0);
  13519. 8026a26: 9b01 ldr r3, [sp, #4]
  13520. 8026a28: 4813 ldr r0, [pc, #76] ; (8026a78 <HardFault_Output+0x84>)
  13521. 8026a2a: 4619 mov r1, r3
  13522. 8026a2c: f000 fbb0 bl 8027190 <tfp_printf>
  13523. printf("R1 0x%08lx\n\r", r1);
  13524. 8026a30: 4812 ldr r0, [pc, #72] ; (8026a7c <HardFault_Output+0x88>)
  13525. 8026a32: 4659 mov r1, fp
  13526. 8026a34: f000 fbac bl 8027190 <tfp_printf>
  13527. printf("R2 0x%08lx\n\r", r2);
  13528. 8026a38: 4811 ldr r0, [pc, #68] ; (8026a80 <HardFault_Output+0x8c>)
  13529. 8026a3a: 4651 mov r1, sl
  13530. 8026a3c: f000 fba8 bl 8027190 <tfp_printf>
  13531. printf("R3 0x%08lx\n\r", r3);
  13532. 8026a40: 4810 ldr r0, [pc, #64] ; (8026a84 <HardFault_Output+0x90>)
  13533. 8026a42: 4649 mov r1, r9
  13534. 8026a44: f000 fba4 bl 8027190 <tfp_printf>
  13535. printf("R12 0x%08lx\n\r", r12);
  13536. 8026a48: 480f ldr r0, [pc, #60] ; (8026a88 <HardFault_Output+0x94>)
  13537. 8026a4a: 4641 mov r1, r8
  13538. 8026a4c: f000 fba0 bl 8027190 <tfp_printf>
  13539. printf("LR 0x%08lx\n\r", lr);
  13540. 8026a50: 480e ldr r0, [pc, #56] ; (8026a8c <HardFault_Output+0x98>)
  13541. 8026a52: 4639 mov r1, r7
  13542. 8026a54: f000 fb9c bl 8027190 <tfp_printf>
  13543. printf("PC 0x%08lx\n\r", pc);
  13544. 8026a58: 480d ldr r0, [pc, #52] ; (8026a90 <HardFault_Output+0x9c>)
  13545. 8026a5a: 4631 mov r1, r6
  13546. 8026a5c: f000 fb98 bl 8027190 <tfp_printf>
  13547. printf("PSR 0x%08lx\n\r", psr);
  13548. 8026a60: 480c ldr r0, [pc, #48] ; (8026a94 <HardFault_Output+0xa0>)
  13549. 8026a62: 4629 mov r1, r5
  13550. 8026a64: f000 fb94 bl 8027190 <tfp_printf>
  13551. 8026a68: e7fe b.n 8026a68 <HardFault_Output+0x74>
  13552. 8026a6a: bf00 nop
  13553. 8026a6c: 08033d43 .word 0x08033d43
  13554. 8026a70: 08033d50 .word 0x08033d50
  13555. 8026a74: 08033d5f .word 0x08033d5f
  13556. 8026a78: 08033d75 .word 0x08033d75
  13557. 8026a7c: 08033d8b .word 0x08033d8b
  13558. 8026a80: 08033da1 .word 0x08033da1
  13559. 8026a84: 08033db7 .word 0x08033db7
  13560. 8026a88: 08033dcd .word 0x08033dcd
  13561. 8026a8c: 08033de3 .word 0x08033de3
  13562. 8026a90: 08033df9 .word 0x08033df9
  13563. 8026a94: 08033e0f .word 0x08033e0f
  13564. 08026a98 <HardFault_Handler>:
  13565. * @retval None
  13566. */
  13567. __attribute__( (naked) )
  13568. void HardFault_Handler(void)
  13569. {
  13570. __asm volatile
  13571. 8026a98: f01e 0f04 tst.w lr, #4
  13572. 8026a9c: bf0c ite eq
  13573. 8026a9e: f3ef 8008 mrseq r0, MSP
  13574. 8026aa2: f3ef 8009 mrsne r0, PSP
  13575. 8026aa6: f8df 1004 ldr.w r1, [pc, #4] ; 8026aac <debugHardfault_address>
  13576. 8026aaa: 4708 bx r1
  13577. 08026aac <debugHardfault_address>:
  13578. 8026aac: 080269f5 .word 0x080269f5
  13579. 08026ab0 <MemManage_Handler>:
  13580. * @brief This function handles Memory Manage exception.
  13581. * @param None
  13582. * @retval None
  13583. */
  13584. void MemManage_Handler(void)
  13585. {
  13586. 8026ab0: e7fe b.n 8026ab0 <MemManage_Handler>
  13587. 8026ab2: 0000 movs r0, r0
  13588. 08026ab4 <TIM8_UP_TIM13_IRQHandler>:
  13589. }
  13590. }
  13591. void TIM8_UP_TIM13_IRQHandler(void)
  13592. {
  13593. TIM_ClearITPendingBit(TIM13, TIM_IT_Update);
  13594. 8026ab4: 4801 ldr r0, [pc, #4] ; (8026abc <TIM8_UP_TIM13_IRQHandler+0x8>)
  13595. 8026ab6: 2101 movs r1, #1
  13596. 8026ab8: f7fe bf36 b.w 8025928 <TIM_ClearITPendingBit>
  13597. 8026abc: 40001c00 .word 0x40001c00
  13598. 08026ac0 <BusFault_Handler>:
  13599. * @brief This function handles Bus Fault exception.
  13600. * @param None
  13601. * @retval None
  13602. */
  13603. void BusFault_Handler(void)
  13604. {
  13605. 8026ac0: e7fe b.n 8026ac0 <BusFault_Handler>
  13606. 08026ac2 <UsageFault_Handler>:
  13607. * @brief This function handles Usage Fault exception.
  13608. * @param None
  13609. * @retval None
  13610. */
  13611. void UsageFault_Handler(void)
  13612. {
  13613. 8026ac2: e7fe b.n 8026ac2 <UsageFault_Handler>
  13614. 08026ac4 <DebugMon_Handler>:
  13615. * @brief This function handles Debug Monitor exception.
  13616. * @param None
  13617. * @retval None
  13618. */
  13619. void DebugMon_Handler(void)
  13620. {
  13621. 8026ac4: 4770 bx lr
  13622. 08026ac6 <SDIO_IRQHandler>:
  13623. /*void PPP_IRQHandler(void)
  13624. {
  13625. }*/
  13626. void SDIO_IRQHandler(void)
  13627. {
  13628. 8026ac6: 4770 bx lr
  13629. 08026ac8 <ETH_IRQHandler>:
  13630. * @brief This function handles ethernet DMA interrupt request.
  13631. * @param None
  13632. * @retval None
  13633. */
  13634. void ETH_IRQHandler(void)
  13635. {
  13636. 8026ac8: b507 push {r0, r1, r2, lr}
  13637. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  13638. 8026aca: 2300 movs r3, #0
  13639. /* Frame received */
  13640. if ( ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET)
  13641. 8026acc: 2040 movs r0, #64 ; 0x40
  13642. * @param None
  13643. * @retval None
  13644. */
  13645. void ETH_IRQHandler(void)
  13646. {
  13647. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  13648. 8026ace: 9301 str r3, [sp, #4]
  13649. /* Frame received */
  13650. if ( ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET)
  13651. 8026ad0: f00c fdd6 bl 8033680 <ETH_GetDMAFlagStatus>
  13652. 8026ad4: 2801 cmp r0, #1
  13653. 8026ad6: d104 bne.n 8026ae2 <ETH_IRQHandler+0x1a>
  13654. {
  13655. /* Give the semaphore to wakeup LwIP task */
  13656. xSemaphoreGiveFromISR( s_xSemaphore, &xHigherPriorityTaskWoken );
  13657. 8026ad8: 4b09 ldr r3, [pc, #36] ; (8026b00 <ETH_IRQHandler+0x38>)
  13658. 8026ada: a901 add r1, sp, #4
  13659. 8026adc: 6818 ldr r0, [r3, #0]
  13660. 8026ade: f001 fb93 bl 8028208 <xQueueGiveFromISR>
  13661. }
  13662. /* Clear the interrupt flags. */
  13663. /* Clear the Eth DMA Rx IT pending bits */
  13664. ETH_DMAClearITPendingBit(ETH_DMA_IT_R);
  13665. 8026ae2: 2040 movs r0, #64 ; 0x40
  13666. 8026ae4: f00c fde2 bl 80336ac <ETH_DMAClearITPendingBit>
  13667. ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);
  13668. 8026ae8: f44f 3080 mov.w r0, #65536 ; 0x10000
  13669. 8026aec: f00c fdde bl 80336ac <ETH_DMAClearITPendingBit>
  13670. // Switch tasks if necessary. */
  13671. if( xHigherPriorityTaskWoken != pdFALSE )
  13672. 8026af0: 9b01 ldr r3, [sp, #4]
  13673. 8026af2: b11b cbz r3, 8026afc <ETH_IRQHandler+0x34>
  13674. {
  13675. portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
  13676. 8026af4: 4b03 ldr r3, [pc, #12] ; (8026b04 <ETH_IRQHandler+0x3c>)
  13677. 8026af6: f04f 5280 mov.w r2, #268435456 ; 0x10000000
  13678. 8026afa: 601a str r2, [r3, #0]
  13679. }
  13680. }
  13681. 8026afc: bd0e pop {r1, r2, r3, pc}
  13682. 8026afe: bf00 nop
  13683. 8026b00: 2000e494 .word 0x2000e494
  13684. 8026b04: e000ed04 .word 0xe000ed04
  13685. 08026b08 <ulli2a>:
  13686. #ifdef PRINTF_LONG_LONG_SUPPORT
  13687. static void _TFP_GCC_NO_INLINE_ ulli2a(
  13688. unsigned long long int num, struct param *p)
  13689. {
  13690. 8026b08: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  13691. int n = 0;
  13692. unsigned long long int d = 1;
  13693. char *bf = p->bf;
  13694. while (num / d >= p->base)
  13695. 8026b0c: 68d3 ldr r3, [r2, #12]
  13696. static void _TFP_GCC_NO_INLINE_ ulli2a(
  13697. unsigned long long int num, struct param *p)
  13698. {
  13699. int n = 0;
  13700. unsigned long long int d = 1;
  13701. char *bf = p->bf;
  13702. 8026b0e: f8d2 b010 ldr.w fp, [r2, #16]
  13703. #ifdef PRINTF_LONG_LONG_SUPPORT
  13704. static void _TFP_GCC_NO_INLINE_ ulli2a(
  13705. unsigned long long int num, struct param *p)
  13706. {
  13707. 8026b12: 4681 mov r9, r0
  13708. 8026b14: 468a mov sl, r1
  13709. 8026b16: 4690 mov r8, r2
  13710. int n = 0;
  13711. unsigned long long int d = 1;
  13712. char *bf = p->bf;
  13713. while (num / d >= p->base)
  13714. 8026b18: 461e mov r6, r3
  13715. 8026b1a: 2700 movs r7, #0
  13716. #ifdef PRINTF_LONG_LONG_SUPPORT
  13717. static void _TFP_GCC_NO_INLINE_ ulli2a(
  13718. unsigned long long int num, struct param *p)
  13719. {
  13720. int n = 0;
  13721. unsigned long long int d = 1;
  13722. 8026b1c: 2401 movs r4, #1
  13723. 8026b1e: 2500 movs r5, #0
  13724. char *bf = p->bf;
  13725. while (num / d >= p->base)
  13726. 8026b20: e006 b.n 8026b30 <ulli2a+0x28>
  13727. d *= p->base;
  13728. 8026b22: fb04 f307 mul.w r3, r4, r7
  13729. 8026b26: fb06 3305 mla r3, r6, r5, r3
  13730. 8026b2a: fba4 4506 umull r4, r5, r4, r6
  13731. 8026b2e: 195d adds r5, r3, r5
  13732. unsigned long long int num, struct param *p)
  13733. {
  13734. int n = 0;
  13735. unsigned long long int d = 1;
  13736. char *bf = p->bf;
  13737. while (num / d >= p->base)
  13738. 8026b30: 4648 mov r0, r9
  13739. 8026b32: 4651 mov r1, sl
  13740. 8026b34: 4622 mov r2, r4
  13741. 8026b36: 462b mov r3, r5
  13742. 8026b38: f7fa f854 bl 8020be4 <__aeabi_uldivmod>
  13743. 8026b3c: 42b9 cmp r1, r7
  13744. 8026b3e: bf08 it eq
  13745. 8026b40: 42b0 cmpeq r0, r6
  13746. 8026b42: d2ee bcs.n 8026b22 <ulli2a+0x1a>
  13747. 8026b44: 2600 movs r6, #0
  13748. 8026b46: e02d b.n 8026ba4 <ulli2a+0x9c>
  13749. d *= p->base;
  13750. while (d != 0) {
  13751. int dgt = num / d;
  13752. 8026b48: 4622 mov r2, r4
  13753. 8026b4a: 462b mov r3, r5
  13754. 8026b4c: 4648 mov r0, r9
  13755. 8026b4e: 4651 mov r1, sl
  13756. 8026b50: f7fa f848 bl 8020be4 <__aeabi_uldivmod>
  13757. num %= d;
  13758. 8026b54: 4651 mov r1, sl
  13759. 8026b56: 4622 mov r2, r4
  13760. 8026b58: 462b mov r3, r5
  13761. unsigned long long int d = 1;
  13762. char *bf = p->bf;
  13763. while (num / d >= p->base)
  13764. d *= p->base;
  13765. while (d != 0) {
  13766. int dgt = num / d;
  13767. 8026b5a: 4607 mov r7, r0
  13768. num %= d;
  13769. 8026b5c: 4648 mov r0, r9
  13770. 8026b5e: f7fa f841 bl 8020be4 <__aeabi_uldivmod>
  13771. d /= p->base;
  13772. 8026b62: 4620 mov r0, r4
  13773. 8026b64: 4629 mov r1, r5
  13774. char *bf = p->bf;
  13775. while (num / d >= p->base)
  13776. d *= p->base;
  13777. while (d != 0) {
  13778. int dgt = num / d;
  13779. num %= d;
  13780. 8026b66: 4691 mov r9, r2
  13781. 8026b68: 469a mov sl, r3
  13782. d /= p->base;
  13783. 8026b6a: f8d8 200c ldr.w r2, [r8, #12]
  13784. 8026b6e: 2300 movs r3, #0
  13785. 8026b70: f7fa f838 bl 8020be4 <__aeabi_uldivmod>
  13786. 8026b74: 4604 mov r4, r0
  13787. 8026b76: 460d mov r5, r1
  13788. if (n || dgt > 0 || d == 0) {
  13789. 8026b78: b926 cbnz r6, 8026b84 <ulli2a+0x7c>
  13790. 8026b7a: 2f00 cmp r7, #0
  13791. 8026b7c: dc02 bgt.n 8026b84 <ulli2a+0x7c>
  13792. 8026b7e: ea54 0305 orrs.w r3, r4, r5
  13793. 8026b82: d1e1 bne.n 8026b48 <ulli2a+0x40>
  13794. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  13795. 8026b84: 2f09 cmp r7, #9
  13796. 8026b86: b2fa uxtb r2, r7
  13797. 8026b88: dd07 ble.n 8026b9a <ulli2a+0x92>
  13798. 8026b8a: f898 3000 ldrb.w r3, [r8]
  13799. 8026b8e: f013 0f04 tst.w r3, #4
  13800. 8026b92: bf0c ite eq
  13801. 8026b94: 2357 moveq r3, #87 ; 0x57
  13802. 8026b96: 2337 movne r3, #55 ; 0x37
  13803. 8026b98: e000 b.n 8026b9c <ulli2a+0x94>
  13804. 8026b9a: 2330 movs r3, #48 ; 0x30
  13805. 8026b9c: 189b adds r3, r3, r2
  13806. 8026b9e: f80b 3b01 strb.w r3, [fp], #1
  13807. ++n;
  13808. 8026ba2: 3601 adds r6, #1
  13809. int n = 0;
  13810. unsigned long long int d = 1;
  13811. char *bf = p->bf;
  13812. while (num / d >= p->base)
  13813. d *= p->base;
  13814. while (d != 0) {
  13815. 8026ba4: ea54 0305 orrs.w r3, r4, r5
  13816. 8026ba8: d1ce bne.n 8026b48 <ulli2a+0x40>
  13817. if (n || dgt > 0 || d == 0) {
  13818. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  13819. ++n;
  13820. }
  13821. }
  13822. *bf = 0;
  13823. 8026baa: 2300 movs r3, #0
  13824. 8026bac: f88b 3000 strb.w r3, [fp]
  13825. 8026bb0: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  13826. 08026bb4 <uli2a>:
  13827. }
  13828. #endif
  13829. #ifdef PRINTF_LONG_SUPPORT
  13830. static void uli2a(unsigned long int num, struct param *p)
  13831. {
  13832. 8026bb4: b570 push {r4, r5, r6, lr}
  13833. int n = 0;
  13834. unsigned long int d = 1;
  13835. char *bf = p->bf;
  13836. while (num / d >= p->base)
  13837. 8026bb6: 68ca ldr r2, [r1, #12]
  13838. #ifdef PRINTF_LONG_SUPPORT
  13839. static void uli2a(unsigned long int num, struct param *p)
  13840. {
  13841. int n = 0;
  13842. unsigned long int d = 1;
  13843. char *bf = p->bf;
  13844. 8026bb8: 690c ldr r4, [r1, #16]
  13845. #ifdef PRINTF_LONG_SUPPORT
  13846. static void uli2a(unsigned long int num, struct param *p)
  13847. {
  13848. int n = 0;
  13849. unsigned long int d = 1;
  13850. 8026bba: 2301 movs r3, #1
  13851. char *bf = p->bf;
  13852. while (num / d >= p->base)
  13853. 8026bbc: e000 b.n 8026bc0 <uli2a+0xc>
  13854. d *= p->base;
  13855. 8026bbe: 4353 muls r3, r2
  13856. static void uli2a(unsigned long int num, struct param *p)
  13857. {
  13858. int n = 0;
  13859. unsigned long int d = 1;
  13860. char *bf = p->bf;
  13861. while (num / d >= p->base)
  13862. 8026bc0: fbb0 f5f3 udiv r5, r0, r3
  13863. 8026bc4: 4295 cmp r5, r2
  13864. 8026bc6: d2fa bcs.n 8026bbe <uli2a+0xa>
  13865. 8026bc8: 2500 movs r5, #0
  13866. 8026bca: e01a b.n 8026c02 <uli2a+0x4e>
  13867. d *= p->base;
  13868. while (d != 0) {
  13869. int dgt = num / d;
  13870. num %= d;
  13871. d /= p->base;
  13872. 8026bcc: 68ce ldr r6, [r1, #12]
  13873. unsigned long int d = 1;
  13874. char *bf = p->bf;
  13875. while (num / d >= p->base)
  13876. d *= p->base;
  13877. while (d != 0) {
  13878. int dgt = num / d;
  13879. 8026bce: fbb0 f2f3 udiv r2, r0, r3
  13880. num %= d;
  13881. 8026bd2: fb03 0012 mls r0, r3, r2, r0
  13882. d /= p->base;
  13883. 8026bd6: fbb3 f3f6 udiv r3, r3, r6
  13884. if (n || dgt > 0 || d == 0) {
  13885. 8026bda: b91d cbnz r5, 8026be4 <uli2a+0x30>
  13886. 8026bdc: 2a00 cmp r2, #0
  13887. 8026bde: dc01 bgt.n 8026be4 <uli2a+0x30>
  13888. 8026be0: 2b00 cmp r3, #0
  13889. 8026be2: d1f3 bne.n 8026bcc <uli2a+0x18>
  13890. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  13891. 8026be4: 2a09 cmp r2, #9
  13892. 8026be6: b2d6 uxtb r6, r2
  13893. 8026be8: dd06 ble.n 8026bf8 <uli2a+0x44>
  13894. 8026bea: 780a ldrb r2, [r1, #0]
  13895. 8026bec: f012 0f04 tst.w r2, #4
  13896. 8026bf0: bf0c ite eq
  13897. 8026bf2: 2257 moveq r2, #87 ; 0x57
  13898. 8026bf4: 2237 movne r2, #55 ; 0x37
  13899. 8026bf6: e000 b.n 8026bfa <uli2a+0x46>
  13900. 8026bf8: 2230 movs r2, #48 ; 0x30
  13901. 8026bfa: 1992 adds r2, r2, r6
  13902. 8026bfc: f804 2b01 strb.w r2, [r4], #1
  13903. ++n;
  13904. 8026c00: 3501 adds r5, #1
  13905. int n = 0;
  13906. unsigned long int d = 1;
  13907. char *bf = p->bf;
  13908. while (num / d >= p->base)
  13909. d *= p->base;
  13910. while (d != 0) {
  13911. 8026c02: 2b00 cmp r3, #0
  13912. 8026c04: d1e2 bne.n 8026bcc <uli2a+0x18>
  13913. if (n || dgt > 0 || d == 0) {
  13914. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  13915. ++n;
  13916. }
  13917. }
  13918. *bf = 0;
  13919. 8026c06: 7023 strb r3, [r4, #0]
  13920. 8026c08: bd70 pop {r4, r5, r6, pc}
  13921. 08026c0a <ui2a>:
  13922. uli2a(num, p);
  13923. }
  13924. #endif
  13925. static void ui2a(unsigned int num, struct param *p)
  13926. {
  13927. 8026c0a: b570 push {r4, r5, r6, lr}
  13928. int n = 0;
  13929. unsigned int d = 1;
  13930. char *bf = p->bf;
  13931. while (num / d >= p->base)
  13932. 8026c0c: 68ca ldr r2, [r1, #12]
  13933. static void ui2a(unsigned int num, struct param *p)
  13934. {
  13935. int n = 0;
  13936. unsigned int d = 1;
  13937. char *bf = p->bf;
  13938. 8026c0e: 690c ldr r4, [r1, #16]
  13939. #endif
  13940. static void ui2a(unsigned int num, struct param *p)
  13941. {
  13942. int n = 0;
  13943. unsigned int d = 1;
  13944. 8026c10: 2301 movs r3, #1
  13945. char *bf = p->bf;
  13946. while (num / d >= p->base)
  13947. 8026c12: e000 b.n 8026c16 <ui2a+0xc>
  13948. d *= p->base;
  13949. 8026c14: 4353 muls r3, r2
  13950. static void ui2a(unsigned int num, struct param *p)
  13951. {
  13952. int n = 0;
  13953. unsigned int d = 1;
  13954. char *bf = p->bf;
  13955. while (num / d >= p->base)
  13956. 8026c16: fbb0 f5f3 udiv r5, r0, r3
  13957. 8026c1a: 4295 cmp r5, r2
  13958. 8026c1c: d2fa bcs.n 8026c14 <ui2a+0xa>
  13959. 8026c1e: 2500 movs r5, #0
  13960. 8026c20: e01a b.n 8026c58 <ui2a+0x4e>
  13961. d *= p->base;
  13962. while (d != 0) {
  13963. int dgt = num / d;
  13964. num %= d;
  13965. d /= p->base;
  13966. 8026c22: 68ce ldr r6, [r1, #12]
  13967. unsigned int d = 1;
  13968. char *bf = p->bf;
  13969. while (num / d >= p->base)
  13970. d *= p->base;
  13971. while (d != 0) {
  13972. int dgt = num / d;
  13973. 8026c24: fbb0 f2f3 udiv r2, r0, r3
  13974. num %= d;
  13975. 8026c28: fb03 0012 mls r0, r3, r2, r0
  13976. d /= p->base;
  13977. 8026c2c: fbb3 f3f6 udiv r3, r3, r6
  13978. if (n || dgt > 0 || d == 0) {
  13979. 8026c30: b91d cbnz r5, 8026c3a <ui2a+0x30>
  13980. 8026c32: 2a00 cmp r2, #0
  13981. 8026c34: dc01 bgt.n 8026c3a <ui2a+0x30>
  13982. 8026c36: 2b00 cmp r3, #0
  13983. 8026c38: d1f3 bne.n 8026c22 <ui2a+0x18>
  13984. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  13985. 8026c3a: 2a09 cmp r2, #9
  13986. 8026c3c: b2d6 uxtb r6, r2
  13987. 8026c3e: dd06 ble.n 8026c4e <ui2a+0x44>
  13988. 8026c40: 780a ldrb r2, [r1, #0]
  13989. 8026c42: f012 0f04 tst.w r2, #4
  13990. 8026c46: bf0c ite eq
  13991. 8026c48: 2257 moveq r2, #87 ; 0x57
  13992. 8026c4a: 2237 movne r2, #55 ; 0x37
  13993. 8026c4c: e000 b.n 8026c50 <ui2a+0x46>
  13994. 8026c4e: 2230 movs r2, #48 ; 0x30
  13995. 8026c50: 1992 adds r2, r2, r6
  13996. 8026c52: f804 2b01 strb.w r2, [r4], #1
  13997. ++n;
  13998. 8026c56: 3501 adds r5, #1
  13999. int n = 0;
  14000. unsigned int d = 1;
  14001. char *bf = p->bf;
  14002. while (num / d >= p->base)
  14003. d *= p->base;
  14004. while (d != 0) {
  14005. 8026c58: 2b00 cmp r3, #0
  14006. 8026c5a: d1e2 bne.n 8026c22 <ui2a+0x18>
  14007. if (n || dgt > 0 || d == 0) {
  14008. *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
  14009. ++n;
  14010. }
  14011. }
  14012. *bf = 0;
  14013. 8026c5c: 7023 strb r3, [r4, #0]
  14014. 8026c5e: bd70 pop {r4, r5, r6, pc}
  14015. 08026c60 <putchw>:
  14016. }
  14017. static void putchw(void *putp, putcf putf, struct param *p)
  14018. {
  14019. 8026c60: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  14020. char ch;
  14021. int n = p->width;
  14022. char *bf = p->bf;
  14023. 8026c64: 6913 ldr r3, [r2, #16]
  14024. }
  14025. static void putchw(void *putp, putcf putf, struct param *p)
  14026. {
  14027. char ch;
  14028. int n = p->width;
  14029. 8026c66: 6854 ldr r4, [r2, #4]
  14030. }
  14031. static void putchw(void *putp, putcf putf, struct param *p)
  14032. {
  14033. 8026c68: 4606 mov r6, r0
  14034. 8026c6a: 460f mov r7, r1
  14035. 8026c6c: 4615 mov r5, r2
  14036. char ch;
  14037. int n = p->width;
  14038. char *bf = p->bf;
  14039. /* Number of filling characters */
  14040. while (*bf++ && n > 0)
  14041. 8026c6e: e000 b.n 8026c72 <putchw+0x12>
  14042. n--;
  14043. 8026c70: 3c01 subs r4, #1
  14044. char ch;
  14045. int n = p->width;
  14046. char *bf = p->bf;
  14047. /* Number of filling characters */
  14048. while (*bf++ && n > 0)
  14049. 8026c72: f813 2b01 ldrb.w r2, [r3], #1
  14050. 8026c76: b912 cbnz r2, 8026c7e <putchw+0x1e>
  14051. n--;
  14052. if (p->sign)
  14053. 8026c78: 7a2b ldrb r3, [r5, #8]
  14054. 8026c7a: b91b cbnz r3, 8026c84 <putchw+0x24>
  14055. 8026c7c: e003 b.n 8026c86 <putchw+0x26>
  14056. char ch;
  14057. int n = p->width;
  14058. char *bf = p->bf;
  14059. /* Number of filling characters */
  14060. while (*bf++ && n > 0)
  14061. 8026c7e: 2c00 cmp r4, #0
  14062. 8026c80: dcf6 bgt.n 8026c70 <putchw+0x10>
  14063. 8026c82: e7f9 b.n 8026c78 <putchw+0x18>
  14064. n--;
  14065. if (p->sign)
  14066. n--;
  14067. 8026c84: 3c01 subs r4, #1
  14068. if (p->alt && p->base == 16)
  14069. 8026c86: 782b ldrb r3, [r5, #0]
  14070. 8026c88: 0799 lsls r1, r3, #30
  14071. 8026c8a: d507 bpl.n 8026c9c <putchw+0x3c>
  14072. 8026c8c: 68eb ldr r3, [r5, #12]
  14073. 8026c8e: 2b10 cmp r3, #16
  14074. 8026c90: d101 bne.n 8026c96 <putchw+0x36>
  14075. n -= 2;
  14076. 8026c92: 3c02 subs r4, #2
  14077. 8026c94: e002 b.n 8026c9c <putchw+0x3c>
  14078. else if (p->alt && p->base == 8)
  14079. 8026c96: 2b08 cmp r3, #8
  14080. n--;
  14081. 8026c98: bf08 it eq
  14082. 8026c9a: 3c01 subeq r4, #1
  14083. /* Fill with space to align to the right, before alternate or sign */
  14084. if (!p->lz && !p->align_left) {
  14085. 8026c9c: 782b ldrb r3, [r5, #0]
  14086. 8026c9e: f013 0f09 tst.w r3, #9
  14087. 8026ca2: d10d bne.n 8026cc0 <putchw+0x60>
  14088. 8026ca4: 46a0 mov r8, r4
  14089. 8026ca6: e004 b.n 8026cb2 <putchw+0x52>
  14090. while (n-- > 0)
  14091. putf(putp, ' ');
  14092. 8026ca8: 4630 mov r0, r6
  14093. 8026caa: 2120 movs r1, #32
  14094. 8026cac: 47b8 blx r7
  14095. 8026cae: f108 38ff add.w r8, r8, #4294967295
  14096. else if (p->alt && p->base == 8)
  14097. n--;
  14098. /* Fill with space to align to the right, before alternate or sign */
  14099. if (!p->lz && !p->align_left) {
  14100. while (n-- > 0)
  14101. 8026cb2: f1b8 0f00 cmp.w r8, #0
  14102. 8026cb6: dcf7 bgt.n 8026ca8 <putchw+0x48>
  14103. return neg ? -fvalue : fvalue;
  14104. }
  14105. static void putchw(void *putp, putcf putf, struct param *p)
  14106. 8026cb8: 1e63 subs r3, r4, #1
  14107. 8026cba: ea24 74e4 bic.w r4, r4, r4, asr #31
  14108. 8026cbe: 1b1c subs r4, r3, r4
  14109. while (n-- > 0)
  14110. putf(putp, ' ');
  14111. }
  14112. /* print sign */
  14113. if (p->sign)
  14114. 8026cc0: 7a29 ldrb r1, [r5, #8]
  14115. 8026cc2: b109 cbz r1, 8026cc8 <putchw+0x68>
  14116. putf(putp, p->sign);
  14117. 8026cc4: 4630 mov r0, r6
  14118. 8026cc6: 47b8 blx r7
  14119. /* Alternate */
  14120. if (p->alt && p->base == 16) {
  14121. 8026cc8: 782b ldrb r3, [r5, #0]
  14122. 8026cca: 079a lsls r2, r3, #30
  14123. 8026ccc: d512 bpl.n 8026cf4 <putchw+0x94>
  14124. 8026cce: 68eb ldr r3, [r5, #12]
  14125. 8026cd0: 2b10 cmp r3, #16
  14126. 8026cd2: d10a bne.n 8026cea <putchw+0x8a>
  14127. putf(putp, '0');
  14128. 8026cd4: 2130 movs r1, #48 ; 0x30
  14129. 8026cd6: 4630 mov r0, r6
  14130. 8026cd8: 47b8 blx r7
  14131. putf(putp, (p->uc ? 'X' : 'x'));
  14132. 8026cda: 782b ldrb r3, [r5, #0]
  14133. 8026cdc: f013 0f04 tst.w r3, #4
  14134. 8026ce0: 4630 mov r0, r6
  14135. 8026ce2: bf0c ite eq
  14136. 8026ce4: 2178 moveq r1, #120 ; 0x78
  14137. 8026ce6: 2158 movne r1, #88 ; 0x58
  14138. 8026ce8: e003 b.n 8026cf2 <putchw+0x92>
  14139. } else if (p->alt && p->base == 8) {
  14140. 8026cea: 2b08 cmp r3, #8
  14141. 8026cec: d102 bne.n 8026cf4 <putchw+0x94>
  14142. putf(putp, '0');
  14143. 8026cee: 4630 mov r0, r6
  14144. 8026cf0: 2130 movs r1, #48 ; 0x30
  14145. 8026cf2: 47b8 blx r7
  14146. }
  14147. /* Fill with zeros, after alternate or sign */
  14148. if (p->lz) {
  14149. 8026cf4: 782b ldrb r3, [r5, #0]
  14150. 8026cf6: 07db lsls r3, r3, #31
  14151. 8026cf8: d50d bpl.n 8026d16 <putchw+0xb6>
  14152. 8026cfa: 46a0 mov r8, r4
  14153. 8026cfc: e004 b.n 8026d08 <putchw+0xa8>
  14154. while (n-- > 0)
  14155. putf(putp, '0');
  14156. 8026cfe: 4630 mov r0, r6
  14157. 8026d00: 2130 movs r1, #48 ; 0x30
  14158. 8026d02: 47b8 blx r7
  14159. 8026d04: f108 38ff add.w r8, r8, #4294967295
  14160. putf(putp, '0');
  14161. }
  14162. /* Fill with zeros, after alternate or sign */
  14163. if (p->lz) {
  14164. while (n-- > 0)
  14165. 8026d08: f1b8 0f00 cmp.w r8, #0
  14166. 8026d0c: dcf7 bgt.n 8026cfe <putchw+0x9e>
  14167. return neg ? -fvalue : fvalue;
  14168. }
  14169. static void putchw(void *putp, putcf putf, struct param *p)
  14170. 8026d0e: 1e63 subs r3, r4, #1
  14171. 8026d10: ea24 74e4 bic.w r4, r4, r4, asr #31
  14172. 8026d14: 1b1c subs r4, r3, r4
  14173. while (n-- > 0)
  14174. putf(putp, '0');
  14175. }
  14176. /* Put actual buffer */
  14177. bf = p->bf;
  14178. 8026d16: f8d5 8010 ldr.w r8, [r5, #16]
  14179. while ((ch = *bf++))
  14180. 8026d1a: e001 b.n 8026d20 <putchw+0xc0>
  14181. putf(putp, ch);
  14182. 8026d1c: 4630 mov r0, r6
  14183. 8026d1e: 47b8 blx r7
  14184. putf(putp, '0');
  14185. }
  14186. /* Put actual buffer */
  14187. bf = p->bf;
  14188. while ((ch = *bf++))
  14189. 8026d20: f818 1b01 ldrb.w r1, [r8], #1
  14190. 8026d24: 2900 cmp r1, #0
  14191. 8026d26: d1f9 bne.n 8026d1c <putchw+0xbc>
  14192. putf(putp, ch);
  14193. /* Fill with space to align to the left, after string */
  14194. if (!p->lz && p->align_left) {
  14195. 8026d28: 782b ldrb r3, [r5, #0]
  14196. 8026d2a: f003 0309 and.w r3, r3, #9
  14197. 8026d2e: 2b08 cmp r3, #8
  14198. 8026d30: d106 bne.n 8026d40 <putchw+0xe0>
  14199. 8026d32: e003 b.n 8026d3c <putchw+0xdc>
  14200. while (n-- > 0)
  14201. putf(putp, ' ');
  14202. 8026d34: 4630 mov r0, r6
  14203. 8026d36: 2120 movs r1, #32
  14204. 8026d38: 47b8 blx r7
  14205. 8026d3a: 3c01 subs r4, #1
  14206. while ((ch = *bf++))
  14207. putf(putp, ch);
  14208. /* Fill with space to align to the left, after string */
  14209. if (!p->lz && p->align_left) {
  14210. while (n-- > 0)
  14211. 8026d3c: 2c00 cmp r4, #0
  14212. 8026d3e: dcf9 bgt.n 8026d34 <putchw+0xd4>
  14213. 8026d40: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  14214. 08026d44 <_vsprintf_putcf>:
  14215. };
  14216. static void _vsprintf_putcf(void *p, char c)
  14217. {
  14218. struct _vsprintf_putcf_data *data = (struct _vsprintf_putcf_data*)p;
  14219. data->dest[data->num_chars++] = c;
  14220. 8026d44: e890 000c ldmia.w r0, {r2, r3}
  14221. 8026d48: 54d1 strb r1, [r2, r3]
  14222. 8026d4a: 3301 adds r3, #1
  14223. 8026d4c: 6043 str r3, [r0, #4]
  14224. 8026d4e: 4770 bx lr
  14225. 08026d50 <tfp_format>:
  14226. putf(putp, ' ');
  14227. }
  14228. }
  14229. void tfp_format(void *putp, putcf putf, const char *fmt, va_list va)
  14230. {
  14231. 8026d50: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  14232. 8026d54: b09b sub sp, #108 ; 0x6c
  14233. 8026d56: 4617 mov r7, r2
  14234. char bf[23]; /* long = 64b on some architectures */
  14235. #else
  14236. char bf[12]; /* int = 32b on some architectures */
  14237. #endif
  14238. char ch;
  14239. p.bf = bf;
  14240. 8026d58: aa04 add r2, sp, #16
  14241. putf(putp, ' ');
  14242. }
  14243. }
  14244. void tfp_format(void *putp, putcf putf, const char *fmt, va_list va)
  14245. {
  14246. 8026d5a: 4605 mov r5, r0
  14247. 8026d5c: 460e mov r6, r1
  14248. 8026d5e: 461c mov r4, r3
  14249. char bf[23]; /* long = 64b on some architectures */
  14250. #else
  14251. char bf[12]; /* int = 32b on some architectures */
  14252. #endif
  14253. char ch;
  14254. p.bf = bf;
  14255. 8026d60: 920e str r2, [sp, #56] ; 0x38
  14256. while ((ch = *(fmt++))) {
  14257. 8026d62: e208 b.n 8027176 <tfp_format+0x426>
  14258. if (ch != '%') {
  14259. 8026d64: 2925 cmp r1, #37 ; 0x25
  14260. 8026d66: d000 beq.n 8026d6a <tfp_format+0x1a>
  14261. 8026d68: e13a b.n 8026fe0 <tfp_format+0x290>
  14262. #endif
  14263. /* Init parameter struct */
  14264. p.lz = 0;
  14265. p.alt = 0;
  14266. p.width = 0;
  14267. p.align_left = 0;
  14268. 8026d6a: f89d 2028 ldrb.w r2, [sp, #40] ; 0x28
  14269. char lng = 0; /* 1 for long, 2 for long long */
  14270. #endif
  14271. /* Init parameter struct */
  14272. p.lz = 0;
  14273. p.alt = 0;
  14274. p.width = 0;
  14275. 8026d6e: 2300 movs r3, #0
  14276. p.align_left = 0;
  14277. 8026d70: f002 02fc and.w r2, r2, #252 ; 0xfc
  14278. 8026d74: f363 02c3 bfi r2, r3, #3, #1
  14279. 8026d78: f88d 2028 strb.w r2, [sp, #40] ; 0x28
  14280. p.sign = 0;
  14281. p.prec = 2;
  14282. 8026d7c: 2102 movs r1, #2
  14283. } else {
  14284. #ifdef PRINTF_LONG_SUPPORT
  14285. char lng = 0; /* 1 for long, 2 for long long */
  14286. #endif
  14287. /* Init parameter struct */
  14288. p.lz = 0;
  14289. 8026d7e: b2d2 uxtb r2, r2
  14290. 8026d80: f002 0c01 and.w ip, r2, #1
  14291. 8026d84: f3c2 0040 ubfx r0, r2, #1, #1
  14292. p.alt = 0;
  14293. p.width = 0;
  14294. 8026d88: 930b str r3, [sp, #44] ; 0x2c
  14295. p.align_left = 0;
  14296. p.sign = 0;
  14297. 8026d8a: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  14298. p.prec = 2;
  14299. 8026d8e: f88d 103c strb.w r1, [sp, #60] ; 0x3c
  14300. 8026d92: f3c2 02c0 ubfx r2, r2, #3, #1
  14301. /* Flags */
  14302. while ((ch = *(fmt++))) {
  14303. 8026d96: e012 b.n 8026dbe <tfp_format+0x6e>
  14304. switch (ch) {
  14305. 8026d98: 292d cmp r1, #45 ; 0x2d
  14306. 8026d9a: d00f beq.n 8026dbc <tfp_format+0x6c>
  14307. 8026d9c: d804 bhi.n 8026da8 <tfp_format+0x58>
  14308. 8026d9e: 2923 cmp r1, #35 ; 0x23
  14309. 8026da0: d008 beq.n 8026db4 <tfp_format+0x64>
  14310. 8026da2: 292b cmp r1, #43 ; 0x2b
  14311. 8026da4: d10f bne.n 8026dc6 <tfp_format+0x76>
  14312. 8026da6: e007 b.n 8026db8 <tfp_format+0x68>
  14313. 8026da8: 2930 cmp r1, #48 ; 0x30
  14314. 8026daa: d000 beq.n 8026dae <tfp_format+0x5e>
  14315. 8026dac: e00b b.n 8026dc6 <tfp_format+0x76>
  14316. case '-':
  14317. p.align_left = 1;
  14318. continue;
  14319. case '0':
  14320. p.lz = 1;
  14321. 8026dae: f04f 0c01 mov.w ip, #1
  14322. continue;
  14323. 8026db2: e004 b.n 8026dbe <tfp_format+0x6e>
  14324. case '#':
  14325. p.alt = 1;
  14326. 8026db4: 2001 movs r0, #1
  14327. continue;
  14328. 8026db6: e002 b.n 8026dbe <tfp_format+0x6e>
  14329. case '+':
  14330. p.sign = 1;
  14331. 8026db8: 2301 movs r3, #1
  14332. continue;
  14333. 8026dba: e000 b.n 8026dbe <tfp_format+0x6e>
  14334. /* Flags */
  14335. while ((ch = *(fmt++))) {
  14336. switch (ch) {
  14337. case '-':
  14338. p.align_left = 1;
  14339. 8026dbc: 2201 movs r2, #1
  14340. p.align_left = 0;
  14341. p.sign = 0;
  14342. p.prec = 2;
  14343. /* Flags */
  14344. while ((ch = *(fmt++))) {
  14345. 8026dbe: f817 1b01 ldrb.w r1, [r7], #1
  14346. 8026dc2: 2900 cmp r1, #0
  14347. 8026dc4: d1e8 bne.n 8026d98 <tfp_format+0x48>
  14348. 8026dc6: f89d 8028 ldrb.w r8, [sp, #40] ; 0x28
  14349. 8026dca: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  14350. 8026dce: f36c 0800 bfi r8, ip, #0, #1
  14351. 8026dd2: 46c4 mov ip, r8
  14352. 8026dd4: f360 0c41 bfi ip, r0, #1, #1
  14353. 8026dd8: 4660 mov r0, ip
  14354. }
  14355. break;
  14356. }
  14357. /* Width */
  14358. if (ch >= '0' && ch <= '9') {
  14359. 8026dda: f1a1 0330 sub.w r3, r1, #48 ; 0x30
  14360. 8026dde: f362 00c3 bfi r0, r2, #3, #1
  14361. 8026de2: 2b09 cmp r3, #9
  14362. 8026de4: f88d 0028 strb.w r0, [sp, #40] ; 0x28
  14363. 8026de8: d81d bhi.n 8026e26 <tfp_format+0xd6>
  14364. 8026dea: e004 b.n 8026df6 <tfp_format+0xa6>
  14365. unsigned int num = 0;
  14366. int digit;
  14367. while ((digit = a2d(ch)) >= 0) {
  14368. if (digit > base)
  14369. break;
  14370. num = num * base + digit;
  14371. 8026dec: fb00 3202 mla r2, r0, r2, r3
  14372. ch = *p++;
  14373. 8026df0: f817 1b01 ldrb.w r1, [r7], #1
  14374. 8026df4: e001 b.n 8026dfa <tfp_format+0xaa>
  14375. }
  14376. break;
  14377. }
  14378. /* Width */
  14379. if (ch >= '0' && ch <= '9') {
  14380. 8026df6: 2200 movs r2, #0
  14381. unsigned int num = 0;
  14382. int digit;
  14383. while ((digit = a2d(ch)) >= 0) {
  14384. if (digit > base)
  14385. break;
  14386. num = num * base + digit;
  14387. 8026df8: 200a movs r0, #10
  14388. ui2a(num, p);
  14389. }
  14390. static int a2d(char ch)
  14391. {
  14392. if (ch >= '0' && ch <= '9')
  14393. 8026dfa: f1a1 0330 sub.w r3, r1, #48 ; 0x30
  14394. 8026dfe: fa5f fc83 uxtb.w ip, r3
  14395. 8026e02: f1bc 0f09 cmp.w ip, #9
  14396. 8026e06: d9f1 bls.n 8026dec <tfp_format+0x9c>
  14397. return ch - '0';
  14398. else if (ch >= 'a' && ch <= 'f')
  14399. 8026e08: f1a1 0361 sub.w r3, r1, #97 ; 0x61
  14400. 8026e0c: 2b05 cmp r3, #5
  14401. 8026e0e: d802 bhi.n 8026e16 <tfp_format+0xc6>
  14402. return ch - 'a' + 10;
  14403. 8026e10: f1a1 0357 sub.w r3, r1, #87 ; 0x57
  14404. 8026e14: e1b5 b.n 8027182 <tfp_format+0x432>
  14405. else if (ch >= 'A' && ch <= 'F')
  14406. 8026e16: f1a1 0341 sub.w r3, r1, #65 ; 0x41
  14407. 8026e1a: 2b05 cmp r3, #5
  14408. 8026e1c: d802 bhi.n 8026e24 <tfp_format+0xd4>
  14409. return ch - 'A' + 10;
  14410. 8026e1e: f1a1 0337 sub.w r3, r1, #55 ; 0x37
  14411. 8026e22: e1ae b.n 8027182 <tfp_format+0x432>
  14412. break;
  14413. num = num * base + digit;
  14414. ch = *p++;
  14415. }
  14416. *src = p;
  14417. *nump = num;
  14418. 8026e24: 920b str r2, [sp, #44] ; 0x2c
  14419. }
  14420. /* We accept 'x.y' format but don't support it completely:
  14421. * we ignore the 'y' digit => this ignores 0-fill
  14422. * size and makes it == width (ie. 'x') */
  14423. if (ch == '.') {
  14424. 8026e26: 292e cmp r1, #46 ; 0x2e
  14425. 8026e28: d10e bne.n 8026e48 <tfp_format+0xf8>
  14426. //p.lz = 1; /* zero-padding */
  14427. /* ignore actual 0-fill size: */
  14428. ch = *(fmt++);
  14429. if (ch >= '0' && ch <= '9')
  14430. 8026e2a: 783a ldrb r2, [r7, #0]
  14431. 8026e2c: 3a30 subs r2, #48 ; 0x30
  14432. 8026e2e: b2d2 uxtb r2, r2
  14433. * we ignore the 'y' digit => this ignores 0-fill
  14434. * size and makes it == width (ie. 'x') */
  14435. if (ch == '.') {
  14436. //p.lz = 1; /* zero-padding */
  14437. /* ignore actual 0-fill size: */
  14438. ch = *(fmt++);
  14439. 8026e30: 1c7b adds r3, r7, #1
  14440. if (ch >= '0' && ch <= '9')
  14441. 8026e32: 2a09 cmp r2, #9
  14442. p.prec = ch - '0';
  14443. 8026e34: bf98 it ls
  14444. 8026e36: f88d 203c strbls.w r2, [sp, #60] ; 0x3c
  14445. do
  14446. {
  14447. ch = *(fmt++);
  14448. 8026e3a: f813 1b01 ldrb.w r1, [r3], #1
  14449. } while (ch >= '0' && ch <= '9');
  14450. 8026e3e: f1a1 0230 sub.w r2, r1, #48 ; 0x30
  14451. 8026e42: 2a09 cmp r2, #9
  14452. ch = *(fmt++);
  14453. if (ch >= '0' && ch <= '9')
  14454. p.prec = ch - '0';
  14455. do
  14456. {
  14457. ch = *(fmt++);
  14458. 8026e44: 461f mov r7, r3
  14459. } while (ch >= '0' && ch <= '9');
  14460. 8026e46: d9f8 bls.n 8026e3a <tfp_format+0xea>
  14461. }
  14462. #ifdef PRINTF_SIZE_T_SUPPORT
  14463. # ifdef PRINTF_LONG_SUPPORT
  14464. if (ch == 'z') {
  14465. 8026e48: 297a cmp r1, #122 ; 0x7a
  14466. 8026e4a: d102 bne.n 8026e52 <tfp_format+0x102>
  14467. ch = *(fmt++);
  14468. 8026e4c: f817 1b01 ldrb.w r1, [r7], #1
  14469. 8026e50: e005 b.n 8026e5e <tfp_format+0x10e>
  14470. } else
  14471. # endif
  14472. #endif
  14473. #ifdef PRINTF_LONG_SUPPORT
  14474. if (ch == 'l') {
  14475. 8026e52: 296c cmp r1, #108 ; 0x6c
  14476. 8026e54: d109 bne.n 8026e6a <tfp_format+0x11a>
  14477. ch = *(fmt++);
  14478. 8026e56: 7839 ldrb r1, [r7, #0]
  14479. lng = 1;
  14480. #ifdef PRINTF_LONG_LONG_SUPPORT
  14481. if (ch == 'l') {
  14482. 8026e58: 296c cmp r1, #108 ; 0x6c
  14483. 8026e5a: d002 beq.n 8026e62 <tfp_format+0x112>
  14484. # endif
  14485. #endif
  14486. #ifdef PRINTF_LONG_SUPPORT
  14487. if (ch == 'l') {
  14488. ch = *(fmt++);
  14489. 8026e5c: 3701 adds r7, #1
  14490. lng = 1;
  14491. 8026e5e: 2301 movs r3, #1
  14492. 8026e60: e004 b.n 8026e6c <tfp_format+0x11c>
  14493. #ifdef PRINTF_LONG_LONG_SUPPORT
  14494. if (ch == 'l') {
  14495. ch = *(fmt++);
  14496. 8026e62: 7879 ldrb r1, [r7, #1]
  14497. lng = 2;
  14498. 8026e64: 2302 movs r3, #2
  14499. if (ch == 'l') {
  14500. ch = *(fmt++);
  14501. lng = 1;
  14502. #ifdef PRINTF_LONG_LONG_SUPPORT
  14503. if (ch == 'l') {
  14504. ch = *(fmt++);
  14505. 8026e66: 3702 adds r7, #2
  14506. 8026e68: e000 b.n 8026e6c <tfp_format+0x11c>
  14507. while ((ch = *(fmt++))) {
  14508. if (ch != '%') {
  14509. putf(putp, ch);
  14510. } else {
  14511. #ifdef PRINTF_LONG_SUPPORT
  14512. char lng = 0; /* 1 for long, 2 for long long */
  14513. 8026e6a: 2300 movs r3, #0
  14514. lng = 2;
  14515. }
  14516. #endif
  14517. }
  14518. #endif
  14519. switch (ch) {
  14520. 8026e6c: 2969 cmp r1, #105 ; 0x69
  14521. 8026e6e: d036 beq.n 8026ede <tfp_format+0x18e>
  14522. 8026e70: d816 bhi.n 8026ea0 <tfp_format+0x150>
  14523. 8026e72: 2963 cmp r1, #99 ; 0x63
  14524. 8026e74: f000 80a1 beq.w 8026fba <tfp_format+0x26a>
  14525. 8026e78: d80c bhi.n 8026e94 <tfp_format+0x144>
  14526. 8026e7a: 2946 cmp r1, #70 ; 0x46
  14527. 8026e7c: f000 80b3 beq.w 8026fe6 <tfp_format+0x296>
  14528. 8026e80: d806 bhi.n 8026e90 <tfp_format+0x140>
  14529. 8026e82: 2900 cmp r1, #0
  14530. 8026e84: f000 8181 beq.w 802718a <tfp_format+0x43a>
  14531. 8026e88: 2925 cmp r1, #37 ; 0x25
  14532. 8026e8a: f040 8174 bne.w 8027176 <tfp_format+0x426>
  14533. 8026e8e: e0a7 b.n 8026fe0 <tfp_format+0x290>
  14534. 8026e90: 2958 cmp r1, #88 ; 0x58
  14535. 8026e92: e012 b.n 8026eba <tfp_format+0x16a>
  14536. 8026e94: 2964 cmp r1, #100 ; 0x64
  14537. 8026e96: d022 beq.n 8026ede <tfp_format+0x18e>
  14538. 8026e98: 2966 cmp r1, #102 ; 0x66
  14539. 8026e9a: f040 816c bne.w 8027176 <tfp_format+0x426>
  14540. 8026e9e: e0a2 b.n 8026fe6 <tfp_format+0x296>
  14541. 8026ea0: 2973 cmp r1, #115 ; 0x73
  14542. 8026ea2: f000 8090 beq.w 8026fc6 <tfp_format+0x276>
  14543. 8026ea6: d805 bhi.n 8026eb4 <tfp_format+0x164>
  14544. 8026ea8: 296f cmp r1, #111 ; 0x6f
  14545. 8026eaa: d078 beq.n 8026f9e <tfp_format+0x24e>
  14546. 8026eac: 2970 cmp r1, #112 ; 0x70
  14547. 8026eae: f040 8162 bne.w 8027176 <tfp_format+0x426>
  14548. 8026eb2: e040 b.n 8026f36 <tfp_format+0x1e6>
  14549. 8026eb4: 2975 cmp r1, #117 ; 0x75
  14550. 8026eb6: d003 beq.n 8026ec0 <tfp_format+0x170>
  14551. 8026eb8: 2978 cmp r1, #120 ; 0x78
  14552. 8026eba: f040 815c bne.w 8027176 <tfp_format+0x426>
  14553. 8026ebe: e041 b.n 8026f44 <tfp_format+0x1f4>
  14554. case 0:
  14555. goto abort;
  14556. case 'u':
  14557. p.base = 10;
  14558. 8026ec0: 220a movs r2, #10
  14559. #ifdef PRINTF_LONG_SUPPORT
  14560. #ifdef PRINTF_LONG_LONG_SUPPORT
  14561. if (2 == lng)
  14562. 8026ec2: 2b02 cmp r3, #2
  14563. #endif
  14564. switch (ch) {
  14565. case 0:
  14566. goto abort;
  14567. case 'u':
  14568. p.base = 10;
  14569. 8026ec4: 920d str r2, [sp, #52] ; 0x34
  14570. #ifdef PRINTF_LONG_SUPPORT
  14571. #ifdef PRINTF_LONG_LONG_SUPPORT
  14572. if (2 == lng)
  14573. 8026ec6: d107 bne.n 8026ed8 <tfp_format+0x188>
  14574. ulli2a(va_arg(va, unsigned long long int), &p);
  14575. 8026ec8: 3407 adds r4, #7
  14576. 8026eca: f024 0307 bic.w r3, r4, #7
  14577. 8026ece: f103 0408 add.w r4, r3, #8
  14578. 8026ed2: e9d3 0100 ldrd r0, r1, [r3]
  14579. 8026ed6: e017 b.n 8026f08 <tfp_format+0x1b8>
  14580. else
  14581. #endif
  14582. if (1 == lng)
  14583. uli2a(va_arg(va, unsigned long int), &p);
  14584. 8026ed8: 6820 ldr r0, [r4, #0]
  14585. 8026eda: a90a add r1, sp, #40 ; 0x28
  14586. 8026edc: e04f b.n 8026f7e <tfp_format+0x22e>
  14587. ui2a(va_arg(va, unsigned int), &p);
  14588. putchw(putp, putf, &p);
  14589. break;
  14590. case 'd':
  14591. case 'i':
  14592. p.base = 10;
  14593. 8026ede: 220a movs r2, #10
  14594. #ifdef PRINTF_LONG_SUPPORT
  14595. #ifdef PRINTF_LONG_LONG_SUPPORT
  14596. if (2 == lng)
  14597. 8026ee0: 2b02 cmp r3, #2
  14598. ui2a(va_arg(va, unsigned int), &p);
  14599. putchw(putp, putf, &p);
  14600. break;
  14601. case 'd':
  14602. case 'i':
  14603. p.base = 10;
  14604. 8026ee2: 920d str r2, [sp, #52] ; 0x34
  14605. #ifdef PRINTF_LONG_SUPPORT
  14606. #ifdef PRINTF_LONG_LONG_SUPPORT
  14607. if (2 == lng)
  14608. 8026ee4: d112 bne.n 8026f0c <tfp_format+0x1bc>
  14609. lli2a(va_arg(va, long long int), &p);
  14610. 8026ee6: 3407 adds r4, #7
  14611. 8026ee8: f024 0307 bic.w r3, r4, #7
  14612. 8026eec: e9d3 0100 ldrd r0, r1, [r3]
  14613. 8026ef0: f103 0408 add.w r4, r3, #8
  14614. *bf = 0;
  14615. }
  14616. static void lli2a(long long int num, struct param *p)
  14617. {
  14618. if (num < 0) {
  14619. 8026ef4: 2800 cmp r0, #0
  14620. 8026ef6: f171 0300 sbcs.w r3, r1, #0
  14621. 8026efa: da05 bge.n 8026f08 <tfp_format+0x1b8>
  14622. num = -num;
  14623. p->sign = '-';
  14624. 8026efc: 232d movs r3, #45 ; 0x2d
  14625. }
  14626. static void lli2a(long long int num, struct param *p)
  14627. {
  14628. if (num < 0) {
  14629. num = -num;
  14630. 8026efe: 4240 negs r0, r0
  14631. 8026f00: eb61 0141 sbc.w r1, r1, r1, lsl #1
  14632. p->sign = '-';
  14633. 8026f04: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  14634. }
  14635. ulli2a(num, p);
  14636. 8026f08: aa0a add r2, sp, #40 ; 0x28
  14637. 8026f0a: e033 b.n 8026f74 <tfp_format+0x224>
  14638. #ifdef PRINTF_LONG_LONG_SUPPORT
  14639. if (2 == lng)
  14640. lli2a(va_arg(va, long long int), &p);
  14641. else
  14642. #endif
  14643. if (1 == lng)
  14644. 8026f0c: 2b01 cmp r3, #1
  14645. li2a(va_arg(va, long int), &p);
  14646. 8026f0e: 6820 ldr r0, [r4, #0]
  14647. 8026f10: f104 0804 add.w r8, r4, #4
  14648. #ifdef PRINTF_LONG_LONG_SUPPORT
  14649. if (2 == lng)
  14650. lli2a(va_arg(va, long long int), &p);
  14651. else
  14652. #endif
  14653. if (1 == lng)
  14654. 8026f14: d107 bne.n 8026f26 <tfp_format+0x1d6>
  14655. *bf = 0;
  14656. }
  14657. static void li2a(long num, struct param *p)
  14658. {
  14659. if (num < 0) {
  14660. 8026f16: 2800 cmp r0, #0
  14661. 8026f18: da03 bge.n 8026f22 <tfp_format+0x1d2>
  14662. num = -num;
  14663. p->sign = '-';
  14664. 8026f1a: 232d movs r3, #45 ; 0x2d
  14665. }
  14666. static void li2a(long num, struct param *p)
  14667. {
  14668. if (num < 0) {
  14669. num = -num;
  14670. 8026f1c: 4240 negs r0, r0
  14671. p->sign = '-';
  14672. 8026f1e: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  14673. }
  14674. uli2a(num, p);
  14675. 8026f22: a90a add r1, sp, #40 ; 0x28
  14676. 8026f24: e02f b.n 8026f86 <tfp_format+0x236>
  14677. *bf = 0;
  14678. }
  14679. static void i2a(int num, struct param *p)
  14680. {
  14681. if (num < 0) {
  14682. 8026f26: 2800 cmp r0, #0
  14683. 8026f28: da03 bge.n 8026f32 <tfp_format+0x1e2>
  14684. num = -num;
  14685. p->sign = '-';
  14686. 8026f2a: 232d movs r3, #45 ; 0x2d
  14687. }
  14688. static void i2a(int num, struct param *p)
  14689. {
  14690. if (num < 0) {
  14691. num = -num;
  14692. 8026f2c: 4240 negs r0, r0
  14693. p->sign = '-';
  14694. 8026f2e: f88d 3030 strb.w r3, [sp, #48] ; 0x30
  14695. }
  14696. ui2a(num, p);
  14697. 8026f32: a90a add r1, sp, #40 ; 0x28
  14698. 8026f34: e02a b.n 8026f8c <tfp_format+0x23c>
  14699. i2a(va_arg(va, int), &p);
  14700. putchw(putp, putf, &p);
  14701. break;
  14702. #ifdef SIZEOF_POINTER
  14703. case 'p':
  14704. p.alt = 1;
  14705. 8026f36: f89d 3028 ldrb.w r3, [sp, #40] ; 0x28
  14706. 8026f3a: f043 0302 orr.w r3, r3, #2
  14707. 8026f3e: f88d 3028 strb.w r3, [sp, #40] ; 0x28
  14708. # if defined(SIZEOF_INT) && SIZEOF_POINTER <= SIZEOF_INT
  14709. lng = 0;
  14710. 8026f42: 2300 movs r3, #0
  14711. lng = 2;
  14712. # endif
  14713. #endif
  14714. case 'x':
  14715. case 'X':
  14716. p.base = 16;
  14717. 8026f44: 2210 movs r2, #16
  14718. p.uc = (ch == 'X')?1:0;
  14719. 8026f46: f1b1 0e58 subs.w lr, r1, #88 ; 0x58
  14720. 8026f4a: f1de 0100 rsbs r1, lr, #0
  14721. 8026f4e: f89d 0028 ldrb.w r0, [sp, #40] ; 0x28
  14722. lng = 2;
  14723. # endif
  14724. #endif
  14725. case 'x':
  14726. case 'X':
  14727. p.base = 16;
  14728. 8026f52: 920d str r2, [sp, #52] ; 0x34
  14729. p.uc = (ch == 'X')?1:0;
  14730. 8026f54: eb51 010e adcs.w r1, r1, lr
  14731. 8026f58: aa1a add r2, sp, #104 ; 0x68
  14732. 8026f5a: f361 0082 bfi r0, r1, #2, #1
  14733. #ifdef PRINTF_LONG_SUPPORT
  14734. #ifdef PRINTF_LONG_LONG_SUPPORT
  14735. if (2 == lng)
  14736. 8026f5e: 2b02 cmp r3, #2
  14737. # endif
  14738. #endif
  14739. case 'x':
  14740. case 'X':
  14741. p.base = 16;
  14742. p.uc = (ch == 'X')?1:0;
  14743. 8026f60: f802 0d40 strb.w r0, [r2, #-64]!
  14744. #ifdef PRINTF_LONG_SUPPORT
  14745. #ifdef PRINTF_LONG_LONG_SUPPORT
  14746. if (2 == lng)
  14747. 8026f64: d109 bne.n 8026f7a <tfp_format+0x22a>
  14748. ulli2a(va_arg(va, unsigned long long int), &p);
  14749. 8026f66: 3407 adds r4, #7
  14750. 8026f68: f024 0307 bic.w r3, r4, #7
  14751. 8026f6c: e9d3 0100 ldrd r0, r1, [r3]
  14752. 8026f70: f103 0408 add.w r4, r3, #8
  14753. 8026f74: f7ff fdc8 bl 8026b08 <ulli2a>
  14754. 8026f78: e00b b.n 8026f92 <tfp_format+0x242>
  14755. else
  14756. #endif
  14757. if (1 == lng)
  14758. uli2a(va_arg(va, unsigned long int), &p);
  14759. 8026f7a: 6820 ldr r0, [r4, #0]
  14760. 8026f7c: 4611 mov r1, r2
  14761. #ifdef PRINTF_LONG_LONG_SUPPORT
  14762. if (2 == lng)
  14763. ulli2a(va_arg(va, unsigned long long int), &p);
  14764. else
  14765. #endif
  14766. if (1 == lng)
  14767. 8026f7e: 2b01 cmp r3, #1
  14768. 8026f80: f104 0804 add.w r8, r4, #4
  14769. 8026f84: d102 bne.n 8026f8c <tfp_format+0x23c>
  14770. uli2a(va_arg(va, unsigned long int), &p);
  14771. 8026f86: f7ff fe15 bl 8026bb4 <uli2a>
  14772. 8026f8a: e001 b.n 8026f90 <tfp_format+0x240>
  14773. else
  14774. #endif
  14775. ui2a(va_arg(va, unsigned int), &p);
  14776. 8026f8c: f7ff fe3d bl 8026c0a <ui2a>
  14777. 8026f90: 4644 mov r4, r8
  14778. putchw(putp, putf, &p);
  14779. 8026f92: 4628 mov r0, r5
  14780. 8026f94: 4631 mov r1, r6
  14781. 8026f96: aa0a add r2, sp, #40 ; 0x28
  14782. 8026f98: f7ff fe62 bl 8026c60 <putchw>
  14783. break;
  14784. 8026f9c: e0eb b.n 8027176 <tfp_format+0x426>
  14785. case 'o':
  14786. p.base = 8;
  14787. 8026f9e: 2308 movs r3, #8
  14788. ui2a(va_arg(va, unsigned int), &p);
  14789. 8026fa0: 6820 ldr r0, [r4, #0]
  14790. #endif
  14791. ui2a(va_arg(va, unsigned int), &p);
  14792. putchw(putp, putf, &p);
  14793. break;
  14794. case 'o':
  14795. p.base = 8;
  14796. 8026fa2: 930d str r3, [sp, #52] ; 0x34
  14797. ui2a(va_arg(va, unsigned int), &p);
  14798. 8026fa4: a90a add r1, sp, #40 ; 0x28
  14799. 8026fa6: f7ff fe30 bl 8026c0a <ui2a>
  14800. putchw(putp, putf, &p);
  14801. 8026faa: 4628 mov r0, r5
  14802. 8026fac: 4631 mov r1, r6
  14803. 8026fae: aa0a add r2, sp, #40 ; 0x28
  14804. ui2a(va_arg(va, unsigned int), &p);
  14805. putchw(putp, putf, &p);
  14806. break;
  14807. case 'o':
  14808. p.base = 8;
  14809. ui2a(va_arg(va, unsigned int), &p);
  14810. 8026fb0: f104 0804 add.w r8, r4, #4
  14811. putchw(putp, putf, &p);
  14812. 8026fb4: f7ff fe54 bl 8026c60 <putchw>
  14813. 8026fb8: e010 b.n 8026fdc <tfp_format+0x28c>
  14814. break;
  14815. case 'c':
  14816. putf(putp, (char)(va_arg(va, int)));
  14817. 8026fba: 4628 mov r0, r5
  14818. 8026fbc: 7821 ldrb r1, [r4, #0]
  14819. 8026fbe: f104 0804 add.w r8, r4, #4
  14820. 8026fc2: 47b0 blx r6
  14821. 8026fc4: e00a b.n 8026fdc <tfp_format+0x28c>
  14822. break;
  14823. case 's':
  14824. p.bf = va_arg(va, char *);
  14825. 8026fc6: 6823 ldr r3, [r4, #0]
  14826. putchw(putp, putf, &p);
  14827. 8026fc8: aa0a add r2, sp, #40 ; 0x28
  14828. 8026fca: 4628 mov r0, r5
  14829. 8026fcc: 4631 mov r1, r6
  14830. break;
  14831. case 'c':
  14832. putf(putp, (char)(va_arg(va, int)));
  14833. break;
  14834. case 's':
  14835. p.bf = va_arg(va, char *);
  14836. 8026fce: 930e str r3, [sp, #56] ; 0x38
  14837. putchw(putp, putf, &p);
  14838. 8026fd0: f7ff fe46 bl 8026c60 <putchw>
  14839. p.bf = bf;
  14840. 8026fd4: aa04 add r2, sp, #16
  14841. break;
  14842. case 'c':
  14843. putf(putp, (char)(va_arg(va, int)));
  14844. break;
  14845. case 's':
  14846. p.bf = va_arg(va, char *);
  14847. 8026fd6: f104 0804 add.w r8, r4, #4
  14848. putchw(putp, putf, &p);
  14849. p.bf = bf;
  14850. 8026fda: 920e str r2, [sp, #56] ; 0x38
  14851. break;
  14852. case 'c':
  14853. putf(putp, (char)(va_arg(va, int)));
  14854. break;
  14855. case 's':
  14856. p.bf = va_arg(va, char *);
  14857. 8026fdc: 4644 mov r4, r8
  14858. putchw(putp, putf, &p);
  14859. p.bf = bf;
  14860. break;
  14861. 8026fde: e0ca b.n 8027176 <tfp_format+0x426>
  14862. case '%':
  14863. putf(putp, ch);
  14864. 8026fe0: 4628 mov r0, r5
  14865. 8026fe2: 47b0 blx r6
  14866. break;
  14867. 8026fe4: e0c7 b.n 8027176 <tfp_format+0x426>
  14868. case 'f':
  14869. case 'F':
  14870. fval = va_arg(va, double);
  14871. 8026fe6: 3407 adds r4, #7
  14872. 8026fe8: f024 0307 bic.w r3, r4, #7
  14873. 8026fec: f103 0408 add.w r4, r3, #8
  14874. 8026ff0: e893 0404 ldmia.w r3, {r2, sl}
  14875. 8026ff4: 9200 str r2, [sp, #0]
  14876. sign = 0;
  14877. if (fval < 0)
  14878. 8026ff6: 4610 mov r0, r2
  14879. 8026ff8: 4651 mov r1, sl
  14880. 8026ffa: 2200 movs r2, #0
  14881. 8026ffc: 2300 movs r3, #0
  14882. 8026ffe: f7f9 fd51 bl 8020aa4 <__aeabi_dcmplt>
  14883. 8027002: b138 cbz r0, 8027014 <tfp_format+0x2c4>
  14884. {
  14885. sign = 1;
  14886. p.width--;
  14887. 8027004: 9b0b ldr r3, [sp, #44] ; 0x2c
  14888. 8027006: 3b01 subs r3, #1
  14889. 8027008: 930b str r3, [sp, #44] ; 0x2c
  14890. fval = - fval;
  14891. 802700a: f10a 4a00 add.w sl, sl, #2147483648 ; 0x80000000
  14892. case 'F':
  14893. fval = va_arg(va, double);
  14894. sign = 0;
  14895. if (fval < 0)
  14896. {
  14897. sign = 1;
  14898. 802700e: f04f 0b01 mov.w fp, #1
  14899. 8027012: e009 b.n 8027028 <tfp_format+0x2d8>
  14900. p.width--;
  14901. fval = - fval;
  14902. }
  14903. else if (p.sign) {
  14904. 8027014: f89d 3030 ldrb.w r3, [sp, #48] ; 0x30
  14905. 8027018: b12b cbz r3, 8027026 <tfp_format+0x2d6>
  14906. sign = 2;
  14907. p.width--;
  14908. 802701a: 9b0b ldr r3, [sp, #44] ; 0x2c
  14909. 802701c: 3b01 subs r3, #1
  14910. 802701e: 930b str r3, [sp, #44] ; 0x2c
  14911. sign = 1;
  14912. p.width--;
  14913. fval = - fval;
  14914. }
  14915. else if (p.sign) {
  14916. sign = 2;
  14917. 8027020: f04f 0b02 mov.w fp, #2
  14918. 8027024: e000 b.n 8027028 <tfp_format+0x2d8>
  14919. putf(putp, ch);
  14920. break;
  14921. case 'f':
  14922. case 'F':
  14923. fval = va_arg(va, double);
  14924. sign = 0;
  14925. 8027026: 469b mov fp, r3
  14926. else if (p.sign) {
  14927. sign = 2;
  14928. p.width--;
  14929. }
  14930. fpart = (int)fval;
  14931. 8027028: 4651 mov r1, sl
  14932. 802702a: 9800 ldr r0, [sp, #0]
  14933. 802702c: f7f9 fd62 bl 8020af4 <__aeabi_d2iz>
  14934. fiter = 0;
  14935. 8027030: 2200 movs r2, #0
  14936. else if (p.sign) {
  14937. sign = 2;
  14938. p.width--;
  14939. }
  14940. fpart = (int)fval;
  14941. 8027032: 9001 str r0, [sp, #4]
  14942. 8027034: 4680 mov r8, r0
  14943. fiter = 0;
  14944. while (fpart != 0)
  14945. {
  14946. temp_buffer[fiter++] = fpart % 10;
  14947. 8027036: 210a movs r1, #10
  14948. }
  14949. fpart = (int)fval;
  14950. fiter = 0;
  14951. while (fpart != 0)
  14952. 8027038: e008 b.n 802704c <tfp_format+0x2fc>
  14953. {
  14954. temp_buffer[fiter++] = fpart % 10;
  14955. 802703a: fb98 f0f1 sdiv r0, r8, r1
  14956. 802703e: ab10 add r3, sp, #64 ; 0x40
  14957. 8027040: fb01 8810 mls r8, r1, r0, r8
  14958. 8027044: f843 8022 str.w r8, [r3, r2, lsl #2]
  14959. 8027048: 3201 adds r2, #1
  14960. fpart = fpart / 10;
  14961. 802704a: 4680 mov r8, r0
  14962. }
  14963. fpart = (int)fval;
  14964. fiter = 0;
  14965. while (fpart != 0)
  14966. 802704c: f1b8 0f00 cmp.w r8, #0
  14967. 8027050: d1f3 bne.n 802703a <tfp_format+0x2ea>
  14968. temp_buffer[fiter++] = fpart % 10;
  14969. fpart = fpart / 10;
  14970. }
  14971. fiter--;
  14972. if (fiter == -1)
  14973. 8027052: f102 39ff add.w r9, r2, #4294967295
  14974. 8027056: b912 cbnz r2, 802705e <tfp_format+0x30e>
  14975. p.width--;
  14976. 8027058: 9a0b ldr r2, [sp, #44] ; 0x2c
  14977. 802705a: 3a01 subs r2, #1
  14978. 802705c: 920b str r2, [sp, #44] ; 0x2c
  14979. /* Leading zeros */
  14980. if (p.lz) {
  14981. 802705e: f89d 2028 ldrb.w r2, [sp, #40] ; 0x28
  14982. 8027062: 07d0 lsls r0, r2, #31
  14983. 8027064: d51b bpl.n 802709e <tfp_format+0x34e>
  14984. if (sign == 1)
  14985. 8027066: f1bb 0f01 cmp.w fp, #1
  14986. 802706a: d102 bne.n 8027072 <tfp_format+0x322>
  14987. putf(putp, '-');
  14988. 802706c: 4628 mov r0, r5
  14989. 802706e: 212d movs r1, #45 ; 0x2d
  14990. 8027070: e007 b.n 8027082 <tfp_format+0x332>
  14991. else if (sign == 2)
  14992. 8027072: f1bb 0f02 cmp.w fp, #2
  14993. 8027076: d105 bne.n 8027084 <tfp_format+0x334>
  14994. putf(putp, '+');
  14995. 8027078: 4628 mov r0, r5
  14996. 802707a: 212b movs r1, #43 ; 0x2b
  14997. 802707c: e001 b.n 8027082 <tfp_format+0x332>
  14998. while (p.width-- > p.prec + fiter + 2)
  14999. {
  15000. putf(putp, '0');
  15001. 802707e: 4628 mov r0, r5
  15002. 8027080: 2130 movs r1, #48 ; 0x30
  15003. 8027082: 47b0 blx r6
  15004. if (sign == 1)
  15005. putf(putp, '-');
  15006. else if (sign == 2)
  15007. putf(putp, '+');
  15008. while (p.width-- > p.prec + fiter + 2)
  15009. 8027084: f89d 203c ldrb.w r2, [sp, #60] ; 0x3c
  15010. 8027088: 9b0b ldr r3, [sp, #44] ; 0x2c
  15011. 802708a: 444a add r2, r9
  15012. 802708c: 3202 adds r2, #2
  15013. 802708e: 1e59 subs r1, r3, #1
  15014. 8027090: 4293 cmp r3, r2
  15015. 8027092: 910b str r1, [sp, #44] ; 0x2c
  15016. 8027094: dcf3 bgt.n 802707e <tfp_format+0x32e>
  15017. 8027096: e017 b.n 80270c8 <tfp_format+0x378>
  15018. else
  15019. {
  15020. while (p.width-- > p.prec + fiter + 2)
  15021. {
  15022. putf(putp, ' ');
  15023. 8027098: 4628 mov r0, r5
  15024. 802709a: 2120 movs r1, #32
  15025. 802709c: 47b0 blx r6
  15026. }
  15027. }
  15028. else
  15029. {
  15030. while (p.width-- > p.prec + fiter + 2)
  15031. 802709e: f89d 103c ldrb.w r1, [sp, #60] ; 0x3c
  15032. 80270a2: 9a0b ldr r2, [sp, #44] ; 0x2c
  15033. 80270a4: 4449 add r1, r9
  15034. 80270a6: 3102 adds r1, #2
  15035. 80270a8: 1e50 subs r0, r2, #1
  15036. 80270aa: 428a cmp r2, r1
  15037. 80270ac: 900b str r0, [sp, #44] ; 0x2c
  15038. 80270ae: dcf3 bgt.n 8027098 <tfp_format+0x348>
  15039. {
  15040. putf(putp, ' ');
  15041. }
  15042. if (sign == 1)
  15043. 80270b0: f1bb 0f01 cmp.w fp, #1
  15044. 80270b4: d102 bne.n 80270bc <tfp_format+0x36c>
  15045. putf(putp, '-');
  15046. 80270b6: 4628 mov r0, r5
  15047. 80270b8: 212d movs r1, #45 ; 0x2d
  15048. 80270ba: e004 b.n 80270c6 <tfp_format+0x376>
  15049. else if (sign == 2)
  15050. 80270bc: f1bb 0f02 cmp.w fp, #2
  15051. 80270c0: d102 bne.n 80270c8 <tfp_format+0x378>
  15052. putf(putp, '+');
  15053. 80270c2: 4628 mov r0, r5
  15054. 80270c4: 212b movs r1, #43 ; 0x2b
  15055. 80270c6: 47b0 blx r6
  15056. }
  15057. if (fiter == -1)
  15058. 80270c8: f1b9 3fff cmp.w r9, #4294967295
  15059. 80270cc: d102 bne.n 80270d4 <tfp_format+0x384>
  15060. putf(putp, '0');
  15061. 80270ce: 4628 mov r0, r5
  15062. 80270d0: 2130 movs r1, #48 ; 0x30
  15063. 80270d2: e007 b.n 80270e4 <tfp_format+0x394>
  15064. while (fiter > -1)
  15065. {
  15066. putf(putp, '0' + (temp_buffer[fiter--]));
  15067. 80270d4: ab10 add r3, sp, #64 ; 0x40
  15068. 80270d6: 4628 mov r0, r5
  15069. 80270d8: f853 1029 ldr.w r1, [r3, r9, lsl #2]
  15070. 80270dc: 3130 adds r1, #48 ; 0x30
  15071. 80270de: f109 39ff add.w r9, r9, #4294967295
  15072. 80270e2: b2c9 uxtb r1, r1
  15073. 80270e4: 47b0 blx r6
  15074. }
  15075. if (fiter == -1)
  15076. putf(putp, '0');
  15077. while (fiter > -1)
  15078. 80270e6: f1b9 3fff cmp.w r9, #4294967295
  15079. 80270ea: d1f3 bne.n 80270d4 <tfp_format+0x384>
  15080. {
  15081. putf(putp, '0' + (temp_buffer[fiter--]));
  15082. }
  15083. putf(putp, '.');
  15084. 80270ec: 4628 mov r0, r5
  15085. 80270ee: 212e movs r1, #46 ; 0x2e
  15086. 80270f0: 47b0 blx r6
  15087. ffactor = 1;
  15088. 80270f2: f04f 0901 mov.w r9, #1
  15089. while (p.prec-- > 0)
  15090. 80270f6: e01d b.n 8027134 <tfp_format+0x3e4>
  15091. {
  15092. ffactor *= 10;
  15093. 80270f8: 230a movs r3, #10
  15094. fpart = (int)((fval - (int)fval)*ffactor);
  15095. 80270fa: 9801 ldr r0, [sp, #4]
  15096. putf(putp, '.');
  15097. ffactor = 1;
  15098. while (p.prec-- > 0)
  15099. {
  15100. ffactor *= 10;
  15101. 80270fc: fb03 f909 mul.w r9, r3, r9
  15102. fpart = (int)((fval - (int)fval)*ffactor);
  15103. 8027100: f7f9 f9f8 bl 80204f4 <__aeabi_i2d>
  15104. 8027104: 4602 mov r2, r0
  15105. 8027106: 460b mov r3, r1
  15106. 8027108: 9800 ldr r0, [sp, #0]
  15107. 802710a: 4651 mov r1, sl
  15108. 802710c: f7f9 f8a4 bl 8020258 <__aeabi_dsub>
  15109. 8027110: e9cd 0102 strd r0, r1, [sp, #8]
  15110. 8027114: 4648 mov r0, r9
  15111. 8027116: f7f9 f9ed bl 80204f4 <__aeabi_i2d>
  15112. 802711a: 4602 mov r2, r0
  15113. 802711c: 460b mov r3, r1
  15114. 802711e: e9dd 0102 ldrd r0, r1, [sp, #8]
  15115. 8027122: f7f9 fa4d bl 80205c0 <__aeabi_dmul>
  15116. 8027126: f7f9 fce5 bl 8020af4 <__aeabi_d2iz>
  15117. if (fpart == 0)
  15118. 802712a: 4680 mov r8, r0
  15119. 802712c: b910 cbnz r0, 8027134 <tfp_format+0x3e4>
  15120. putf(putp, '0');
  15121. 802712e: 4628 mov r0, r5
  15122. 8027130: 2130 movs r1, #48 ; 0x30
  15123. 8027132: 47b0 blx r6
  15124. putf(putp, '0' + (temp_buffer[fiter--]));
  15125. }
  15126. putf(putp, '.');
  15127. ffactor = 1;
  15128. while (p.prec-- > 0)
  15129. 8027134: f89d 303c ldrb.w r3, [sp, #60] ; 0x3c
  15130. 8027138: 1e5a subs r2, r3, #1
  15131. 802713a: f88d 203c strb.w r2, [sp, #60] ; 0x3c
  15132. 802713e: 2b00 cmp r3, #0
  15133. 8027140: d1da bne.n 80270f8 <tfp_format+0x3a8>
  15134. putf(putp, '0');
  15135. }
  15136. fiter = 0;
  15137. while (fpart != 0)
  15138. {
  15139. temp_buffer[fiter++] = fpart % 10;
  15140. 8027142: 220a movs r2, #10
  15141. 8027144: e008 b.n 8027158 <tfp_format+0x408>
  15142. 8027146: fb98 f1f2 sdiv r1, r8, r2
  15143. 802714a: a810 add r0, sp, #64 ; 0x40
  15144. 802714c: fb02 8811 mls r8, r2, r1, r8
  15145. 8027150: f840 8023 str.w r8, [r0, r3, lsl #2]
  15146. 8027154: 3301 adds r3, #1
  15147. fpart = fpart / 10;
  15148. 8027156: 4688 mov r8, r1
  15149. fpart = (int)((fval - (int)fval)*ffactor);
  15150. if (fpart == 0)
  15151. putf(putp, '0');
  15152. }
  15153. fiter = 0;
  15154. while (fpart != 0)
  15155. 8027158: f1b8 0f00 cmp.w r8, #0
  15156. 802715c: d1f3 bne.n 8027146 <tfp_format+0x3f6>
  15157. 802715e: 4698 mov r8, r3
  15158. temp_buffer[fiter++] = fpart % 10;
  15159. fpart = fpart / 10;
  15160. }
  15161. fiter--;
  15162. while (fiter > -1)
  15163. 8027160: e006 b.n 8027170 <tfp_format+0x420>
  15164. {
  15165. putf(putp, '0' + (temp_buffer[fiter--]));
  15166. 8027162: ab10 add r3, sp, #64 ; 0x40
  15167. 8027164: 4628 mov r0, r5
  15168. 8027166: f853 1028 ldr.w r1, [r3, r8, lsl #2]
  15169. 802716a: 3130 adds r1, #48 ; 0x30
  15170. 802716c: b2c9 uxtb r1, r1
  15171. 802716e: 47b0 blx r6
  15172. temp_buffer[fiter++] = fpart % 10;
  15173. fpart = fpart / 10;
  15174. }
  15175. fiter--;
  15176. while (fiter > -1)
  15177. 8027170: f118 38ff adds.w r8, r8, #4294967295
  15178. 8027174: d2f5 bcs.n 8027162 <tfp_format+0x412>
  15179. char bf[12]; /* int = 32b on some architectures */
  15180. #endif
  15181. char ch;
  15182. p.bf = bf;
  15183. while ((ch = *(fmt++))) {
  15184. 8027176: f817 1b01 ldrb.w r1, [r7], #1
  15185. 802717a: 2900 cmp r1, #0
  15186. 802717c: f47f adf2 bne.w 8026d64 <tfp_format+0x14>
  15187. 8027180: e003 b.n 802718a <tfp_format+0x43a>
  15188. {
  15189. const char *p = *src;
  15190. unsigned int num = 0;
  15191. int digit;
  15192. while ((digit = a2d(ch)) >= 0) {
  15193. if (digit > base)
  15194. 8027182: 2b0a cmp r3, #10
  15195. 8027184: f77f ae32 ble.w 8026dec <tfp_format+0x9c>
  15196. 8027188: e64c b.n 8026e24 <tfp_format+0xd4>
  15197. break;
  15198. }
  15199. }
  15200. }
  15201. abort:;
  15202. }
  15203. 802718a: b01b add sp, #108 ; 0x6c
  15204. 802718c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  15205. 08027190 <tfp_printf>:
  15206. stdout_putf = putf;
  15207. stdout_putp = putp;
  15208. }
  15209. void tfp_printf(char *fmt, ...)
  15210. {
  15211. 8027190: b40f push {r0, r1, r2, r3}
  15212. 8027192: b507 push {r0, r1, r2, lr}
  15213. va_list va;
  15214. va_start(va, fmt);
  15215. tfp_format(stdout_putp, stdout_putf, fmt, va);
  15216. 8027194: 4906 ldr r1, [pc, #24] ; (80271b0 <tfp_printf+0x20>)
  15217. stdout_putf = putf;
  15218. stdout_putp = putp;
  15219. }
  15220. void tfp_printf(char *fmt, ...)
  15221. {
  15222. 8027196: ab04 add r3, sp, #16
  15223. va_list va;
  15224. va_start(va, fmt);
  15225. tfp_format(stdout_putp, stdout_putf, fmt, va);
  15226. 8027198: 6808 ldr r0, [r1, #0]
  15227. 802719a: 4906 ldr r1, [pc, #24] ; (80271b4 <tfp_printf+0x24>)
  15228. stdout_putf = putf;
  15229. stdout_putp = putp;
  15230. }
  15231. void tfp_printf(char *fmt, ...)
  15232. {
  15233. 802719c: f853 2b04 ldr.w r2, [r3], #4
  15234. va_list va;
  15235. va_start(va, fmt);
  15236. tfp_format(stdout_putp, stdout_putf, fmt, va);
  15237. 80271a0: 6809 ldr r1, [r1, #0]
  15238. }
  15239. void tfp_printf(char *fmt, ...)
  15240. {
  15241. va_list va;
  15242. va_start(va, fmt);
  15243. 80271a2: 9301 str r3, [sp, #4]
  15244. tfp_format(stdout_putp, stdout_putf, fmt, va);
  15245. 80271a4: f7ff fdd4 bl 8026d50 <tfp_format>
  15246. va_end(va);
  15247. }
  15248. 80271a8: e8bd 400e ldmia.w sp!, {r1, r2, r3, lr}
  15249. 80271ac: b004 add sp, #16
  15250. 80271ae: 4770 bx lr
  15251. 80271b0: 2000289c .word 0x2000289c
  15252. 80271b4: 20002898 .word 0x20002898
  15253. 080271b8 <tfp_vsprintf>:
  15254. struct _vsprintf_putcf_data *data = (struct _vsprintf_putcf_data*)p;
  15255. data->dest[data->num_chars++] = c;
  15256. }
  15257. int tfp_vsprintf(char *str, const char *format, va_list ap)
  15258. {
  15259. 80271b8: b537 push {r0, r1, r2, r4, r5, lr}
  15260. 80271ba: 460d mov r5, r1
  15261. 80271bc: 4613 mov r3, r2
  15262. struct _vsprintf_putcf_data data;
  15263. data.dest = str;
  15264. 80271be: 9000 str r0, [sp, #0]
  15265. data.num_chars = 0;
  15266. 80271c0: 2400 movs r4, #0
  15267. tfp_format(&data, _vsprintf_putcf, format, ap);
  15268. 80271c2: 4668 mov r0, sp
  15269. 80271c4: 462a mov r2, r5
  15270. 80271c6: 4904 ldr r1, [pc, #16] ; (80271d8 <tfp_vsprintf+0x20>)
  15271. int tfp_vsprintf(char *str, const char *format, va_list ap)
  15272. {
  15273. struct _vsprintf_putcf_data data;
  15274. data.dest = str;
  15275. data.num_chars = 0;
  15276. 80271c8: 9401 str r4, [sp, #4]
  15277. tfp_format(&data, _vsprintf_putcf, format, ap);
  15278. 80271ca: f7ff fdc1 bl 8026d50 <tfp_format>
  15279. data.dest[data.num_chars] = '\0';
  15280. 80271ce: e89d 000c ldmia.w sp, {r2, r3}
  15281. 80271d2: 54d4 strb r4, [r2, r3]
  15282. return data.num_chars;
  15283. }
  15284. 80271d4: 9801 ldr r0, [sp, #4]
  15285. 80271d6: bd3e pop {r1, r2, r3, r4, r5, pc}
  15286. 80271d8: 08026d45 .word 0x08026d45
  15287. 080271dc <tfp_sprintf>:
  15288. int tfp_sprintf(char *str, const char *format, ...)
  15289. {
  15290. 80271dc: b40e push {r1, r2, r3}
  15291. 80271de: b503 push {r0, r1, lr}
  15292. 80271e0: aa03 add r2, sp, #12
  15293. 80271e2: f852 1b04 ldr.w r1, [r2], #4
  15294. va_list ap;
  15295. int retval;
  15296. va_start(ap, format);
  15297. 80271e6: 9201 str r2, [sp, #4]
  15298. retval = tfp_vsprintf(str, format, ap);
  15299. 80271e8: f7ff ffe6 bl 80271b8 <tfp_vsprintf>
  15300. va_end(ap);
  15301. return retval;
  15302. }
  15303. 80271ec: e8bd 400c ldmia.w sp!, {r2, r3, lr}
  15304. 80271f0: b003 add sp, #12
  15305. 80271f2: 4770 bx lr
  15306. 080271f4 <GetLineFailBitStr>:
  15307. /* if (upsParams.lineFailBit)
  15308. *str = '1';
  15309. else
  15310. *str = '0';*/
  15311. *len = 1;
  15312. 80271f4: 2301 movs r3, #1
  15313. 80271f6: 700b strb r3, [r1, #0]
  15314. 80271f8: 4770 bx lr
  15315. 080271fa <GetLowBatteryBitStr>:
  15316. /**
  15317. * @brief
  15318. */
  15319. void GetLowBatteryBitStr(char *str, uint8_t *len)
  15320. {
  15321. 80271fa: 4770 bx lr
  15322. 080271fc <GetInputFreqStr>:
  15323. /**
  15324. * @brief
  15325. */
  15326. void GetInputFreqStr(char *str, uint8_t *len)
  15327. {
  15328. 80271fc: b510 push {r4, lr}
  15329. 80271fe: 460c mov r4, r1
  15330. /* sprintf(str, "%0.1f", upsParams.inputFrequency);
  15331. //strcpy(str, upsParamsStr.inputFrequency);*/
  15332. *len = strlen(str);
  15333. 8027200: f7fa fcb2 bl 8021b68 <strlen>
  15334. 8027204: 7020 strb r0, [r4, #0]
  15335. 8027206: bd10 pop {r4, pc}
  15336. 08027208 <GetOutputFreqStr>:
  15337. /**
  15338. * @brief
  15339. */
  15340. void GetOutputFreqStr(char *str, uint8_t *len)
  15341. {
  15342. 8027208: b510 push {r4, lr}
  15343. 802720a: 460c mov r4, r1
  15344. // sprintf(str, "%0.1f", upsParams.outputFrequency);
  15345. //strcpy(str, upsParamsStr.outputFrequency);
  15346. *len = strlen(str);
  15347. 802720c: f7fa fcac bl 8021b68 <strlen>
  15348. 8027210: 7020 strb r0, [r4, #0]
  15349. 8027212: bd10 pop {r4, pc}
  15350. 08027214 <GetInputVoltageStr>:
  15351. /**
  15352. * @brief
  15353. */
  15354. void GetInputVoltageStr(char *str, uint8_t *len)
  15355. {
  15356. 8027214: b510 push {r4, lr}
  15357. 8027216: 460c mov r4, r1
  15358. // sprintf(str, "%0.1f", upsParams.inputVoltage);
  15359. //strcpy(str, upsParamsStr.inputVoltage);
  15360. *len = strlen(str);
  15361. 8027218: f7fa fca6 bl 8021b68 <strlen>
  15362. 802721c: 7020 strb r0, [r4, #0]
  15363. 802721e: bd10 pop {r4, pc}
  15364. 08027220 <GetOutputVoltageStr>:
  15365. /**
  15366. * @brief
  15367. */
  15368. void GetOutputVoltageStr(char *str, uint8_t *len)
  15369. {
  15370. 8027220: b510 push {r4, lr}
  15371. 8027222: 460c mov r4, r1
  15372. //sprintf(str, "%0.1f", upsParams.outputVoltage);
  15373. //strcpy(str, upsParamsStr.outputVoltage);
  15374. *len = strlen(str);
  15375. 8027224: f7fa fca0 bl 8021b68 <strlen>
  15376. 8027228: 7020 strb r0, [r4, #0]
  15377. 802722a: bd10 pop {r4, pc}
  15378. 0802722c <GetPowerStr>:
  15379. /**
  15380. * @brief
  15381. */
  15382. void GetPowerStr(char *str, uint8_t *len)
  15383. {
  15384. 802722c: b510 push {r4, lr}
  15385. 802722e: 460c mov r4, r1
  15386. // sprintf(str, "%0.1f", upsParams.power);
  15387. //sprintf(str, upsParamsStr.power);
  15388. *len = strlen(str);
  15389. 8027230: f7fa fc9a bl 8021b68 <strlen>
  15390. 8027234: 7020 strb r0, [r4, #0]
  15391. 8027236: bd10 pop {r4, pc}
  15392. 08027238 <GetBatCapacityStr>:
  15393. /**
  15394. * @brief
  15395. */
  15396. void GetBatCapacityStr(char *str, uint8_t *len)
  15397. {
  15398. 8027238: b510 push {r4, lr}
  15399. 802723a: 460c mov r4, r1
  15400. // sprintf(str, "%0.1f", upsParams.batteryCapacity);
  15401. //strcpy(str, upsParamsStr.batteryCapacity);
  15402. *len = strlen(str);
  15403. 802723c: f7fa fc94 bl 8021b68 <strlen>
  15404. 8027240: 7020 strb r0, [r4, #0]
  15405. 8027242: bd10 pop {r4, pc}
  15406. 08027244 <GetRuntimeStr>:
  15407. /**
  15408. * @brief
  15409. */
  15410. void GetRuntimeStr(char *str, uint8_t *len)
  15411. {
  15412. 8027244: b510 push {r4, lr}
  15413. 8027246: 460c mov r4, r1
  15414. // sprintf(str, "%d", upsParams.runtime);
  15415. //strcpy(str, upsParamsStr.runtime);
  15416. *len = strlen(str);
  15417. 8027248: f7fa fc8e bl 8021b68 <strlen>
  15418. 802724c: 7020 strb r0, [r4, #0]
  15419. 802724e: bd10 pop {r4, pc}
  15420. 08027250 <GetInternalTempStr>:
  15421. /**
  15422. * @brief
  15423. */
  15424. void GetInternalTempStr(char *str, uint8_t *len)
  15425. {
  15426. 8027250: b510 push {r4, lr}
  15427. 8027252: 460c mov r4, r1
  15428. // sprintf(str, "%0.1f", upsParams.temperature);
  15429. //strcpy(str, upsParamsStr.temperature);
  15430. *len = strlen(str);
  15431. 8027254: f7fa fc88 bl 8021b68 <strlen>
  15432. 8027258: 7020 strb r0, [r4, #0]
  15433. 802725a: bd10 pop {r4, pc}
  15434. 0802725c <GetLoadMonitorStr>:
  15435. /* // if (upsParams.monitor_power)
  15436. *str = '1';
  15437. else
  15438. *str = '0';*/
  15439. *len = 1;
  15440. 802725c: 2301 movs r3, #1
  15441. 802725e: 700b strb r3, [r1, #0]
  15442. 8027260: 4770 bx lr
  15443. 08027262 <GetTempMonitorStr>:
  15444. /*// if (upsParams.monitor_temperature)
  15445. *str = '1';
  15446. else
  15447. *str = '0';*/
  15448. *len = 1;
  15449. 8027262: 2301 movs r3, #1
  15450. 8027264: 700b strb r3, [r1, #0]
  15451. 8027266: 4770 bx lr
  15452. 08027268 <GetConnectMonitorStr>:
  15453. /* if (upsParams.connect)
  15454. *str = '0';
  15455. else
  15456. *str = '1';*/
  15457. *len = 1;
  15458. 8027268: 2301 movs r3, #1
  15459. 802726a: 700b strb r3, [r1, #0]
  15460. 802726c: 4770 bx lr
  15461. 802726e: 0000 movs r0, r0
  15462. 08027270 <GetWorkTimeStr>:
  15463. /**
  15464. * @brief Время работы устройства
  15465. */
  15466. void GetWorkTimeStr(char *str, uint8_t *len)
  15467. {
  15468. 8027270: b57f push {r0, r1, r2, r3, r4, r5, r6, lr}
  15469. 8027272: 4604 mov r4, r0
  15470. u32_t tick;
  15471. uint16_t day;
  15472. uint8_t hour;
  15473. uint8_t min;
  15474. snmp_get_sysuptime(&tick);
  15475. 8027274: a803 add r0, sp, #12
  15476. /**
  15477. * @brief Время работы устройства
  15478. */
  15479. void GetWorkTimeStr(char *str, uint8_t *len)
  15480. {
  15481. 8027276: 460e mov r6, r1
  15482. u32_t tick;
  15483. uint16_t day;
  15484. uint8_t hour;
  15485. uint8_t min;
  15486. snmp_get_sysuptime(&tick);
  15487. 8027278: f008 fadc bl 802f834 <snmp_get_sysuptime>
  15488. day = tick/8640000;
  15489. 802727c: 9803 ldr r0, [sp, #12]
  15490. tick = tick%8640000;
  15491. 802727e: 4b0c ldr r3, [pc, #48] ; (80272b0 <GetWorkTimeStr+0x40>)
  15492. hour = tick/360000;
  15493. tick = tick%360000;
  15494. 8027280: 4d0c ldr r5, [pc, #48] ; (80272b4 <GetWorkTimeStr+0x44>)
  15495. snmp_get_sysuptime(&tick);
  15496. day = tick/8640000;
  15497. tick = tick%8640000;
  15498. 8027282: fbb0 f2f3 udiv r2, r0, r3
  15499. 8027286: fb03 0012 mls r0, r3, r2, r0
  15500. hour = tick/360000;
  15501. tick = tick%360000;
  15502. 802728a: fbb0 f3f5 udiv r3, r0, r5
  15503. 802728e: fb05 0013 mls r0, r5, r3, r0
  15504. min = tick/6000;
  15505. 8027292: f241 7170 movw r1, #6000 ; 0x1770
  15506. day = tick/8640000;
  15507. tick = tick%8640000;
  15508. hour = tick/360000;
  15509. tick = tick%360000;
  15510. 8027296: 9003 str r0, [sp, #12]
  15511. min = tick/6000;
  15512. 8027298: fbb0 f0f1 udiv r0, r0, r1
  15513. sprintf(str, "%d дн. %d ч. %d мин.", day, hour, min);
  15514. 802729c: 9000 str r0, [sp, #0]
  15515. 802729e: 4906 ldr r1, [pc, #24] ; (80272b8 <GetWorkTimeStr+0x48>)
  15516. 80272a0: 4620 mov r0, r4
  15517. 80272a2: f7ff ff9b bl 80271dc <tfp_sprintf>
  15518. *len = strlen(str);
  15519. 80272a6: 4620 mov r0, r4
  15520. 80272a8: f7fa fc5e bl 8021b68 <strlen>
  15521. 80272ac: 7030 strb r0, [r6, #0]
  15522. }
  15523. 80272ae: bd7f pop {r0, r1, r2, r3, r4, r5, r6, pc}
  15524. 80272b0: 0083d600 .word 0x0083d600
  15525. 80272b4: 00057e40 .word 0x00057e40
  15526. 80272b8: 08033e25 .word 0x08033e25
  15527. 080272bc <GetModelStr>:
  15528. /**
  15529. * @brief Модель устройства
  15530. */
  15531. void GetModelStr(char *str, uint8_t *len)
  15532. {
  15533. 80272bc: b570 push {r4, r5, r6, lr}
  15534. *len = strlen(sSettings.sSnmp.sysName);
  15535. 80272be: 4c07 ldr r4, [pc, #28] ; (80272dc <GetModelStr+0x20>)
  15536. /**
  15537. * @brief Модель устройства
  15538. */
  15539. void GetModelStr(char *str, uint8_t *len)
  15540. {
  15541. 80272c0: 4605 mov r5, r0
  15542. *len = strlen(sSettings.sSnmp.sysName);
  15543. 80272c2: 4620 mov r0, r4
  15544. /**
  15545. * @brief Модель устройства
  15546. */
  15547. void GetModelStr(char *str, uint8_t *len)
  15548. {
  15549. 80272c4: 460e mov r6, r1
  15550. *len = strlen(sSettings.sSnmp.sysName);
  15551. 80272c6: f7fa fc4f bl 8021b68 <strlen>
  15552. 80272ca: 4602 mov r2, r0
  15553. 80272cc: 7030 strb r0, [r6, #0]
  15554. strncpy(str, sSettings.sSnmp.sysName, *len);
  15555. 80272ce: 4621 mov r1, r4
  15556. 80272d0: 4628 mov r0, r5
  15557. 80272d2: b2d2 uxtb r2, r2
  15558. }
  15559. 80272d4: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  15560. * @brief Модель устройства
  15561. */
  15562. void GetModelStr(char *str, uint8_t *len)
  15563. {
  15564. *len = strlen(sSettings.sSnmp.sysName);
  15565. strncpy(str, sSettings.sSnmp.sysName, *len);
  15566. 80272d8: f7fa bcfe b.w 8021cd8 <strncpy>
  15567. 80272dc: 2000e9cc .word 0x2000e9cc
  15568. 080272e0 <GetProductionDataStr>:
  15569. /**
  15570. * @brief Дата производства
  15571. */
  15572. void GetProductionDataStr(char *str, uint8_t *len)
  15573. {
  15574. 80272e0: b570 push {r4, r5, r6, lr}
  15575. *len = strlen(sSettings.sInfo.productionData);
  15576. 80272e2: 4c07 ldr r4, [pc, #28] ; (8027300 <GetProductionDataStr+0x20>)
  15577. /**
  15578. * @brief Дата производства
  15579. */
  15580. void GetProductionDataStr(char *str, uint8_t *len)
  15581. {
  15582. 80272e4: 4605 mov r5, r0
  15583. *len = strlen(sSettings.sInfo.productionData);
  15584. 80272e6: 4620 mov r0, r4
  15585. /**
  15586. * @brief Дата производства
  15587. */
  15588. void GetProductionDataStr(char *str, uint8_t *len)
  15589. {
  15590. 80272e8: 460e mov r6, r1
  15591. *len = strlen(sSettings.sInfo.productionData);
  15592. 80272ea: f7fa fc3d bl 8021b68 <strlen>
  15593. 80272ee: 4602 mov r2, r0
  15594. 80272f0: 7030 strb r0, [r6, #0]
  15595. strncpy(str, sSettings.sInfo.productionData, *len);
  15596. 80272f2: 4621 mov r1, r4
  15597. 80272f4: 4628 mov r0, r5
  15598. 80272f6: b2d2 uxtb r2, r2
  15599. }
  15600. 80272f8: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  15601. * @brief Дата производства
  15602. */
  15603. void GetProductionDataStr(char *str, uint8_t *len)
  15604. {
  15605. *len = strlen(sSettings.sInfo.productionData);
  15606. strncpy(str, sSettings.sInfo.productionData, *len);
  15607. 80272fc: f7fa bcec b.w 8021cd8 <strncpy>
  15608. 8027300: 2000ea8a .word 0x2000ea8a
  15609. 08027304 <GetVersionStr>:
  15610. /**
  15611. * @brief Версия ПО
  15612. */
  15613. void GetVersionStr(char *str, uint8_t *len) // +
  15614. {
  15615. 8027304: b570 push {r4, r5, r6, lr}
  15616. *len = strlen(VERSION);
  15617. 8027306: 4c07 ldr r4, [pc, #28] ; (8027324 <GetVersionStr+0x20>)
  15618. /**
  15619. * @brief Версия ПО
  15620. */
  15621. void GetVersionStr(char *str, uint8_t *len) // +
  15622. {
  15623. 8027308: 4605 mov r5, r0
  15624. *len = strlen(VERSION);
  15625. 802730a: 4620 mov r0, r4
  15626. /**
  15627. * @brief Версия ПО
  15628. */
  15629. void GetVersionStr(char *str, uint8_t *len) // +
  15630. {
  15631. 802730c: 460e mov r6, r1
  15632. *len = strlen(VERSION);
  15633. 802730e: f7fa fc2b bl 8021b68 <strlen>
  15634. 8027312: 4602 mov r2, r0
  15635. 8027314: 7030 strb r0, [r6, #0]
  15636. strncpy(str, VERSION, *len);
  15637. 8027316: 4621 mov r1, r4
  15638. 8027318: 4628 mov r0, r5
  15639. 802731a: b2d2 uxtb r2, r2
  15640. }
  15641. 802731c: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  15642. * @brief Версия ПО
  15643. */
  15644. void GetVersionStr(char *str, uint8_t *len) // +
  15645. {
  15646. *len = strlen(VERSION);
  15647. strncpy(str, VERSION, *len);
  15648. 8027320: f7fa bcda b.w 8021cd8 <strncpy>
  15649. 8027324: 08033e40 .word 0x08033e40
  15650. 08027328 <GetMacStr>:
  15651. /**
  15652. * @brief MAC адрес устройства
  15653. */
  15654. void GetMacStr(char *str, uint8_t *len)
  15655. {
  15656. 8027328: b570 push {r4, r5, r6, lr}
  15657. *len = strlen(sSettings.sInfo.mac);
  15658. 802732a: 4c07 ldr r4, [pc, #28] ; (8027348 <GetMacStr+0x20>)
  15659. /**
  15660. * @brief MAC адрес устройства
  15661. */
  15662. void GetMacStr(char *str, uint8_t *len)
  15663. {
  15664. 802732c: 4605 mov r5, r0
  15665. *len = strlen(sSettings.sInfo.mac);
  15666. 802732e: 4620 mov r0, r4
  15667. /**
  15668. * @brief MAC адрес устройства
  15669. */
  15670. void GetMacStr(char *str, uint8_t *len)
  15671. {
  15672. 8027330: 460e mov r6, r1
  15673. *len = strlen(sSettings.sInfo.mac);
  15674. 8027332: f7fa fc19 bl 8021b68 <strlen>
  15675. 8027336: 4602 mov r2, r0
  15676. 8027338: 7030 strb r0, [r6, #0]
  15677. strncpy(str, sSettings.sInfo.mac, *len);
  15678. 802733a: 4621 mov r1, r4
  15679. 802733c: 4628 mov r0, r5
  15680. 802733e: b2d2 uxtb r2, r2
  15681. }
  15682. 8027340: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  15683. * @brief MAC адрес устройства
  15684. */
  15685. void GetMacStr(char *str, uint8_t *len)
  15686. {
  15687. *len = strlen(sSettings.sInfo.mac);
  15688. strncpy(str, sSettings.sInfo.mac, *len);
  15689. 8027344: f7fa bcc8 b.w 8021cd8 <strncpy>
  15690. 8027348: 2000eab2 .word 0x2000eab2
  15691. 0802734c <GetSerialNumberStr>:
  15692. /**
  15693. * @brief Серийный номер устройства
  15694. */
  15695. void GetSerialNumberStr(char *str, uint8_t *len)
  15696. {
  15697. 802734c: b570 push {r4, r5, r6, lr}
  15698. *len = strlen(sSettings.sInfo.serialNumber);
  15699. 802734e: 4c07 ldr r4, [pc, #28] ; (802736c <GetSerialNumberStr+0x20>)
  15700. /**
  15701. * @brief Серийный номер устройства
  15702. */
  15703. void GetSerialNumberStr(char *str, uint8_t *len)
  15704. {
  15705. 8027350: 4605 mov r5, r0
  15706. *len = strlen(sSettings.sInfo.serialNumber);
  15707. 8027352: 4620 mov r0, r4
  15708. /**
  15709. * @brief Серийный номер устройства
  15710. */
  15711. void GetSerialNumberStr(char *str, uint8_t *len)
  15712. {
  15713. 8027354: 460e mov r6, r1
  15714. *len = strlen(sSettings.sInfo.serialNumber);
  15715. 8027356: f7fa fc07 bl 8021b68 <strlen>
  15716. 802735a: 4602 mov r2, r0
  15717. 802735c: 7030 strb r0, [r6, #0]
  15718. strncpy(str, sSettings.sInfo.serialNumber, *len);
  15719. 802735e: 4621 mov r1, r4
  15720. 8027360: 4628 mov r0, r5
  15721. 8027362: b2d2 uxtb r2, r2
  15722. }
  15723. 8027364: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  15724. * @brief Серийный номер устройства
  15725. */
  15726. void GetSerialNumberStr(char *str, uint8_t *len)
  15727. {
  15728. *len = strlen(sSettings.sInfo.serialNumber);
  15729. strncpy(str, sSettings.sInfo.serialNumber, *len);
  15730. 8027368: f7fa bcb6 b.w 8021cd8 <strncpy>
  15731. 802736c: 2000eac4 .word 0x2000eac4
  15732. 08027370 <GetOwnerStr>:
  15733. /**
  15734. * @brief Владелец устройства
  15735. */
  15736. void GetOwnerStr(char *str, uint8_t *len)
  15737. {
  15738. 8027370: b570 push {r4, r5, r6, lr}
  15739. *len = strlen(sSettings.sSnmp.sysContact);
  15740. 8027372: 4c07 ldr r4, [pc, #28] ; (8027390 <GetOwnerStr+0x20>)
  15741. /**
  15742. * @brief Владелец устройства
  15743. */
  15744. void GetOwnerStr(char *str, uint8_t *len)
  15745. {
  15746. 8027374: 4605 mov r5, r0
  15747. *len = strlen(sSettings.sSnmp.sysContact);
  15748. 8027376: 4620 mov r0, r4
  15749. /**
  15750. * @brief Владелец устройства
  15751. */
  15752. void GetOwnerStr(char *str, uint8_t *len)
  15753. {
  15754. 8027378: 460e mov r6, r1
  15755. *len = strlen(sSettings.sSnmp.sysContact);
  15756. 802737a: f7fa fbf5 bl 8021b68 <strlen>
  15757. 802737e: 4602 mov r2, r0
  15758. 8027380: 7030 strb r0, [r6, #0]
  15759. strncpy(str, sSettings.sSnmp.sysContact, *len);
  15760. 8027382: 4621 mov r1, r4
  15761. 8027384: 4628 mov r0, r5
  15762. 8027386: b2d2 uxtb r2, r2
  15763. }
  15764. 8027388: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  15765. * @brief Владелец устройства
  15766. */
  15767. void GetOwnerStr(char *str, uint8_t *len)
  15768. {
  15769. *len = strlen(sSettings.sSnmp.sysContact);
  15770. strncpy(str, sSettings.sSnmp.sysContact, *len);
  15771. 802738c: f7fa bca4 b.w 8021cd8 <strncpy>
  15772. 8027390: 2000e99a .word 0x2000e99a
  15773. 08027394 <GetLocationStr>:
  15774. /**
  15775. * @brief Местоположение устройства
  15776. */
  15777. void GetLocationStr(char *str, uint8_t *len)
  15778. {
  15779. 8027394: b570 push {r4, r5, r6, lr}
  15780. *len = strlen(sSettings.sSnmp.sysLocation);
  15781. 8027396: 4c07 ldr r4, [pc, #28] ; (80273b4 <GetLocationStr+0x20>)
  15782. /**
  15783. * @brief Местоположение устройства
  15784. */
  15785. void GetLocationStr(char *str, uint8_t *len)
  15786. {
  15787. 8027398: 4605 mov r5, r0
  15788. *len = strlen(sSettings.sSnmp.sysLocation);
  15789. 802739a: 4620 mov r0, r4
  15790. /**
  15791. * @brief Местоположение устройства
  15792. */
  15793. void GetLocationStr(char *str, uint8_t *len)
  15794. {
  15795. 802739c: 460e mov r6, r1
  15796. *len = strlen(sSettings.sSnmp.sysLocation);
  15797. 802739e: f7fa fbe3 bl 8021b68 <strlen>
  15798. 80273a2: 4602 mov r2, r0
  15799. 80273a4: 7030 strb r0, [r6, #0]
  15800. strncpy(str, sSettings.sSnmp.sysLocation, *len);
  15801. 80273a6: 4621 mov r1, r4
  15802. 80273a8: 4628 mov r0, r5
  15803. 80273aa: b2d2 uxtb r2, r2
  15804. }
  15805. 80273ac: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  15806. * @brief Местоположение устройства
  15807. */
  15808. void GetLocationStr(char *str, uint8_t *len)
  15809. {
  15810. *len = strlen(sSettings.sSnmp.sysLocation);
  15811. strncpy(str, sSettings.sSnmp.sysLocation, *len);
  15812. 80273b0: f7fa bc92 b.w 8021cd8 <strncpy>
  15813. 80273b4: 2000e9e0 .word 0x2000e9e0
  15814. 080273b8 <GetCommentsStr>:
  15815. /**
  15816. * @brief Комментарии
  15817. */
  15818. void GetCommentsStr(char *str, uint8_t *len)
  15819. {
  15820. 80273b8: b570 push {r4, r5, r6, lr}
  15821. *len = strlen(sSettings.sInfo.comments);
  15822. 80273ba: 4c07 ldr r4, [pc, #28] ; (80273d8 <GetCommentsStr+0x20>)
  15823. /**
  15824. * @brief Комментарии
  15825. */
  15826. void GetCommentsStr(char *str, uint8_t *len)
  15827. {
  15828. 80273bc: 4605 mov r5, r0
  15829. *len = strlen(sSettings.sInfo.comments);
  15830. 80273be: 4620 mov r0, r4
  15831. /**
  15832. * @brief Комментарии
  15833. */
  15834. void GetCommentsStr(char *str, uint8_t *len)
  15835. {
  15836. 80273c0: 460e mov r6, r1
  15837. *len = strlen(sSettings.sInfo.comments);
  15838. 80273c2: f7fa fbd1 bl 8021b68 <strlen>
  15839. 80273c6: 4602 mov r2, r0
  15840. 80273c8: 7030 strb r0, [r6, #0]
  15841. strncpy(str, sSettings.sInfo.comments, *len);
  15842. 80273ca: 4621 mov r1, r4
  15843. 80273cc: 4628 mov r0, r5
  15844. 80273ce: b2d2 uxtb r2, r2
  15845. }
  15846. 80273d0: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  15847. * @brief Комментарии
  15848. */
  15849. void GetCommentsStr(char *str, uint8_t *len)
  15850. {
  15851. *len = strlen(sSettings.sInfo.comments);
  15852. strncpy(str, sSettings.sInfo.comments, *len);
  15853. 80273d4: f7fa bc80 b.w 8021cd8 <strncpy>
  15854. 80273d8: 2000ead4 .word 0x2000ead4
  15855. 080273dc <GetIpStr>:
  15856. * @brief Текущий IP адрес
  15857. */
  15858. void GetIpStr(char *str, uint8_t *len)
  15859. {
  15860. /* Если сейчас временные настройки */
  15861. if (sSettings.sFlags.netsettingsChanged)
  15862. 80273dc: 4a08 ldr r2, [pc, #32] ; (8027400 <GetIpStr+0x24>)
  15863. /**
  15864. * @brief Текущий IP адрес
  15865. */
  15866. void GetIpStr(char *str, uint8_t *len)
  15867. {
  15868. 80273de: b538 push {r3, r4, r5, lr}
  15869. /* Если сейчас временные настройки */
  15870. if (sSettings.sFlags.netsettingsChanged)
  15871. 80273e0: f892 32ce ldrb.w r3, [r2, #718] ; 0x2ce
  15872. /**
  15873. * @brief Текущий IP адрес
  15874. */
  15875. void GetIpStr(char *str, uint8_t *len)
  15876. {
  15877. 80273e4: 460c mov r4, r1
  15878. 80273e6: 4605 mov r5, r0
  15879. /* Если сейчас временные настройки */
  15880. if (sSettings.sFlags.netsettingsChanged)
  15881. sprintf(str, "%s", sSettings.sWebTempParams.ip);
  15882. 80273e8: 4906 ldr r1, [pc, #24] ; (8027404 <GetIpStr+0x28>)
  15883. * @brief Текущий IP адрес
  15884. */
  15885. void GetIpStr(char *str, uint8_t *len)
  15886. {
  15887. /* Если сейчас временные настройки */
  15888. if (sSettings.sFlags.netsettingsChanged)
  15889. 80273ea: b10b cbz r3, 80273f0 <GetIpStr+0x14>
  15890. sprintf(str, "%s", sSettings.sWebTempParams.ip);
  15891. 80273ec: 3230 adds r2, #48 ; 0x30
  15892. 80273ee: e000 b.n 80273f2 <GetIpStr+0x16>
  15893. else
  15894. sprintf(str, "%s", sSettings.sWebParams.ip);
  15895. 80273f0: 3202 adds r2, #2
  15896. 80273f2: f7ff fef3 bl 80271dc <tfp_sprintf>
  15897. *len = strlen(str);
  15898. 80273f6: 4628 mov r0, r5
  15899. 80273f8: f7fa fbb6 bl 8021b68 <strlen>
  15900. 80273fc: 7020 strb r0, [r4, #0]
  15901. 80273fe: bd38 pop {r3, r4, r5, pc}
  15902. 8027400: 2000e874 .word 0x2000e874
  15903. 8027404: 08033e44 .word 0x08033e44
  15904. 08027408 <GetGatewayStr>:
  15905. * @brief Текущий шлюз
  15906. */
  15907. void GetGatewayStr(char *str, uint8_t *len)
  15908. {
  15909. /* Если сейчас временные настройки */
  15910. if (sSettings.sFlags.netsettingsChanged)
  15911. 8027408: 4a08 ldr r2, [pc, #32] ; (802742c <GetGatewayStr+0x24>)
  15912. /**
  15913. * @brief Текущий шлюз
  15914. */
  15915. void GetGatewayStr(char *str, uint8_t *len)
  15916. {
  15917. 802740a: b538 push {r3, r4, r5, lr}
  15918. /* Если сейчас временные настройки */
  15919. if (sSettings.sFlags.netsettingsChanged)
  15920. 802740c: f892 32ce ldrb.w r3, [r2, #718] ; 0x2ce
  15921. /**
  15922. * @brief Текущий шлюз
  15923. */
  15924. void GetGatewayStr(char *str, uint8_t *len)
  15925. {
  15926. 8027410: 460c mov r4, r1
  15927. 8027412: 4605 mov r5, r0
  15928. /* Если сейчас временные настройки */
  15929. if (sSettings.sFlags.netsettingsChanged)
  15930. sprintf(str, "%s", sSettings.sWebTempParams.gate);
  15931. 8027414: 4906 ldr r1, [pc, #24] ; (8027430 <GetGatewayStr+0x28>)
  15932. * @brief Текущий шлюз
  15933. */
  15934. void GetGatewayStr(char *str, uint8_t *len)
  15935. {
  15936. /* Если сейчас временные настройки */
  15937. if (sSettings.sFlags.netsettingsChanged)
  15938. 8027416: b10b cbz r3, 802741c <GetGatewayStr+0x14>
  15939. sprintf(str, "%s", sSettings.sWebTempParams.gate);
  15940. 8027418: 323f adds r2, #63 ; 0x3f
  15941. 802741a: e000 b.n 802741e <GetGatewayStr+0x16>
  15942. else
  15943. sprintf(str, "%s", sSettings.sWebParams.gate);
  15944. 802741c: 3211 adds r2, #17
  15945. 802741e: f7ff fedd bl 80271dc <tfp_sprintf>
  15946. *len = strlen(str);
  15947. 8027422: 4628 mov r0, r5
  15948. 8027424: f7fa fba0 bl 8021b68 <strlen>
  15949. 8027428: 7020 strb r0, [r4, #0]
  15950. 802742a: bd38 pop {r3, r4, r5, pc}
  15951. 802742c: 2000e874 .word 0x2000e874
  15952. 8027430: 08033e44 .word 0x08033e44
  15953. 08027434 <GetMaskStr>:
  15954. * @brief Текущая маска подсети
  15955. */
  15956. void GetMaskStr(char *str, uint8_t *len)
  15957. {
  15958. /* Если сейчас временные настройки */
  15959. if (sSettings.sFlags.netsettingsChanged)
  15960. 8027434: 4a08 ldr r2, [pc, #32] ; (8027458 <GetMaskStr+0x24>)
  15961. /**
  15962. * @brief Текущая маска подсети
  15963. */
  15964. void GetMaskStr(char *str, uint8_t *len)
  15965. {
  15966. 8027436: b538 push {r3, r4, r5, lr}
  15967. /* Если сейчас временные настройки */
  15968. if (sSettings.sFlags.netsettingsChanged)
  15969. 8027438: f892 32ce ldrb.w r3, [r2, #718] ; 0x2ce
  15970. /**
  15971. * @brief Текущая маска подсети
  15972. */
  15973. void GetMaskStr(char *str, uint8_t *len)
  15974. {
  15975. 802743c: 460c mov r4, r1
  15976. 802743e: 4605 mov r5, r0
  15977. /* Если сейчас временные настройки */
  15978. if (sSettings.sFlags.netsettingsChanged)
  15979. sprintf(str, "%s", sSettings.sWebTempParams.mask);
  15980. 8027440: 4906 ldr r1, [pc, #24] ; (802745c <GetMaskStr+0x28>)
  15981. * @brief Текущая маска подсети
  15982. */
  15983. void GetMaskStr(char *str, uint8_t *len)
  15984. {
  15985. /* Если сейчас временные настройки */
  15986. if (sSettings.sFlags.netsettingsChanged)
  15987. 8027442: b10b cbz r3, 8027448 <GetMaskStr+0x14>
  15988. sprintf(str, "%s", sSettings.sWebTempParams.mask);
  15989. 8027444: 324e adds r2, #78 ; 0x4e
  15990. 8027446: e000 b.n 802744a <GetMaskStr+0x16>
  15991. else
  15992. sprintf(str, "%s", sSettings.sWebParams.mask);
  15993. 8027448: 3220 adds r2, #32
  15994. 802744a: f7ff fec7 bl 80271dc <tfp_sprintf>
  15995. *len = strlen(str);
  15996. 802744e: 4628 mov r0, r5
  15997. 8027450: f7fa fb8a bl 8021b68 <strlen>
  15998. 8027454: 7020 strb r0, [r4, #0]
  15999. 8027456: bd38 pop {r3, r4, r5, pc}
  16000. 8027458: 2000e874 .word 0x2000e874
  16001. 802745c: 08033e44 .word 0x08033e44
  16002. 08027460 <GetDhcpStateStr>:
  16003. * @brief Настройка DHCP
  16004. */
  16005. void GetDhcpStateStr(char *str, uint8_t *len)
  16006. {
  16007. /* Если сейчас временные настройки */
  16008. if (sSettings.sFlags.netsettingsChanged)
  16009. 8027460: 4b08 ldr r3, [pc, #32] ; (8027484 <GetDhcpStateStr+0x24>)
  16010. 8027462: f893 22ce ldrb.w r2, [r3, #718] ; 0x2ce
  16011. 8027466: b112 cbz r2, 802746e <GetDhcpStateStr+0xe>
  16012. {
  16013. if (sSettings.sWebTempParams.dhcpEnable)
  16014. 8027468: f893 305d ldrb.w r3, [r3, #93] ; 0x5d
  16015. 802746c: e001 b.n 8027472 <GetDhcpStateStr+0x12>
  16016. else
  16017. *str = '0';
  16018. }
  16019. else
  16020. {
  16021. if (sSettings.sWebParams.dhcpEnable)
  16022. 802746e: f893 302f ldrb.w r3, [r3, #47] ; 0x2f
  16023. 8027472: b10b cbz r3, 8027478 <GetDhcpStateStr+0x18>
  16024. *str = '1';
  16025. 8027474: 2331 movs r3, #49 ; 0x31
  16026. 8027476: e000 b.n 802747a <GetDhcpStateStr+0x1a>
  16027. else
  16028. *str = '0';
  16029. 8027478: 2330 movs r3, #48 ; 0x30
  16030. 802747a: 7003 strb r3, [r0, #0]
  16031. }
  16032. *len = 1;
  16033. 802747c: 2301 movs r3, #1
  16034. 802747e: 700b strb r3, [r1, #0]
  16035. 8027480: 4770 bx lr
  16036. 8027482: bf00 nop
  16037. 8027484: 2000e874 .word 0x2000e874
  16038. 08027488 <GetReadCommunity>:
  16039. /**
  16040. * @brief Текущее community для чтения
  16041. */
  16042. void GetReadCommunity(char *str, uint8_t *len)
  16043. {
  16044. 8027488: b538 push {r3, r4, r5, lr}
  16045. sprintf(str, "%s", sSettings.sSnmp.readCommunity);
  16046. 802748a: 4a05 ldr r2, [pc, #20] ; (80274a0 <GetReadCommunity+0x18>)
  16047. /**
  16048. * @brief Текущее community для чтения
  16049. */
  16050. void GetReadCommunity(char *str, uint8_t *len)
  16051. {
  16052. 802748c: 4605 mov r5, r0
  16053. 802748e: 460c mov r4, r1
  16054. sprintf(str, "%s", sSettings.sSnmp.readCommunity);
  16055. 8027490: 4904 ldr r1, [pc, #16] ; (80274a4 <GetReadCommunity+0x1c>)
  16056. 8027492: f7ff fea3 bl 80271dc <tfp_sprintf>
  16057. *len = strlen(str);
  16058. 8027496: 4628 mov r0, r5
  16059. 8027498: f7fa fb66 bl 8021b68 <strlen>
  16060. 802749c: 7020 strb r0, [r4, #0]
  16061. 802749e: bd38 pop {r3, r4, r5, pc}
  16062. 80274a0: 2000e972 .word 0x2000e972
  16063. 80274a4: 08033e44 .word 0x08033e44
  16064. 080274a8 <GetWriteCommunity>:
  16065. /**
  16066. * @brief Текущее community для записи
  16067. */
  16068. void GetWriteCommunity(char *str, uint8_t *len)
  16069. {
  16070. 80274a8: b538 push {r3, r4, r5, lr}
  16071. sprintf(str, "%s", sSettings.sSnmp.writeCommunity);
  16072. 80274aa: 4a05 ldr r2, [pc, #20] ; (80274c0 <GetWriteCommunity+0x18>)
  16073. /**
  16074. * @brief Текущее community для записи
  16075. */
  16076. void GetWriteCommunity(char *str, uint8_t *len)
  16077. {
  16078. 80274ac: 4605 mov r5, r0
  16079. 80274ae: 460c mov r4, r1
  16080. sprintf(str, "%s", sSettings.sSnmp.writeCommunity);
  16081. 80274b0: 4904 ldr r1, [pc, #16] ; (80274c4 <GetWriteCommunity+0x1c>)
  16082. 80274b2: f7ff fe93 bl 80271dc <tfp_sprintf>
  16083. *len = strlen(str);
  16084. 80274b6: 4628 mov r0, r5
  16085. 80274b8: f7fa fb56 bl 8021b68 <strlen>
  16086. 80274bc: 7020 strb r0, [r4, #0]
  16087. 80274be: bd38 pop {r3, r4, r5, pc}
  16088. 80274c0: 2000e986 .word 0x2000e986
  16089. 80274c4: 08033e44 .word 0x08033e44
  16090. 080274c8 <GetManagerIp>:
  16091. /**
  16092. * @brief IP SNMP менеджера
  16093. */
  16094. void GetManagerIp(char *str, uint8_t *len)
  16095. {
  16096. 80274c8: b538 push {r3, r4, r5, lr}
  16097. sprintf(str, "%s", sSettings.sSnmp.managerIP);
  16098. 80274ca: 4a05 ldr r2, [pc, #20] ; (80274e0 <GetManagerIp+0x18>)
  16099. /**
  16100. * @brief IP SNMP менеджера
  16101. */
  16102. void GetManagerIp(char *str, uint8_t *len)
  16103. {
  16104. 80274cc: 4605 mov r5, r0
  16105. 80274ce: 460c mov r4, r1
  16106. sprintf(str, "%s", sSettings.sSnmp.managerIP);
  16107. 80274d0: 4904 ldr r1, [pc, #16] ; (80274e4 <GetManagerIp+0x1c>)
  16108. 80274d2: f7ff fe83 bl 80271dc <tfp_sprintf>
  16109. *len = strlen(str);
  16110. 80274d6: 4628 mov r0, r5
  16111. 80274d8: f7fa fb46 bl 8021b68 <strlen>
  16112. 80274dc: 7020 strb r0, [r4, #0]
  16113. 80274de: bd38 pop {r3, r4, r5, pc}
  16114. 80274e0: 2000ea4e .word 0x2000ea4e
  16115. 80274e4: 08033e44 .word 0x08033e44
  16116. 080274e8 <GetManagerIp2>:
  16117. }
  16118. void GetManagerIp2(char *str, uint8_t *len)
  16119. {
  16120. 80274e8: b538 push {r3, r4, r5, lr}
  16121. sprintf(str, "%s", sSettings.sSnmp.managerIP2);
  16122. 80274ea: 4a05 ldr r2, [pc, #20] ; (8027500 <GetManagerIp2+0x18>)
  16123. sprintf(str, "%s", sSettings.sSnmp.managerIP);
  16124. *len = strlen(str);
  16125. }
  16126. void GetManagerIp2(char *str, uint8_t *len)
  16127. {
  16128. 80274ec: 4605 mov r5, r0
  16129. 80274ee: 460c mov r4, r1
  16130. sprintf(str, "%s", sSettings.sSnmp.managerIP2);
  16131. 80274f0: 4904 ldr r1, [pc, #16] ; (8027504 <GetManagerIp2+0x1c>)
  16132. 80274f2: f7ff fe73 bl 80271dc <tfp_sprintf>
  16133. *len = strlen(str);
  16134. 80274f6: 4628 mov r0, r5
  16135. 80274f8: f7fa fb36 bl 8021b68 <strlen>
  16136. 80274fc: 7020 strb r0, [r4, #0]
  16137. 80274fe: bd38 pop {r3, r4, r5, pc}
  16138. 8027500: 2000ea62 .word 0x2000ea62
  16139. 8027504: 08033e44 .word 0x08033e44
  16140. 08027508 <GetManagerIp3>:
  16141. }
  16142. void GetManagerIp3(char *str, uint8_t *len)
  16143. {
  16144. 8027508: b538 push {r3, r4, r5, lr}
  16145. sprintf(str, "%s", sSettings.sSnmp.managerIP3);
  16146. 802750a: 4a05 ldr r2, [pc, #20] ; (8027520 <GetManagerIp3+0x18>)
  16147. sprintf(str, "%s", sSettings.sSnmp.managerIP2);
  16148. *len = strlen(str);
  16149. }
  16150. void GetManagerIp3(char *str, uint8_t *len)
  16151. {
  16152. 802750c: 4605 mov r5, r0
  16153. 802750e: 460c mov r4, r1
  16154. sprintf(str, "%s", sSettings.sSnmp.managerIP3);
  16155. 8027510: 4904 ldr r1, [pc, #16] ; (8027524 <GetManagerIp3+0x1c>)
  16156. 8027512: f7ff fe63 bl 80271dc <tfp_sprintf>
  16157. *len = strlen(str);
  16158. 8027516: 4628 mov r0, r5
  16159. 8027518: f7fa fb26 bl 8021b68 <strlen>
  16160. 802751c: 7020 strb r0, [r4, #0]
  16161. 802751e: bd38 pop {r3, r4, r5, pc}
  16162. 8027520: 2000ea76 .word 0x2000ea76
  16163. 8027524: 08033e44 .word 0x08033e44
  16164. 08027528 <GetRestore>:
  16165. /**
  16166. * @brief Произошел сброс настроек
  16167. */
  16168. void GetRestore(char *str, uint8_t *len) // +
  16169. {
  16170. 8027528: b510 push {r4, lr}
  16171. sprintf(str, "%s", "1");
  16172. 802752a: 4a04 ldr r2, [pc, #16] ; (802753c <GetRestore+0x14>)
  16173. /**
  16174. * @brief Произошел сброс настроек
  16175. */
  16176. void GetRestore(char *str, uint8_t *len) // +
  16177. {
  16178. 802752c: 460c mov r4, r1
  16179. sprintf(str, "%s", "1");
  16180. 802752e: 4904 ldr r1, [pc, #16] ; (8027540 <GetRestore+0x18>)
  16181. 8027530: f7ff fe54 bl 80271dc <tfp_sprintf>
  16182. *len = 1;
  16183. 8027534: 2301 movs r3, #1
  16184. 8027536: 7023 strb r3, [r4, #0]
  16185. 8027538: bd10 pop {r4, pc}
  16186. 802753a: bf00 nop
  16187. 802753c: 08033e6b .word 0x08033e6b
  16188. 8027540: 08033e44 .word 0x08033e44
  16189. 08027544 <GetReboot>:
  16190. /**
  16191. * @brief Произошла перезагрузка
  16192. */
  16193. void GetReboot(char *str, uint8_t *len) // +
  16194. {
  16195. 8027544: b510 push {r4, lr}
  16196. sprintf(str, "%s", "1");
  16197. 8027546: 4a04 ldr r2, [pc, #16] ; (8027558 <GetReboot+0x14>)
  16198. /**
  16199. * @brief Произошла перезагрузка
  16200. */
  16201. void GetReboot(char *str, uint8_t *len) // +
  16202. {
  16203. 8027548: 460c mov r4, r1
  16204. sprintf(str, "%s", "1");
  16205. 802754a: 4904 ldr r1, [pc, #16] ; (802755c <GetReboot+0x18>)
  16206. 802754c: f7ff fe46 bl 80271dc <tfp_sprintf>
  16207. *len = 1;
  16208. 8027550: 2301 movs r3, #1
  16209. 8027552: 7023 strb r3, [r4, #0]
  16210. 8027554: bd10 pop {r4, pc}
  16211. 8027556: bf00 nop
  16212. 8027558: 08033e6b .word 0x08033e6b
  16213. 802755c: 08033e44 .word 0x08033e44
  16214. 08027560 <GetWebReinitFlag>:
  16215. /**
  16216. * @brief Вернуть признак изменения сетевых параметров
  16217. */
  16218. void GetWebReinitFlag(char *str, uint8_t *len)
  16219. {
  16220. 8027560: b538 push {r3, r4, r5, lr}
  16221. if (sSettings.sFlags.netsettingsChanged)
  16222. 8027562: 4b08 ldr r3, [pc, #32] ; (8027584 <GetWebReinitFlag+0x24>)
  16223. 8027564: f893 32ce ldrb.w r3, [r3, #718] ; 0x2ce
  16224. /**
  16225. * @brief Вернуть признак изменения сетевых параметров
  16226. */
  16227. void GetWebReinitFlag(char *str, uint8_t *len)
  16228. {
  16229. 8027568: 460c mov r4, r1
  16230. 802756a: 4605 mov r5, r0
  16231. if (sSettings.sFlags.netsettingsChanged)
  16232. {
  16233. sprintf(str, "%s", "true");
  16234. 802756c: 4906 ldr r1, [pc, #24] ; (8027588 <GetWebReinitFlag+0x28>)
  16235. /**
  16236. * @brief Вернуть признак изменения сетевых параметров
  16237. */
  16238. void GetWebReinitFlag(char *str, uint8_t *len)
  16239. {
  16240. if (sSettings.sFlags.netsettingsChanged)
  16241. 802756e: b10b cbz r3, 8027574 <GetWebReinitFlag+0x14>
  16242. {
  16243. sprintf(str, "%s", "true");
  16244. 8027570: 4a06 ldr r2, [pc, #24] ; (802758c <GetWebReinitFlag+0x2c>)
  16245. 8027572: e000 b.n 8027576 <GetWebReinitFlag+0x16>
  16246. *len = strlen(str);
  16247. }
  16248. else
  16249. {
  16250. sprintf(str, "%s", "false");
  16251. 8027574: 4a06 ldr r2, [pc, #24] ; (8027590 <GetWebReinitFlag+0x30>)
  16252. 8027576: f7ff fe31 bl 80271dc <tfp_sprintf>
  16253. *len = strlen(str);
  16254. 802757a: 4628 mov r0, r5
  16255. 802757c: f7fa faf4 bl 8021b68 <strlen>
  16256. 8027580: 7020 strb r0, [r4, #0]
  16257. 8027582: bd38 pop {r3, r4, r5, pc}
  16258. 8027584: 2000e874 .word 0x2000e874
  16259. 8027588: 08033e44 .word 0x08033e44
  16260. 802758c: 08033e47 .word 0x08033e47
  16261. 8027590: 08033e4c .word 0x08033e4c
  16262. 08027594 <SetLoadMode>:
  16263. /**
  16264. * @brief Установить признак обновления ПО.
  16265. */
  16266. void SetLoadMode(void)
  16267. {
  16268. sSettings.bootParams.loadMode = 1;
  16269. 8027594: 4b01 ldr r3, [pc, #4] ; (802759c <SetLoadMode+0x8>)
  16270. 8027596: 2201 movs r2, #1
  16271. 8027598: 701a strb r2, [r3, #0]
  16272. 802759a: 4770 bx lr
  16273. 802759c: 2000e874 .word 0x2000e874
  16274. 080275a0 <SetWebReinitFlag>:
  16275. /**
  16276. * @brief Установить признак изменения сетевых параметров
  16277. */
  16278. void SetWebReinitFlag(bool value)
  16279. {
  16280. sSettings.sFlags.netsettingsChanged = value;
  16281. 80275a0: 4b01 ldr r3, [pc, #4] ; (80275a8 <SetWebReinitFlag+0x8>)
  16282. 80275a2: f883 02ce strb.w r0, [r3, #718] ; 0x2ce
  16283. 80275a6: 4770 bx lr
  16284. 80275a8: 2000e874 .word 0x2000e874
  16285. 080275ac <SetConfirmWebParamsFlag>:
  16286. /**
  16287. * @brief Установить флаг подтверждения сетевых настроек пользователем
  16288. */
  16289. void SetConfirmWebParamsFlag(void)
  16290. {
  16291. fConfirmWebParams = true;
  16292. 80275ac: 4b01 ldr r3, [pc, #4] ; (80275b4 <SetConfirmWebParamsFlag+0x8>)
  16293. 80275ae: 2201 movs r2, #1
  16294. 80275b0: 701a strb r2, [r3, #0]
  16295. 80275b2: 4770 bx lr
  16296. 80275b4: 200028a0 .word 0x200028a0
  16297. 080275b8 <SetIPStr>:
  16298. // Сетевые параметры
  16299. /**
  16300. * @brief IP адрес
  16301. */
  16302. void SetIPStr(char *str)
  16303. {
  16304. 80275b8: 4601 mov r1, r0
  16305. //strcpy(sSettings.sWebParams.ip, str);
  16306. strcpy(sSettings.sWebTempParams.ip, str);
  16307. 80275ba: 4801 ldr r0, [pc, #4] ; (80275c0 <SetIPStr+0x8>)
  16308. 80275bc: f7fa ba76 b.w 8021aac <strcpy>
  16309. 80275c0: 2000e8a4 .word 0x2000e8a4
  16310. 080275c4 <SetGatewayStr>:
  16311. /**
  16312. * @brief Шлюз
  16313. */
  16314. void SetGatewayStr(char *str)
  16315. {
  16316. 80275c4: 4601 mov r1, r0
  16317. //strcpy(sSettings.sWebParams.gate, str);
  16318. strcpy(sSettings.sWebTempParams.gate, str);
  16319. 80275c6: 4801 ldr r0, [pc, #4] ; (80275cc <SetGatewayStr+0x8>)
  16320. 80275c8: f7fa ba70 b.w 8021aac <strcpy>
  16321. 80275cc: 2000e8b3 .word 0x2000e8b3
  16322. 080275d0 <SetMaskStr>:
  16323. /**
  16324. * @brief Текущая маска подсети
  16325. */
  16326. void SetMaskStr(char *str)
  16327. {
  16328. 80275d0: 4601 mov r1, r0
  16329. //strcpy(sSettings.sWebParams.mask, str);
  16330. strcpy(sSettings.sWebTempParams.mask, str);
  16331. 80275d2: 4801 ldr r0, [pc, #4] ; (80275d8 <SetMaskStr+0x8>)
  16332. 80275d4: f7fa ba6a b.w 8021aac <strcpy>
  16333. 80275d8: 2000e8c2 .word 0x2000e8c2
  16334. 080275dc <SetDhcpStateStr>:
  16335. /**
  16336. * @brief Настройка DHCP
  16337. */
  16338. void SetDhcpStateStr(char *str)
  16339. {
  16340. 80275dc: b508 push {r3, lr}
  16341. if (strncmp(str, "on", 2) == 0)
  16342. 80275de: 4906 ldr r1, [pc, #24] ; (80275f8 <SetDhcpStateStr+0x1c>)
  16343. 80275e0: 2202 movs r2, #2
  16344. 80275e2: f7fa fb23 bl 8021c2c <strncmp>
  16345. 80275e6: 4b05 ldr r3, [pc, #20] ; (80275fc <SetDhcpStateStr+0x20>)
  16346. 80275e8: b908 cbnz r0, 80275ee <SetDhcpStateStr+0x12>
  16347. //sSettings.sWebParams.dhcpEnable = 1;
  16348. sSettings.sWebTempParams.dhcpEnable = 1;
  16349. 80275ea: 2201 movs r2, #1
  16350. 80275ec: e000 b.n 80275f0 <SetDhcpStateStr+0x14>
  16351. else
  16352. //sSettings.sWebParams.dhcpEnable = 0;
  16353. sSettings.sWebTempParams.dhcpEnable = 0;
  16354. 80275ee: 2200 movs r2, #0
  16355. 80275f0: f883 205d strb.w r2, [r3, #93] ; 0x5d
  16356. 80275f4: bd08 pop {r3, pc}
  16357. 80275f6: bf00 nop
  16358. 80275f8: 08033e52 .word 0x08033e52
  16359. 80275fc: 2000e874 .word 0x2000e874
  16360. 08027600 <SetReadCommunity>:
  16361. /**
  16362. * @brief Community для чтения
  16363. */
  16364. void SetReadCommunity(char *str)
  16365. {
  16366. 8027600: 4601 mov r1, r0
  16367. strcpy(sSettings.sSnmp.readCommunity, str);
  16368. 8027602: 4801 ldr r0, [pc, #4] ; (8027608 <SetReadCommunity+0x8>)
  16369. 8027604: f7fa ba52 b.w 8021aac <strcpy>
  16370. 8027608: 2000e972 .word 0x2000e972
  16371. 0802760c <SetWriteCommunity>:
  16372. /**
  16373. * @brief Community для записи
  16374. */
  16375. void SetWriteCommunity(char *str)
  16376. {
  16377. 802760c: 4601 mov r1, r0
  16378. strcpy(sSettings.sSnmp.writeCommunity, str);
  16379. 802760e: 4801 ldr r0, [pc, #4] ; (8027614 <SetWriteCommunity+0x8>)
  16380. 8027610: f7fa ba4c b.w 8021aac <strcpy>
  16381. 8027614: 2000e986 .word 0x2000e986
  16382. 08027618 <SetManagerIp>:
  16383. /**
  16384. * @brief IP SNMP менеджера
  16385. */
  16386. void SetManagerIp(char *str)
  16387. {
  16388. 8027618: b510 push {r4, lr}
  16389. strcpy(sSettings.sSnmp.managerIP, str);
  16390. 802761a: 4c05 ldr r4, [pc, #20] ; (8027630 <SetManagerIp+0x18>)
  16391. /**
  16392. * @brief IP SNMP менеджера
  16393. */
  16394. void SetManagerIp(char *str)
  16395. {
  16396. 802761c: 4601 mov r1, r0
  16397. strcpy(sSettings.sSnmp.managerIP, str);
  16398. 802761e: 4620 mov r0, r4
  16399. 8027620: f7fa fa44 bl 8021aac <strcpy>
  16400. SNMP_SetManagerIP(sSettings.sSnmp.managerIP);
  16401. 8027624: 4620 mov r0, r4
  16402. }
  16403. 8027626: e8bd 4010 ldmia.w sp!, {r4, lr}
  16404. * @brief IP SNMP менеджера
  16405. */
  16406. void SetManagerIp(char *str)
  16407. {
  16408. strcpy(sSettings.sSnmp.managerIP, str);
  16409. SNMP_SetManagerIP(sSettings.sSnmp.managerIP);
  16410. 802762a: f00b bd7d b.w 8033128 <SNMP_SetManagerIP>
  16411. 802762e: bf00 nop
  16412. 8027630: 2000ea4e .word 0x2000ea4e
  16413. 08027634 <SetManagerIp2>:
  16414. }
  16415. void SetManagerIp2(char *str)
  16416. {
  16417. 8027634: b510 push {r4, lr}
  16418. strcpy(sSettings.sSnmp.managerIP2, str);
  16419. 8027636: 4c05 ldr r4, [pc, #20] ; (802764c <SetManagerIp2+0x18>)
  16420. strcpy(sSettings.sSnmp.managerIP, str);
  16421. SNMP_SetManagerIP(sSettings.sSnmp.managerIP);
  16422. }
  16423. void SetManagerIp2(char *str)
  16424. {
  16425. 8027638: 4601 mov r1, r0
  16426. strcpy(sSettings.sSnmp.managerIP2, str);
  16427. 802763a: 4620 mov r0, r4
  16428. 802763c: f7fa fa36 bl 8021aac <strcpy>
  16429. SNMP_SetManagerIP(sSettings.sSnmp.managerIP2);
  16430. 8027640: 4620 mov r0, r4
  16431. }
  16432. 8027642: e8bd 4010 ldmia.w sp!, {r4, lr}
  16433. }
  16434. void SetManagerIp2(char *str)
  16435. {
  16436. strcpy(sSettings.sSnmp.managerIP2, str);
  16437. SNMP_SetManagerIP(sSettings.sSnmp.managerIP2);
  16438. 8027646: f00b bd6f b.w 8033128 <SNMP_SetManagerIP>
  16439. 802764a: bf00 nop
  16440. 802764c: 2000ea62 .word 0x2000ea62
  16441. 08027650 <SetManagerIp3>:
  16442. }
  16443. void SetManagerIp3(char *str)
  16444. {
  16445. 8027650: b510 push {r4, lr}
  16446. strcpy(sSettings.sSnmp.managerIP3, str);
  16447. 8027652: 4c05 ldr r4, [pc, #20] ; (8027668 <SetManagerIp3+0x18>)
  16448. strcpy(sSettings.sSnmp.managerIP2, str);
  16449. SNMP_SetManagerIP(sSettings.sSnmp.managerIP2);
  16450. }
  16451. void SetManagerIp3(char *str)
  16452. {
  16453. 8027654: 4601 mov r1, r0
  16454. strcpy(sSettings.sSnmp.managerIP3, str);
  16455. 8027656: 4620 mov r0, r4
  16456. 8027658: f7fa fa28 bl 8021aac <strcpy>
  16457. SNMP_SetManagerIP(sSettings.sSnmp.managerIP3);
  16458. 802765c: 4620 mov r0, r4
  16459. }
  16460. 802765e: e8bd 4010 ldmia.w sp!, {r4, lr}
  16461. }
  16462. void SetManagerIp3(char *str)
  16463. {
  16464. strcpy(sSettings.sSnmp.managerIP3, str);
  16465. SNMP_SetManagerIP(sSettings.sSnmp.managerIP3);
  16466. 8027662: f00b bd61 b.w 8033128 <SNMP_SetManagerIP>
  16467. 8027666: bf00 nop
  16468. 8027668: 2000ea76 .word 0x2000ea76
  16469. 0802766c <SetOwner>:
  16470. /**
  16471. * @brief Установить владельца
  16472. */
  16473. void SetOwner(char *str)
  16474. {
  16475. 802766c: b510 push {r4, lr}
  16476. strcpy(sSettings.sSnmp.sysContact, str);
  16477. 802766e: 4c06 ldr r4, [pc, #24] ; (8027688 <SetOwner+0x1c>)
  16478. /**
  16479. * @brief Установить владельца
  16480. */
  16481. void SetOwner(char *str)
  16482. {
  16483. 8027670: 4601 mov r1, r0
  16484. strcpy(sSettings.sSnmp.sysContact, str);
  16485. 8027672: 4620 mov r0, r4
  16486. 8027674: f7fa fa1a bl 8021aac <strcpy>
  16487. SNMP_SetSysContact(sSettings.sSnmp.sysContact);
  16488. 8027678: 4620 mov r0, r4
  16489. 802767a: f00b fd39 bl 80330f0 <SNMP_SetSysContact>
  16490. SNMP_SetObjDescr();
  16491. }
  16492. 802767e: e8bd 4010 ldmia.w sp!, {r4, lr}
  16493. */
  16494. void SetOwner(char *str)
  16495. {
  16496. strcpy(sSettings.sSnmp.sysContact, str);
  16497. SNMP_SetSysContact(sSettings.sSnmp.sysContact);
  16498. SNMP_SetObjDescr();
  16499. 8027682: f00b bd01 b.w 8033088 <SNMP_SetObjDescr>
  16500. 8027686: bf00 nop
  16501. 8027688: 2000e99a .word 0x2000e99a
  16502. 0802768c <SetLocation>:
  16503. /**
  16504. * @brief Установить местоположение
  16505. */
  16506. void SetLocation(char *str)
  16507. {
  16508. 802768c: b510 push {r4, lr}
  16509. strcpy(sSettings.sSnmp.sysLocation, str);
  16510. 802768e: 4c05 ldr r4, [pc, #20] ; (80276a4 <SetLocation+0x18>)
  16511. /**
  16512. * @brief Установить местоположение
  16513. */
  16514. void SetLocation(char *str)
  16515. {
  16516. 8027690: 4601 mov r1, r0
  16517. strcpy(sSettings.sSnmp.sysLocation, str);
  16518. 8027692: 4620 mov r0, r4
  16519. 8027694: f7fa fa0a bl 8021aac <strcpy>
  16520. SNMP_SetSysLocation(sSettings.sSnmp.sysLocation);
  16521. 8027698: 4620 mov r0, r4
  16522. }
  16523. 802769a: e8bd 4010 ldmia.w sp!, {r4, lr}
  16524. * @brief Установить местоположение
  16525. */
  16526. void SetLocation(char *str)
  16527. {
  16528. strcpy(sSettings.sSnmp.sysLocation, str);
  16529. SNMP_SetSysLocation(sSettings.sSnmp.sysLocation);
  16530. 802769e: f00b bd35 b.w 803310c <SNMP_SetSysLocation>
  16531. 80276a2: bf00 nop
  16532. 80276a4: 2000e9e0 .word 0x2000e9e0
  16533. 080276a8 <SetComment>:
  16534. /**
  16535. * @brief Установить комментарий
  16536. */
  16537. void SetComment(char *str)
  16538. {
  16539. 80276a8: 4601 mov r1, r0
  16540. strcpy(sSettings.sInfo.comments, str);
  16541. 80276aa: 4801 ldr r0, [pc, #4] ; (80276b0 <SetComment+0x8>)
  16542. 80276ac: f7fa b9fe b.w 8021aac <strcpy>
  16543. 80276b0: 2000ead4 .word 0x2000ead4
  16544. 080276b4 <SETTINGS_SetBootParamsDef>:
  16545. /**
  16546. * @brief Установить параметры обновления ПО по умолчанию
  16547. */
  16548. void SETTINGS_SetBootParamsDef(void)
  16549. {
  16550. sSettings.bootParams.loadMode = 1;
  16551. 80276b4: 4b02 ldr r3, [pc, #8] ; (80276c0 <SETTINGS_SetBootParamsDef+0xc>)
  16552. 80276b6: 2201 movs r2, #1
  16553. 80276b8: 701a strb r2, [r3, #0]
  16554. sSettings.bootParams.bootTry = 0;
  16555. 80276ba: 2200 movs r2, #0
  16556. 80276bc: 705a strb r2, [r3, #1]
  16557. 80276be: 4770 bx lr
  16558. 80276c0: 2000e874 .word 0x2000e874
  16559. 080276c4 <SETTINGS_SetWebParamsDef>:
  16560. /**
  16561. * @brief Установить параметры сетевого подключения по умолчанию
  16562. */
  16563. void SETTINGS_SetWebParamsDef(void)
  16564. {
  16565. 80276c4: b510 push {r4, lr}
  16566. strcpy(sSettings.sWebParams.ip, "192.168.1.2");
  16567. 80276c6: 4c09 ldr r4, [pc, #36] ; (80276ec <SETTINGS_SetWebParamsDef+0x28>)
  16568. 80276c8: 4909 ldr r1, [pc, #36] ; (80276f0 <SETTINGS_SetWebParamsDef+0x2c>)
  16569. 80276ca: 4620 mov r0, r4
  16570. 80276cc: f7fa f9ee bl 8021aac <strcpy>
  16571. strcpy(sSettings.sWebParams.gate, "192.168.1.1");
  16572. 80276d0: 4908 ldr r1, [pc, #32] ; (80276f4 <SETTINGS_SetWebParamsDef+0x30>)
  16573. 80276d2: f104 000f add.w r0, r4, #15
  16574. 80276d6: f7fa f9e9 bl 8021aac <strcpy>
  16575. strcpy(sSettings.sWebParams.mask, "255.255.255.0");
  16576. 80276da: f104 001e add.w r0, r4, #30
  16577. 80276de: 4906 ldr r1, [pc, #24] ; (80276f8 <SETTINGS_SetWebParamsDef+0x34>)
  16578. 80276e0: f7fa f9e4 bl 8021aac <strcpy>
  16579. sSettings.sWebParams.dhcpEnable = 1;
  16580. 80276e4: 2201 movs r2, #1
  16581. 80276e6: f884 202d strb.w r2, [r4, #45] ; 0x2d
  16582. 80276ea: bd10 pop {r4, pc}
  16583. 80276ec: 2000e876 .word 0x2000e876
  16584. 80276f0: 08033e55 .word 0x08033e55
  16585. 80276f4: 08033e61 .word 0x08033e61
  16586. 80276f8: 08033e6d .word 0x08033e6d
  16587. 080276fc <SETTINGS_SetTempWebParamsDef>:
  16588. /**
  16589. * @brief Установить временные параметры сетевого подключения по умолчанию
  16590. */
  16591. void SETTINGS_SetTempWebParamsDef(void)
  16592. {
  16593. 80276fc: b510 push {r4, lr}
  16594. strcpy(sSettings.sWebParams.ip, "192.168.1.2");
  16595. 80276fe: 4c09 ldr r4, [pc, #36] ; (8027724 <SETTINGS_SetTempWebParamsDef+0x28>)
  16596. 8027700: 4909 ldr r1, [pc, #36] ; (8027728 <SETTINGS_SetTempWebParamsDef+0x2c>)
  16597. 8027702: 4620 mov r0, r4
  16598. 8027704: f7fa f9d2 bl 8021aac <strcpy>
  16599. strcpy(sSettings.sWebParams.gate, "192.168.1.1");
  16600. 8027708: 4908 ldr r1, [pc, #32] ; (802772c <SETTINGS_SetTempWebParamsDef+0x30>)
  16601. 802770a: f104 000f add.w r0, r4, #15
  16602. 802770e: f7fa f9cd bl 8021aac <strcpy>
  16603. strcpy(sSettings.sWebParams.mask, "255.255.255.0");
  16604. 8027712: f104 001e add.w r0, r4, #30
  16605. 8027716: 4906 ldr r1, [pc, #24] ; (8027730 <SETTINGS_SetTempWebParamsDef+0x34>)
  16606. 8027718: f7fa f9c8 bl 8021aac <strcpy>
  16607. sSettings.sWebParams.dhcpEnable = 1;
  16608. 802771c: 2201 movs r2, #1
  16609. 802771e: f884 202d strb.w r2, [r4, #45] ; 0x2d
  16610. 8027722: bd10 pop {r4, pc}
  16611. 8027724: 2000e876 .word 0x2000e876
  16612. 8027728: 08033e55 .word 0x08033e55
  16613. 802772c: 08033e61 .word 0x08033e61
  16614. 8027730: 08033e6d .word 0x08033e6d
  16615. 08027734 <SETTINGS_SetSnmpDef>:
  16616. /**
  16617. * @brief Установить параметры SNMP по умолчанию
  16618. */
  16619. void SETTINGS_SetSnmpDef(void)
  16620. {
  16621. 8027734: b570 push {r4, r5, r6, lr}
  16622. strcpy(sSettings.sSnmp.sysDescr, "");
  16623. 8027736: 4c19 ldr r4, [pc, #100] ; (802779c <SETTINGS_SetSnmpDef+0x68>)
  16624. 8027738: 4d19 ldr r5, [pc, #100] ; (80277a0 <SETTINGS_SetSnmpDef+0x6c>)
  16625. strcpy(sSettings.sSnmp.readCommunity, "public");
  16626. 802773a: 4e1a ldr r6, [pc, #104] ; (80277a4 <SETTINGS_SetSnmpDef+0x70>)
  16627. /**
  16628. * @brief Установить параметры SNMP по умолчанию
  16629. */
  16630. void SETTINGS_SetSnmpDef(void)
  16631. {
  16632. strcpy(sSettings.sSnmp.sysDescr, "");
  16633. 802773c: 4629 mov r1, r5
  16634. 802773e: 4620 mov r0, r4
  16635. 8027740: f7fa f9b4 bl 8021aac <strcpy>
  16636. strcpy(sSettings.sSnmp.readCommunity, "public");
  16637. 8027744: 4631 mov r1, r6
  16638. 8027746: f104 00a0 add.w r0, r4, #160 ; 0xa0
  16639. 802774a: f7fa f9af bl 8021aac <strcpy>
  16640. strcpy(sSettings.sSnmp.writeCommunity, "public");
  16641. 802774e: 4631 mov r1, r6
  16642. 8027750: f104 00b4 add.w r0, r4, #180 ; 0xb4
  16643. 8027754: f7fa f9aa bl 8021aac <strcpy>
  16644. strcpy(sSettings.sSnmp.sysContact, "");
  16645. 8027758: 4629 mov r1, r5
  16646. 802775a: f104 00c8 add.w r0, r4, #200 ; 0xc8
  16647. 802775e: f7fa f9a5 bl 8021aac <strcpy>
  16648. strcpy(sSettings.sSnmp.sysName, "BT-6701");
  16649. 8027762: f104 00fa add.w r0, r4, #250 ; 0xfa
  16650. 8027766: 4910 ldr r1, [pc, #64] ; (80277a8 <SETTINGS_SetSnmpDef+0x74>)
  16651. 8027768: f7fa f9a0 bl 8021aac <strcpy>
  16652. strcpy(sSettings.sSnmp.sysLocation, "");
  16653. 802776c: 4629 mov r1, r5
  16654. strcpy(sSettings.sSnmp.managerIP, "0.0.0.0");
  16655. 802776e: 4d0f ldr r5, [pc, #60] ; (80277ac <SETTINGS_SetSnmpDef+0x78>)
  16656. strcpy(sSettings.sSnmp.sysDescr, "");
  16657. strcpy(sSettings.sSnmp.readCommunity, "public");
  16658. strcpy(sSettings.sSnmp.writeCommunity, "public");
  16659. strcpy(sSettings.sSnmp.sysContact, "");
  16660. strcpy(sSettings.sSnmp.sysName, "BT-6701");
  16661. strcpy(sSettings.sSnmp.sysLocation, "");
  16662. 8027770: f504 7087 add.w r0, r4, #270 ; 0x10e
  16663. 8027774: f7fa f99a bl 8021aac <strcpy>
  16664. strcpy(sSettings.sSnmp.managerIP, "0.0.0.0");
  16665. 8027778: 4629 mov r1, r5
  16666. 802777a: f504 70be add.w r0, r4, #380 ; 0x17c
  16667. 802777e: f7fa f995 bl 8021aac <strcpy>
  16668. strcpy(sSettings.sSnmp.managerIP2, "0.0.0.0");
  16669. 8027782: 4629 mov r1, r5
  16670. 8027784: f504 70c8 add.w r0, r4, #400 ; 0x190
  16671. 8027788: f7fa f990 bl 8021aac <strcpy>
  16672. strcpy(sSettings.sSnmp.managerIP3, "0.0.0.0");
  16673. 802778c: f504 70d2 add.w r0, r4, #420 ; 0x1a4
  16674. 8027790: 4629 mov r1, r5
  16675. }
  16676. 8027792: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  16677. strcpy(sSettings.sSnmp.sysContact, "");
  16678. strcpy(sSettings.sSnmp.sysName, "BT-6701");
  16679. strcpy(sSettings.sSnmp.sysLocation, "");
  16680. strcpy(sSettings.sSnmp.managerIP, "0.0.0.0");
  16681. strcpy(sSettings.sSnmp.managerIP2, "0.0.0.0");
  16682. strcpy(sSettings.sSnmp.managerIP3, "0.0.0.0");
  16683. 8027796: f7fa b989 b.w 8021aac <strcpy>
  16684. 802779a: bf00 nop
  16685. 802779c: 2000e8d2 .word 0x2000e8d2
  16686. 80277a0: 0803a997 .word 0x0803a997
  16687. 80277a4: 08033e7b .word 0x08033e7b
  16688. 80277a8: 08033e82 .word 0x08033e82
  16689. 80277ac: 08033e8a .word 0x08033e8a
  16690. 080277b0 <SETTINGS_SetInfoDef>:
  16691. /**
  16692. * @brief Установить Информацию об устройстве по умолчанию
  16693. */
  16694. void SETTINGS_SetInfoDef(void)
  16695. {
  16696. 80277b0: b510 push {r4, lr}
  16697. strcpy(sSettings.sInfo.productionData, "08.07.2016");
  16698. 80277b2: 4c0b ldr r4, [pc, #44] ; (80277e0 <SETTINGS_SetInfoDef+0x30>)
  16699. 80277b4: 490b ldr r1, [pc, #44] ; (80277e4 <SETTINGS_SetInfoDef+0x34>)
  16700. 80277b6: 4620 mov r0, r4
  16701. 80277b8: f7fa f978 bl 8021aac <strcpy>
  16702. //strcpy(sSettings.sInfo.mac, "EC-4C-4D-00-90-01");
  16703. strcpy(sSettings.sInfo.mac, "EC-4C-4D-00-00-0A");
  16704. 80277bc: f104 0028 add.w r0, r4, #40 ; 0x28
  16705. 80277c0: 4909 ldr r1, [pc, #36] ; (80277e8 <SETTINGS_SetInfoDef+0x38>)
  16706. 80277c2: f7fa f973 bl 8021aac <strcpy>
  16707. strcpy(sSettings.sInfo.serialNumber, "KN-03-00001");
  16708. 80277c6: f104 003a add.w r0, r4, #58 ; 0x3a
  16709. 80277ca: 4908 ldr r1, [pc, #32] ; (80277ec <SETTINGS_SetInfoDef+0x3c>)
  16710. 80277cc: f7fa f96e bl 8021aac <strcpy>
  16711. strcpy(sSettings.sInfo.comments, "");
  16712. 80277d0: 4907 ldr r1, [pc, #28] ; (80277f0 <SETTINGS_SetInfoDef+0x40>)
  16713. 80277d2: f104 004a add.w r0, r4, #74 ; 0x4a
  16714. }
  16715. 80277d6: e8bd 4010 ldmia.w sp!, {r4, lr}
  16716. {
  16717. strcpy(sSettings.sInfo.productionData, "08.07.2016");
  16718. //strcpy(sSettings.sInfo.mac, "EC-4C-4D-00-90-01");
  16719. strcpy(sSettings.sInfo.mac, "EC-4C-4D-00-00-0A");
  16720. strcpy(sSettings.sInfo.serialNumber, "KN-03-00001");
  16721. strcpy(sSettings.sInfo.comments, "");
  16722. 80277da: f7fa b967 b.w 8021aac <strcpy>
  16723. 80277de: bf00 nop
  16724. 80277e0: 2000ea8a .word 0x2000ea8a
  16725. 80277e4: 08033e92 .word 0x08033e92
  16726. 80277e8: 08033e9d .word 0x08033e9d
  16727. 80277ec: 08033eaf .word 0x08033eaf
  16728. 80277f0: 0803a997 .word 0x0803a997
  16729. 080277f4 <SETTINGS_ReadFromFlash>:
  16730. */
  16731. void SETTINGS_ReadFromFlash(uint8_t *data, uint32_t size)
  16732. {
  16733. uint32_t baseAddress = SETTINGS_SECTOR;
  16734. for (uint32_t i = 0; i < size; i++)
  16735. 80277f4: 2300 movs r3, #0
  16736. 80277f6: e006 b.n 8027806 <SETTINGS_ReadFromFlash+0x12>
  16737. *data++ = (*(uint32_t*)baseAddress++);;
  16738. 80277f8: f103 6200 add.w r2, r3, #134217728 ; 0x8000000
  16739. 80277fc: f502 4280 add.w r2, r2, #16384 ; 0x4000
  16740. 8027800: 6812 ldr r2, [r2, #0]
  16741. 8027802: 54c2 strb r2, [r0, r3]
  16742. */
  16743. void SETTINGS_ReadFromFlash(uint8_t *data, uint32_t size)
  16744. {
  16745. uint32_t baseAddress = SETTINGS_SECTOR;
  16746. for (uint32_t i = 0; i < size; i++)
  16747. 8027804: 3301 adds r3, #1
  16748. 8027806: 428b cmp r3, r1
  16749. 8027808: d1f6 bne.n 80277f8 <SETTINGS_ReadFromFlash+0x4>
  16750. *data++ = (*(uint32_t*)baseAddress++);;
  16751. }
  16752. 802780a: 4770 bx lr
  16753. 0802780c <SETTINGS_EraseFlashSector>:
  16754. */
  16755. void SETTINGS_EraseFlashSector(void)
  16756. {
  16757. FLASH_Status status;
  16758. if ((status = FLASH_EraseSector(FLASH_Sector_1, VoltageRange_3)) != FLASH_COMPLETE) {
  16759. 802780c: 2008 movs r0, #8
  16760. 802780e: 2102 movs r1, #2
  16761. 8027810: f7fd bd08 b.w 8025224 <FLASH_EraseSector>
  16762. 08027814 <SETTINGS_GetCRC>:
  16763. /**
  16764. * @brief
  16765. * @retval
  16766. */
  16767. uint32_t SETTINGS_GetCRC(void)
  16768. {
  16769. 8027814: b508 push {r3, lr}
  16770. CRC_ResetDR();
  16771. 8027816: f7fd fc6f bl 80250f8 <CRC_ResetDR>
  16772. return CRC_CalcBlockCRC((uint32_t*)&sSettings, sizeof(sSettings)/4);
  16773. 802781a: 4803 ldr r0, [pc, #12] ; (8027828 <SETTINGS_GetCRC+0x14>)
  16774. 802781c: 21b9 movs r1, #185 ; 0xb9
  16775. }
  16776. 802781e: e8bd 4008 ldmia.w sp!, {r3, lr}
  16777. * @retval
  16778. */
  16779. uint32_t SETTINGS_GetCRC(void)
  16780. {
  16781. CRC_ResetDR();
  16782. return CRC_CalcBlockCRC((uint32_t*)&sSettings, sizeof(sSettings)/4);
  16783. 8027822: f7fd bc6f b.w 8025104 <CRC_CalcBlockCRC>
  16784. 8027826: bf00 nop
  16785. 8027828: 2000e874 .word 0x2000e874
  16786. 0802782c <SETTINGS_WriteToFlash>:
  16787. /**
  16788. * @brief
  16789. */
  16790. void SETTINGS_WriteToFlash(uint8_t *data, uint32_t size)
  16791. {
  16792. 802782c: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  16793. 8027830: 4606 mov r6, r0
  16794. 8027832: 468a mov sl, r1
  16795. uint32_t baseAddress = SETTINGS_SECTOR;
  16796. uint32_t checkCrc = 0;
  16797. uint32_t crc = SETTINGS_GetCRC();
  16798. 8027834: f7ff ffee bl 8027814 <SETTINGS_GetCRC>
  16799. /**
  16800. * @brief
  16801. */
  16802. void SETTINGS_WriteToFlash(uint8_t *data, uint32_t size)
  16803. {
  16804. uint32_t baseAddress = SETTINGS_SECTOR;
  16805. 8027838: 4c17 ldr r4, [pc, #92] ; (8027898 <SETTINGS_WriteToFlash+0x6c>)
  16806. uint32_t checkCrc = 0;
  16807. uint32_t crc = SETTINGS_GetCRC();
  16808. 802783a: 4680 mov r8, r0
  16809. 802783c: 2703 movs r7, #3
  16810. FLASH_Status status;
  16811. for (uint8_t i = 0; i < 3; i++)
  16812. {
  16813. fAlarm = 0;
  16814. FLASH_Unlock();
  16815. 802783e: f7fd fc71 bl 8025124 <FLASH_Unlock>
  16816. 8027842: 4635 mov r5, r6
  16817. SETTINGS_EraseFlashSector();
  16818. 8027844: f7ff ffe2 bl 802780c <SETTINGS_EraseFlashSector>
  16819. }
  16820. /**
  16821. * @brief
  16822. */
  16823. void SETTINGS_WriteToFlash(uint8_t *data, uint32_t size)
  16824. 8027848: eb04 0b0a add.w fp, r4, sl
  16825. fAlarm = 0;
  16826. FLASH_Unlock();
  16827. SETTINGS_EraseFlashSector();
  16828. for (uint32_t i = 0; i < size; i++)
  16829. 802784c: e00a b.n 8027864 <SETTINGS_WriteToFlash+0x38>
  16830. if ((status = FLASH_ProgramByte(baseAddress++, *data++)) != FLASH_COMPLETE) {
  16831. 802784e: f815 1b01 ldrb.w r1, [r5], #1
  16832. 8027852: 4620 mov r0, r4
  16833. 8027854: f7fd fcac bl 80251b0 <FLASH_ProgramByte>
  16834. 8027858: f104 0901 add.w r9, r4, #1
  16835. 802785c: 2808 cmp r0, #8
  16836. 802785e: 462e mov r6, r5
  16837. 8027860: 464c mov r4, r9
  16838. 8027862: d102 bne.n 802786a <SETTINGS_WriteToFlash+0x3e>
  16839. fAlarm = 0;
  16840. FLASH_Unlock();
  16841. SETTINGS_EraseFlashSector();
  16842. for (uint32_t i = 0; i < size; i++)
  16843. 8027864: 455c cmp r4, fp
  16844. 8027866: 462e mov r6, r5
  16845. 8027868: d1f1 bne.n 802784e <SETTINGS_WriteToFlash+0x22>
  16846. if ((status = FLASH_ProgramByte(baseAddress++, *data++)) != FLASH_COMPLETE) {
  16847. DBG printf("FLASH_ProgramByte error: status = %d\r\n", status);
  16848. break;
  16849. }
  16850. if ((status = FLASH_ProgramWord((uint32_t)CRC_ADDRESS, crc)) != FLASH_COMPLETE) {
  16851. 802786a: 4641 mov r1, r8
  16852. 802786c: 480b ldr r0, [pc, #44] ; (802789c <SETTINGS_WriteToFlash+0x70>)
  16853. 802786e: f7fd fcbb bl 80251e8 <FLASH_ProgramWord>
  16854. DBG printf("FLASH_ProgramWord error: status = %d\r\n", status);
  16855. }
  16856. FLASH_Lock();
  16857. 8027872: f7fd fc65 bl 8025140 <FLASH_Lock>
  16858. /* Считываем что записали */
  16859. SETTINGS_ReadFromFlash((uint8_t*)&sSettings, sizeof(sSettings));
  16860. 8027876: 480a ldr r0, [pc, #40] ; (80278a0 <SETTINGS_WriteToFlash+0x74>)
  16861. 8027878: f44f 7139 mov.w r1, #740 ; 0x2e4
  16862. 802787c: f7ff ffba bl 80277f4 <SETTINGS_ReadFromFlash>
  16863. checkCrc = SETTINGS_GetCRC();
  16864. 8027880: f7ff ffc8 bl 8027814 <SETTINGS_GetCRC>
  16865. /* Проверяем CRC того что было записано */
  16866. if (checkCrc == crc)
  16867. 8027884: 4540 cmp r0, r8
  16868. 8027886: d004 beq.n 8027892 <SETTINGS_WriteToFlash+0x66>
  16869. 8027888: 3f01 subs r7, #1
  16870. uint32_t checkCrc = 0;
  16871. uint32_t crc = SETTINGS_GetCRC();
  16872. bool fAlarm = 0;
  16873. FLASH_Status status;
  16874. for (uint8_t i = 0; i < 3; i++)
  16875. 802788a: f017 07ff ands.w r7, r7, #255 ; 0xff
  16876. 802788e: d1d6 bne.n 802783e <SETTINGS_WriteToFlash+0x12>
  16877. 8027890: e7fe b.n 8027890 <SETTINGS_WriteToFlash+0x64>
  16878. 8027892: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  16879. 8027896: bf00 nop
  16880. 8027898: 08004000 .word 0x08004000
  16881. 802789c: 08007f9c .word 0x08007f9c
  16882. 80278a0: 2000e874 .word 0x2000e874
  16883. 080278a4 <SETTINGS_GetCritSecCRC>:
  16884. /**
  16885. * @brief
  16886. * @retval
  16887. */
  16888. uint32_t SETTINGS_GetCritSecCRC(void)
  16889. {
  16890. 80278a4: b508 push {r3, lr}
  16891. CRC_ResetDR();
  16892. 80278a6: f7fd fc27 bl 80250f8 <CRC_ResetDR>
  16893. uint32_t critsec_len = (uint32_t)((uint8_t *)(&sSettings.CritSecCRC) - (uint8_t *)&sSettings) / 4;
  16894. return CRC_CalcBlockCRC((uint32_t *)&sSettings, critsec_len);
  16895. 80278aa: 4803 ldr r0, [pc, #12] ; (80278b8 <SETTINGS_GetCritSecCRC+0x14>)
  16896. 80278ac: 21b8 movs r1, #184 ; 0xb8
  16897. }
  16898. 80278ae: e8bd 4008 ldmia.w sp!, {r3, lr}
  16899. */
  16900. uint32_t SETTINGS_GetCritSecCRC(void)
  16901. {
  16902. CRC_ResetDR();
  16903. uint32_t critsec_len = (uint32_t)((uint8_t *)(&sSettings.CritSecCRC) - (uint8_t *)&sSettings) / 4;
  16904. return CRC_CalcBlockCRC((uint32_t *)&sSettings, critsec_len);
  16905. 80278b2: f7fd bc27 b.w 8025104 <CRC_CalcBlockCRC>
  16906. 80278b6: bf00 nop
  16907. 80278b8: 2000e874 .word 0x2000e874
  16908. 080278bc <SETTINGS_Save>:
  16909. /**
  16910. * @brief Запись структуры настроек во flesh
  16911. */
  16912. void SETTINGS_Save(void)
  16913. {
  16914. 80278bc: b508 push {r3, lr}
  16915. /* Calc critical section CRC and store to the settings structure */
  16916. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  16917. 80278be: f7ff fff1 bl 80278a4 <SETTINGS_GetCritSecCRC>
  16918. 80278c2: 4b05 ldr r3, [pc, #20] ; (80278d8 <SETTINGS_Save+0x1c>)
  16919. SETTINGS_WriteToFlash((uint8_t*)&sSettings, sizeof(sSettings));
  16920. 80278c4: f44f 7139 mov.w r1, #740 ; 0x2e4
  16921. * @brief Запись структуры настроек во flesh
  16922. */
  16923. void SETTINGS_Save(void)
  16924. {
  16925. /* Calc critical section CRC and store to the settings structure */
  16926. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  16927. 80278c8: f8c3 02e0 str.w r0, [r3, #736] ; 0x2e0
  16928. SETTINGS_WriteToFlash((uint8_t*)&sSettings, sizeof(sSettings));
  16929. 80278cc: 4618 mov r0, r3
  16930. }
  16931. 80278ce: e8bd 4008 ldmia.w sp!, {r3, lr}
  16932. void SETTINGS_Save(void)
  16933. {
  16934. /* Calc critical section CRC and store to the settings structure */
  16935. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  16936. SETTINGS_WriteToFlash((uint8_t*)&sSettings, sizeof(sSettings));
  16937. 80278d2: f7ff bfab b.w 802782c <SETTINGS_WriteToFlash>
  16938. 80278d6: bf00 nop
  16939. 80278d8: 2000e874 .word 0x2000e874
  16940. 080278dc <SETTINGS_SetDefaultDebug>:
  16941. /**
  16942. * @brief Установка настроек для отладки
  16943. */
  16944. void SETTINGS_SetDefaultDebug(void)
  16945. {
  16946. 80278dc: b510 push {r4, lr}
  16947. /**
  16948. * @brief Установить флаги по умолчанию
  16949. */
  16950. void SETTINGS_SetFlagsDef(void)
  16951. {
  16952. sSettings.sFlags.netsettingsChanged = false;
  16953. 80278de: 4c08 ldr r4, [pc, #32] ; (8027900 <SETTINGS_SetDefaultDebug+0x24>)
  16954. /**
  16955. * @brief Установка настроек для отладки
  16956. */
  16957. void SETTINGS_SetDefaultDebug(void)
  16958. {
  16959. SETTINGS_SetWebParamsDef();
  16960. 80278e0: f7ff fef0 bl 80276c4 <SETTINGS_SetWebParamsDef>
  16961. SETTINGS_SetTempWebParamsDef();
  16962. 80278e4: f7ff ff0a bl 80276fc <SETTINGS_SetTempWebParamsDef>
  16963. SETTINGS_SetSnmpDef();
  16964. 80278e8: f7ff ff24 bl 8027734 <SETTINGS_SetSnmpDef>
  16965. SETTINGS_SetBootParamsDef();
  16966. 80278ec: f7ff fee2 bl 80276b4 <SETTINGS_SetBootParamsDef>
  16967. /**
  16968. * @brief Установить флаги по умолчанию
  16969. */
  16970. void SETTINGS_SetFlagsDef(void)
  16971. {
  16972. sSettings.sFlags.netsettingsChanged = false;
  16973. 80278f0: 2300 movs r3, #0
  16974. 80278f2: f884 32ce strb.w r3, [r4, #718] ; 0x2ce
  16975. SETTINGS_SetSnmpDef();
  16976. SETTINGS_SetBootParamsDef();
  16977. SETTINGS_SetFlagsDef();
  16978. //SETTINGS_SetInfoDef();
  16979. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  16980. 80278f6: f7ff ffd5 bl 80278a4 <SETTINGS_GetCritSecCRC>
  16981. 80278fa: f8c4 02e0 str.w r0, [r4, #736] ; 0x2e0
  16982. 80278fe: bd10 pop {r4, pc}
  16983. 8027900: 2000e874 .word 0x2000e874
  16984. 08027904 <SETTINGS_SetAllDefault>:
  16985. /**
  16986. * @brief Сброс всех настроек в значения по умолчанию
  16987. */
  16988. void SETTINGS_SetAllDefault(void)
  16989. {
  16990. 8027904: b510 push {r4, lr}
  16991. /**
  16992. * @brief Установить флаги по умолчанию
  16993. */
  16994. void SETTINGS_SetFlagsDef(void)
  16995. {
  16996. sSettings.sFlags.netsettingsChanged = false;
  16997. 8027906: 4c09 ldr r4, [pc, #36] ; (802792c <SETTINGS_SetAllDefault+0x28>)
  16998. /**
  16999. * @brief Сброс всех настроек в значения по умолчанию
  17000. */
  17001. void SETTINGS_SetAllDefault(void)
  17002. {
  17003. SETTINGS_SetBootParamsDef();
  17004. 8027908: f7ff fed4 bl 80276b4 <SETTINGS_SetBootParamsDef>
  17005. SETTINGS_SetWebParamsDef();
  17006. 802790c: f7ff feda bl 80276c4 <SETTINGS_SetWebParamsDef>
  17007. SETTINGS_SetTempWebParamsDef();
  17008. 8027910: f7ff fef4 bl 80276fc <SETTINGS_SetTempWebParamsDef>
  17009. SETTINGS_SetSnmpDef();
  17010. 8027914: f7ff ff0e bl 8027734 <SETTINGS_SetSnmpDef>
  17011. SETTINGS_SetInfoDef();
  17012. 8027918: f7ff ff4a bl 80277b0 <SETTINGS_SetInfoDef>
  17013. /**
  17014. * @brief Установить флаги по умолчанию
  17015. */
  17016. void SETTINGS_SetFlagsDef(void)
  17017. {
  17018. sSettings.sFlags.netsettingsChanged = false;
  17019. 802791c: 2300 movs r3, #0
  17020. 802791e: f884 32ce strb.w r3, [r4, #718] ; 0x2ce
  17021. SETTINGS_SetTempWebParamsDef();
  17022. SETTINGS_SetSnmpDef();
  17023. SETTINGS_SetInfoDef();
  17024. SETTINGS_SetFlagsDef();
  17025. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  17026. 8027922: f7ff ffbf bl 80278a4 <SETTINGS_GetCritSecCRC>
  17027. 8027926: f8c4 02e0 str.w r0, [r4, #736] ; 0x2e0
  17028. 802792a: bd10 pop {r4, pc}
  17029. 802792c: 2000e874 .word 0x2000e874
  17030. 08027930 <SETTINGS_Load>:
  17031. /**
  17032. * @brief Загрузка структуры настроек из flesh
  17033. */
  17034. void SETTINGS_Load(void)
  17035. {
  17036. 8027930: b510 push {r4, lr}
  17037. SETTINGS_ReadFromFlash((uint8_t*)&sSettings, sizeof(sSettings));
  17038. 8027932: 4c09 ldr r4, [pc, #36] ; (8027958 <SETTINGS_Load+0x28>)
  17039. 8027934: f44f 7139 mov.w r1, #740 ; 0x2e4
  17040. 8027938: 4620 mov r0, r4
  17041. 802793a: f7ff ff5b bl 80277f4 <SETTINGS_ReadFromFlash>
  17042. /* Проверка CRC критической секции сектора настроек.
  17043. * Если CRC не совпадает, скорее всего настройки отсутствуют,
  17044. * прошиваем значения по умолчанию */
  17045. uint32_t crc = SETTINGS_GetCritSecCRC();
  17046. 802793e: f7ff ffb1 bl 80278a4 <SETTINGS_GetCritSecCRC>
  17047. if (sSettings.CritSecCRC != crc) {
  17048. 8027942: f8d4 32e0 ldr.w r3, [r4, #736] ; 0x2e0
  17049. 8027946: 4283 cmp r3, r0
  17050. 8027948: d005 beq.n 8027956 <SETTINGS_Load+0x26>
  17051. SETTINGS_SetAllDefault();
  17052. 802794a: f7ff ffdb bl 8027904 <SETTINGS_SetAllDefault>
  17053. SETTINGS_Save();
  17054. }
  17055. }
  17056. 802794e: e8bd 4010 ldmia.w sp!, {r4, lr}
  17057. * прошиваем значения по умолчанию */
  17058. uint32_t crc = SETTINGS_GetCritSecCRC();
  17059. if (sSettings.CritSecCRC != crc) {
  17060. SETTINGS_SetAllDefault();
  17061. SETTINGS_Save();
  17062. 8027952: f7ff bfb3 b.w 80278bc <SETTINGS_Save>
  17063. 8027956: bd10 pop {r4, pc}
  17064. 8027958: 2000e874 .word 0x2000e874
  17065. 0802795c <SETTINGS_SetPartDefault>:
  17066. /**
  17067. * @brief Сброс всех настроек в значения по умолчанию кроме сетевых настроек
  17068. */
  17069. void SETTINGS_SetPartDefault(void)
  17070. {
  17071. 802795c: b510 push {r4, lr}
  17072. /**
  17073. * @brief Установить флаги по умолчанию
  17074. */
  17075. void SETTINGS_SetFlagsDef(void)
  17076. {
  17077. sSettings.sFlags.netsettingsChanged = false;
  17078. 802795e: 4c06 ldr r4, [pc, #24] ; (8027978 <SETTINGS_SetPartDefault+0x1c>)
  17079. /**
  17080. * @brief Сброс всех настроек в значения по умолчанию кроме сетевых настроек
  17081. */
  17082. void SETTINGS_SetPartDefault(void)
  17083. {
  17084. SETTINGS_SetBootParamsDef();
  17085. 8027960: f7ff fea8 bl 80276b4 <SETTINGS_SetBootParamsDef>
  17086. SETTINGS_SetSnmpDef();
  17087. 8027964: f7ff fee6 bl 8027734 <SETTINGS_SetSnmpDef>
  17088. /**
  17089. * @brief Установить флаги по умолчанию
  17090. */
  17091. void SETTINGS_SetFlagsDef(void)
  17092. {
  17093. sSettings.sFlags.netsettingsChanged = false;
  17094. 8027968: 2300 movs r3, #0
  17095. 802796a: f884 32ce strb.w r3, [r4, #718] ; 0x2ce
  17096. {
  17097. SETTINGS_SetBootParamsDef();
  17098. SETTINGS_SetSnmpDef();
  17099. SETTINGS_SetFlagsDef();
  17100. sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
  17101. 802796e: f7ff ff99 bl 80278a4 <SETTINGS_GetCritSecCRC>
  17102. 8027972: f8c4 02e0 str.w r0, [r4, #736] ; 0x2e0
  17103. 8027976: bd10 pop {r4, pc}
  17104. 8027978: 2000e874 .word 0x2000e874
  17105. 0802797c <SETTINGS_GetMac>:
  17106. /**
  17107. * @brief Преобразует mac адрес строкового формата в массив uint8_t
  17108. * @param mac - буфер для вывода mac адреса
  17109. */
  17110. void SETTINGS_GetMac(uint8_t *mac)
  17111. {
  17112. 802797c: b573 push {r0, r1, r4, r5, r6, lr}
  17113. char dummy[2];
  17114. char *macPtr = sSettings.sInfo.mac;
  17115. for (uint8_t i = 0; i < 6; i++)
  17116. {
  17117. strncpy(dummy, macPtr+i*3, 2);
  17118. 802797e: 4e0b ldr r6, [pc, #44] ; (80279ac <SETTINGS_GetMac+0x30>)
  17119. /**
  17120. * @brief Преобразует mac адрес строкового формата в массив uint8_t
  17121. * @param mac - буфер для вывода mac адреса
  17122. */
  17123. void SETTINGS_GetMac(uint8_t *mac)
  17124. 8027980: 1e45 subs r5, r0, #1
  17125. 8027982: 2400 movs r4, #0
  17126. char dummy[2];
  17127. char *macPtr = sSettings.sInfo.mac;
  17128. for (uint8_t i = 0; i < 6; i++)
  17129. {
  17130. strncpy(dummy, macPtr+i*3, 2);
  17131. 8027984: f504 710e add.w r1, r4, #568 ; 0x238
  17132. 8027988: 1989 adds r1, r1, r6
  17133. 802798a: 3106 adds r1, #6
  17134. 802798c: 2202 movs r2, #2
  17135. 802798e: a801 add r0, sp, #4
  17136. 8027990: f7fa f9a2 bl 8021cd8 <strncpy>
  17137. mac[i] = (uint8_t)strtol(dummy, NULL, 16);
  17138. 8027994: 2100 movs r1, #0
  17139. 8027996: 2210 movs r2, #16
  17140. 8027998: a801 add r0, sp, #4
  17141. 802799a: f7fb fcd3 bl 8023344 <strtol>
  17142. 802799e: 3403 adds r4, #3
  17143. void SETTINGS_GetMac(uint8_t *mac)
  17144. {
  17145. char dummy[2];
  17146. char *macPtr = sSettings.sInfo.mac;
  17147. for (uint8_t i = 0; i < 6; i++)
  17148. 80279a0: 2c12 cmp r4, #18
  17149. {
  17150. strncpy(dummy, macPtr+i*3, 2);
  17151. mac[i] = (uint8_t)strtol(dummy, NULL, 16);
  17152. 80279a2: f805 0f01 strb.w r0, [r5, #1]!
  17153. void SETTINGS_GetMac(uint8_t *mac)
  17154. {
  17155. char dummy[2];
  17156. char *macPtr = sSettings.sInfo.mac;
  17157. for (uint8_t i = 0; i < 6; i++)
  17158. 80279a6: d1ed bne.n 8027984 <SETTINGS_GetMac+0x8>
  17159. {
  17160. strncpy(dummy, macPtr+i*3, 2);
  17161. mac[i] = (uint8_t)strtol(dummy, NULL, 16);
  17162. }
  17163. }
  17164. 80279a8: bd7c pop {r2, r3, r4, r5, r6, pc}
  17165. 80279aa: bf00 nop
  17166. 80279ac: 2000e874 .word 0x2000e874
  17167. 080279b0 <SETTINGS_SetProDate>:
  17168. /**
  17169. * @brief Установить дату производства
  17170. */
  17171. void SETTINGS_SetProDate(char *proDate, uint8_t len)
  17172. {
  17173. 80279b0: b570 push {r4, r5, r6, lr}
  17174. memset(sSettings.sInfo.productionData, 0, 40);
  17175. 80279b2: 4c07 ldr r4, [pc, #28] ; (80279d0 <SETTINGS_SetProDate+0x20>)
  17176. /**
  17177. * @brief Установить дату производства
  17178. */
  17179. void SETTINGS_SetProDate(char *proDate, uint8_t len)
  17180. {
  17181. 80279b4: 4606 mov r6, r0
  17182. 80279b6: 460d mov r5, r1
  17183. memset(sSettings.sInfo.productionData, 0, 40);
  17184. 80279b8: 2228 movs r2, #40 ; 0x28
  17185. 80279ba: 2100 movs r1, #0
  17186. 80279bc: 4620 mov r0, r4
  17187. 80279be: f7f9 fefb bl 80217b8 <memset>
  17188. memcpy(sSettings.sInfo.productionData, proDate, len);
  17189. 80279c2: 4620 mov r0, r4
  17190. 80279c4: 4631 mov r1, r6
  17191. 80279c6: 462a mov r2, r5
  17192. }
  17193. 80279c8: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  17194. * @brief Установить дату производства
  17195. */
  17196. void SETTINGS_SetProDate(char *proDate, uint8_t len)
  17197. {
  17198. memset(sSettings.sInfo.productionData, 0, 40);
  17199. memcpy(sSettings.sInfo.productionData, proDate, len);
  17200. 80279cc: f7f9 be3a b.w 8021644 <memcpy>
  17201. 80279d0: 2000ea8a .word 0x2000ea8a
  17202. 080279d4 <vTaskLedBlink>:
  17203. /**
  17204. * @brief Задача простой мигалки
  17205. */
  17206. void vTaskLedBlink(void *arg)
  17207. {
  17208. 80279d4: b510 push {r4, lr}
  17209. /* Просто отражает состояние контроллера - "живой" */
  17210. // LED_Toggle(LED_INIT_G);
  17211. //LED_Toggle(LED_INIT_R);
  17212. LED_Toggle(LED_MAJOR_R);
  17213. // LED_Toggle(LED_MINOR_R);
  17214. vTaskDelay(statusLedFreq);
  17215. 80279d6: 4c04 ldr r4, [pc, #16] ; (80279e8 <vTaskLedBlink+0x14>)
  17216. /**
  17217. * @brief Изменить состояние LED
  17218. */
  17219. void LED_Toggle(gpio_t pin)
  17220. {
  17221. gpio_invert_output(pin);
  17222. 80279d8: 200b movs r0, #11
  17223. 80279da: f7fe fa0d bl 8025df8 <gpio_invert_output>
  17224. /* Просто отражает состояние контроллера - "живой" */
  17225. // LED_Toggle(LED_INIT_G);
  17226. //LED_Toggle(LED_INIT_R);
  17227. LED_Toggle(LED_MAJOR_R);
  17228. // LED_Toggle(LED_MINOR_R);
  17229. vTaskDelay(statusLedFreq);
  17230. 80279de: 8820 ldrh r0, [r4, #0]
  17231. 80279e0: f000 ffb8 bl 8028954 <vTaskDelay>
  17232. 80279e4: e7f8 b.n 80279d8 <vTaskLedBlink+0x4>
  17233. 80279e6: bf00 nop
  17234. 80279e8: 200015aa .word 0x200015aa
  17235. 080279ec <LED_Off>:
  17236. /**
  17237. * @brief
  17238. */
  17239. void LED_Off(gpio_t pin)
  17240. {
  17241. gpio_set(pin, 0);
  17242. 80279ec: 2100 movs r1, #0
  17243. 80279ee: f7fe b96f b.w 8025cd0 <gpio_set>
  17244. 080279f2 <LED_Init>:
  17245. /**
  17246. * @brief
  17247. * @retval
  17248. */
  17249. void LED_Init(void)
  17250. {
  17251. 80279f2: b508 push {r3, lr}
  17252. LED_Off(LED_INIT_R);
  17253. 80279f4: 2009 movs r0, #9
  17254. 80279f6: f7ff fff9 bl 80279ec <LED_Off>
  17255. LED_Off(LED_INIT_G);
  17256. 80279fa: 200a movs r0, #10
  17257. 80279fc: f7ff fff6 bl 80279ec <LED_Off>
  17258. LED_Off(LED_MAJOR_R);
  17259. 8027a00: 200b movs r0, #11
  17260. 8027a02: f7ff fff3 bl 80279ec <LED_Off>
  17261. LED_Off(LED_MINOR_G);
  17262. 8027a06: 200c movs r0, #12
  17263. 8027a08: f7ff fff0 bl 80279ec <LED_Off>
  17264. LED_Off(LED_MINOR_R);
  17265. 8027a0c: 200d movs r0, #13
  17266. }
  17267. 8027a0e: e8bd 4008 ldmia.w sp!, {r3, lr}
  17268. {
  17269. LED_Off(LED_INIT_R);
  17270. LED_Off(LED_INIT_G);
  17271. LED_Off(LED_MAJOR_R);
  17272. LED_Off(LED_MINOR_G);
  17273. LED_Off(LED_MINOR_R);
  17274. 8027a12: f7ff bfeb b.w 80279ec <LED_Off>
  17275. 8027a16: 0000 movs r0, r0
  17276. 08027a18 <LED_SetStatusLedFreq>:
  17277. /**
  17278. * @brief
  17279. */
  17280. void LED_SetStatusLedFreq(uint16_t freq)
  17281. {
  17282. statusLedFreq = freq;
  17283. 8027a18: 4b01 ldr r3, [pc, #4] ; (8027a20 <LED_SetStatusLedFreq+0x8>)
  17284. 8027a1a: 8018 strh r0, [r3, #0]
  17285. 8027a1c: 4770 bx lr
  17286. 8027a1e: bf00 nop
  17287. 8027a20: 200015aa .word 0x200015aa
  17288. 08027a24 <BUTTON_VoidHandler>:
  17289. /**
  17290. * @brief Заглушка
  17291. */
  17292. void BUTTON_VoidHandler(void)
  17293. {
  17294. 8027a24: 4770 bx lr
  17295. 8027a26: 0000 movs r0, r0
  17296. 08027a28 <BUTTON_DEF_DownHandler>:
  17297. /**
  17298. * @brief Хендлер кнопки DEFAULT. Сброс всех настроек, сохранение и перезагрузка
  17299. */
  17300. void BUTTON_DEF_DownHandler(void)
  17301. {
  17302. 8027a28: b508 push {r3, lr}
  17303. //taskENTER_CRITICAL();
  17304. SETTINGS_SetDefaultDebug();
  17305. 8027a2a: f7ff ff57 bl 80278dc <SETTINGS_SetDefaultDebug>
  17306. SETTINGS_Save();
  17307. 8027a2e: f7ff ff45 bl 80278bc <SETTINGS_Save>
  17308. vTaskDelay(1010);
  17309. 8027a32: f240 30f2 movw r0, #1010 ; 0x3f2
  17310. 8027a36: f000 ff8d bl 8028954 <vTaskDelay>
  17311. This function acts as a special kind of Data Memory Barrier.
  17312. It completes when all explicit memory accesses before this instruction complete.
  17313. */
  17314. __attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void)
  17315. {
  17316. __ASM volatile ("dsb");
  17317. 8027a3a: f3bf 8f4f dsb sy
  17318. //static inline void NVIC_SystemReset(void)
  17319. {
  17320. __DSB(); /* Ensure all outstanding memory accesses included
  17321. buffered write are completed before reset */
  17322. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  17323. (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
  17324. 8027a3e: 4a05 ldr r2, [pc, #20] ; (8027a54 <BUTTON_DEF_DownHandler+0x2c>)
  17325. 8027a40: 4b05 ldr r3, [pc, #20] ; (8027a58 <BUTTON_DEF_DownHandler+0x30>)
  17326. 8027a42: 68d1 ldr r1, [r2, #12]
  17327. 8027a44: f401 61e0 and.w r1, r1, #1792 ; 0x700
  17328. 8027a48: 430b orrs r3, r1
  17329. __STATIC_INLINE void NVIC_SystemReset(void)
  17330. //static inline void NVIC_SystemReset(void)
  17331. {
  17332. __DSB(); /* Ensure all outstanding memory accesses included
  17333. buffered write are completed before reset */
  17334. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  17335. 8027a4a: 60d3 str r3, [r2, #12]
  17336. 8027a4c: f3bf 8f4f dsb sy
  17337. 8027a50: e7fe b.n 8027a50 <BUTTON_DEF_DownHandler+0x28>
  17338. 8027a52: bf00 nop
  17339. 8027a54: e000ed00 .word 0xe000ed00
  17340. 8027a58: 05fa0004 .word 0x05fa0004
  17341. 08027a5c <BUTTON_GetState>:
  17342. /**
  17343. * @brief Возвращает сотояние ключа
  17344. */
  17345. BUTTON_STATE_t BUTTON_GetState(BUTTON_NO_FIX_t *button)
  17346. {
  17347. return (BUTTON_STATE_t)gpio_get(button->id_pin);
  17348. 8027a5c: 7800 ldrb r0, [r0, #0]
  17349. 8027a5e: f7fe b9db b.w 8025e18 <gpio_get>
  17350. 8027a62: 0000 movs r0, r0
  17351. 08027a64 <BUTTON_Init>:
  17352. /**
  17353. * @brief
  17354. * @retval
  17355. */
  17356. void BUTTON_Init(void)
  17357. {
  17358. 8027a64: b510 push {r4, lr}
  17359. defButton.id_pin = KEY_DEF;
  17360. 8027a66: 4c09 ldr r4, [pc, #36] ; (8027a8c <BUTTON_Init+0x28>)
  17361. 8027a68: 230f movs r3, #15
  17362. 8027a6a: 7023 strb r3, [r4, #0]
  17363. defButton.timeDelay = 5;
  17364. 8027a6c: 2305 movs r3, #5
  17365. 8027a6e: 8063 strh r3, [r4, #2]
  17366. defButton.pressHandler = BUTTON_VoidHandler;
  17367. 8027a70: 4b07 ldr r3, [pc, #28] ; (8027a90 <BUTTON_Init+0x2c>)
  17368. 8027a72: 60a3 str r3, [r4, #8]
  17369. defButton.unpressHandler = BUTTON_DEF_DownHandler;
  17370. 8027a74: 4b07 ldr r3, [pc, #28] ; (8027a94 <BUTTON_Init+0x30>)
  17371. defButton.counterActivation = 0;
  17372. defButton.timeActivation = 40;
  17373. 8027a76: 2228 movs r2, #40 ; 0x28
  17374. void BUTTON_Init(void)
  17375. {
  17376. defButton.id_pin = KEY_DEF;
  17377. defButton.timeDelay = 5;
  17378. defButton.pressHandler = BUTTON_VoidHandler;
  17379. defButton.unpressHandler = BUTTON_DEF_DownHandler;
  17380. 8027a78: 60e3 str r3, [r4, #12]
  17381. defButton.counterActivation = 0;
  17382. defButton.timeActivation = 40;
  17383. defButton.fActivation = false;
  17384. defButton.stateOld = BUTTON_GetState(&defButton);
  17385. 8027a7a: 4620 mov r0, r4
  17386. {
  17387. defButton.id_pin = KEY_DEF;
  17388. defButton.timeDelay = 5;
  17389. defButton.pressHandler = BUTTON_VoidHandler;
  17390. defButton.unpressHandler = BUTTON_DEF_DownHandler;
  17391. defButton.counterActivation = 0;
  17392. 8027a7c: 2300 movs r3, #0
  17393. 8027a7e: 6163 str r3, [r4, #20]
  17394. defButton.timeActivation = 40;
  17395. 8027a80: 8322 strh r2, [r4, #24]
  17396. defButton.fActivation = false;
  17397. 8027a82: 76a3 strb r3, [r4, #26]
  17398. defButton.stateOld = BUTTON_GetState(&defButton);
  17399. 8027a84: f7ff ffea bl 8027a5c <BUTTON_GetState>
  17400. 8027a88: 71a0 strb r0, [r4, #6]
  17401. 8027a8a: bd10 pop {r4, pc}
  17402. 8027a8c: 2000eb58 .word 0x2000eb58
  17403. 8027a90: 08027a25 .word 0x08027a25
  17404. 8027a94: 08027a29 .word 0x08027a29
  17405. 08027a98 <BUTTON_DellayHandler>:
  17406. время нажатия.
  17407. * @param *button: указатель на структуру типа BUTTON_NO_FIX
  17408. * @retval нет
  17409. */
  17410. void BUTTON_DellayHandler(BUTTON_NO_FIX_t *button)
  17411. {
  17412. 8027a98: b510 push {r4, lr}
  17413. 8027a9a: 4604 mov r4, r0
  17414. /* Кнопка нажата. Ведем отсчет времени удержания */
  17415. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  17416. 8027a9c: 7800 ldrb r0, [r0, #0]
  17417. 8027a9e: f7fe f9bb bl 8025e18 <gpio_get>
  17418. 8027aa2: 6963 ldr r3, [r4, #20]
  17419. 8027aa4: b950 cbnz r0, 8027abc <BUTTON_DellayHandler+0x24>
  17420. {
  17421. button->counterActivation++;
  17422. button->fActivation = false;
  17423. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  17424. if (button->counterActivation > button->timeActivation)
  17425. 8027aa6: 8b22 ldrh r2, [r4, #24]
  17426. {
  17427. /* Кнопка нажата. Ведем отсчет времени удержания */
  17428. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  17429. {
  17430. button->counterActivation++;
  17431. button->fActivation = false;
  17432. 8027aa8: 76a0 strb r0, [r4, #26]
  17433. void BUTTON_DellayHandler(BUTTON_NO_FIX_t *button)
  17434. {
  17435. /* Кнопка нажата. Ведем отсчет времени удержания */
  17436. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  17437. {
  17438. button->counterActivation++;
  17439. 8027aaa: 3301 adds r3, #1
  17440. button->fActivation = false;
  17441. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  17442. if (button->counterActivation > button->timeActivation)
  17443. 8027aac: 4293 cmp r3, r2
  17444. void BUTTON_DellayHandler(BUTTON_NO_FIX_t *button)
  17445. {
  17446. /* Кнопка нажата. Ведем отсчет времени удержания */
  17447. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  17448. {
  17449. button->counterActivation++;
  17450. 8027aae: 6163 str r3, [r4, #20]
  17451. button->fActivation = false;
  17452. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  17453. if (button->counterActivation > button->timeActivation)
  17454. 8027ab0: d914 bls.n 8027adc <BUTTON_DellayHandler+0x44>
  17455. LED_SetStatusLedFreq(100);
  17456. 8027ab2: 2064 movs r0, #100 ; 0x64
  17457. }
  17458. else
  17459. button->counterActivation = 0;
  17460. }
  17461. }
  17462. 8027ab4: e8bd 4010 ldmia.w sp!, {r4, lr}
  17463. button->counterActivation++;
  17464. button->fActivation = false;
  17465. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  17466. if (button->counterActivation > button->timeActivation)
  17467. LED_SetStatusLedFreq(100);
  17468. 8027ab8: f7ff bfae b.w 8027a18 <LED_SetStatusLedFreq>
  17469. }
  17470. /* Кнопку отжата. Если до этого она была нажата нужное время - вызываем хендлер */
  17471. else
  17472. {
  17473. if ((button->counterActivation > button->timeActivation)
  17474. 8027abc: 8b22 ldrh r2, [r4, #24]
  17475. 8027abe: 4293 cmp r3, r2
  17476. 8027ac0: d90a bls.n 8027ad8 <BUTTON_DellayHandler+0x40>
  17477. && button->fActivation == false)
  17478. 8027ac2: 7ea3 ldrb r3, [r4, #26]
  17479. 8027ac4: b943 cbnz r3, 8027ad8 <BUTTON_DellayHandler+0x40>
  17480. {
  17481. button->fActivation = true;
  17482. 8027ac6: 2301 movs r3, #1
  17483. 8027ac8: 76a3 strb r3, [r4, #26]
  17484. LED_SetStatusLedFreq(1000);
  17485. 8027aca: f44f 707a mov.w r0, #1000 ; 0x3e8
  17486. 8027ace: f7ff ffa3 bl 8027a18 <LED_SetStatusLedFreq>
  17487. button->unpressHandler();
  17488. 8027ad2: 68e3 ldr r3, [r4, #12]
  17489. 8027ad4: 4798 blx r3
  17490. 8027ad6: bd10 pop {r4, pc}
  17491. }
  17492. else
  17493. button->counterActivation = 0;
  17494. 8027ad8: 2300 movs r3, #0
  17495. 8027ada: 6163 str r3, [r4, #20]
  17496. 8027adc: bd10 pop {r4, pc}
  17497. 8027ade: 0000 movs r0, r0
  17498. 08027ae0 <vTaskButtons>:
  17499. /**
  17500. * @brief Опрос кнопок
  17501. */
  17502. void vTaskButtons(void *pvParameters)
  17503. {
  17504. 8027ae0: b508 push {r3, lr}
  17505. for (;;)
  17506. {
  17507. BUTTON_DellayHandler(&defButton);
  17508. 8027ae2: 4803 ldr r0, [pc, #12] ; (8027af0 <vTaskButtons+0x10>)
  17509. 8027ae4: f7ff ffd8 bl 8027a98 <BUTTON_DellayHandler>
  17510. vTaskDelay(100); //20
  17511. 8027ae8: 2064 movs r0, #100 ; 0x64
  17512. 8027aea: f000 ff33 bl 8028954 <vTaskDelay>
  17513. 8027aee: e7f8 b.n 8027ae2 <vTaskButtons+0x2>
  17514. 8027af0: 2000eb58 .word 0x2000eb58
  17515. 08027af4 <set_mode_jumper>:
  17516. #include "gpio.h"
  17517. bool value_jumper;
  17518. void set_mode_jumper(void)
  17519. {
  17520. 8027af4: b508 push {r3, lr}
  17521. value_jumper = gpio_get(MODE_JUMPER);
  17522. 8027af6: 200e movs r0, #14
  17523. 8027af8: f7fe f98e bl 8025e18 <gpio_get>
  17524. 8027afc: 4b01 ldr r3, [pc, #4] ; (8027b04 <set_mode_jumper+0x10>)
  17525. 8027afe: 7018 strb r0, [r3, #0]
  17526. 8027b00: bd08 pop {r3, pc}
  17527. 8027b02: bf00 nop
  17528. 8027b04: 2000eb74 .word 0x2000eb74
  17529. 08027b08 <init_UPS_value>:
  17530. };
  17531. void init_UPS_value(void)
  17532. {
  17533. UPS.Freq_in = 0;
  17534. 8027b08: 4b06 ldr r3, [pc, #24] ; (8027b24 <init_UPS_value+0x1c>)
  17535. 8027b0a: 2200 movs r2, #0
  17536. 8027b0c: 601a str r2, [r3, #0]
  17537. UPS.VAC_in = 0;
  17538. 8027b0e: 605a str r2, [r3, #4]
  17539. UPS.VAC_out = 0;
  17540. 8027b10: 609a str r2, [r3, #8]
  17541. UPS.Temp = 0;
  17542. 8027b12: 60da str r2, [r3, #12]
  17543. UPS.Load = 0;
  17544. 8027b14: 2200 movs r2, #0
  17545. 8027b16: 741a strb r2, [r3, #16]
  17546. UPS.SOC = 0;
  17547. 8027b18: 745a strb r2, [r3, #17]
  17548. UPS.work_time = 0;
  17549. 8027b1a: 749a strb r2, [r3, #18]
  17550. UPS.Status = 0;
  17551. 8027b1c: 74da strb r2, [r3, #19]
  17552. UPS.Present = false;
  17553. 8027b1e: 751a strb r2, [r3, #20]
  17554. 8027b20: 4770 bx lr
  17555. 8027b22: bf00 nop
  17556. 8027b24: 2000e858 .word 0x2000e858
  17557. 08027b28 <send_MegaTec_cmd>:
  17558. }
  17559. void send_MegaTec_cmd(cmdMegaTecEnums_t command)
  17560. {
  17561. if(command == ups_test_time){
  17562. 8027b28: 2803 cmp r0, #3
  17563. UPS.Status = 0;
  17564. UPS.Present = false;
  17565. }
  17566. void send_MegaTec_cmd(cmdMegaTecEnums_t command)
  17567. {
  17568. 8027b2a: b510 push {r4, lr}
  17569. if(command == ups_test_time){
  17570. 8027b2c: d00f beq.n 8027b4e <send_MegaTec_cmd+0x26>
  17571. }
  17572. else if(command == ups_shutdown){
  17573. 8027b2e: 2805 cmp r0, #5
  17574. 8027b30: d00d beq.n 8027b4e <send_MegaTec_cmd+0x26>
  17575. }
  17576. else if(command == ups_shutdown_restore){
  17577. 8027b32: 2806 cmp r0, #6
  17578. 8027b34: d00b beq.n 8027b4e <send_MegaTec_cmd+0x26>
  17579. }
  17580. else{
  17581. ups_send_block(MegaTecCMD[command], strlen(MegaTecCMD[command]));
  17582. 8027b36: 4b06 ldr r3, [pc, #24] ; (8027b50 <send_MegaTec_cmd+0x28>)
  17583. 8027b38: f853 4020 ldr.w r4, [r3, r0, lsl #2]
  17584. 8027b3c: 4620 mov r0, r4
  17585. 8027b3e: f7fa f813 bl 8021b68 <strlen>
  17586. 8027b42: b2c1 uxtb r1, r0
  17587. 8027b44: 4620 mov r0, r4
  17588. }
  17589. }
  17590. 8027b46: e8bd 4010 ldmia.w sp!, {r4, lr}
  17591. }
  17592. else if(command == ups_shutdown_restore){
  17593. }
  17594. else{
  17595. ups_send_block(MegaTecCMD[command], strlen(MegaTecCMD[command]));
  17596. 8027b4a: f7fe be37 b.w 80267bc <ups_send_block>
  17597. 8027b4e: bd10 pop {r4, pc}
  17598. 8027b50: 200015ac .word 0x200015ac
  17599. 08027b54 <ups_megatec_rx_pdu>:
  17600. }
  17601. }
  17602. bool ups_megatec_rx_pdu(void)
  17603. {
  17604. 8027b54: b510 push {r4, lr}
  17605. int c = 0;
  17606. ups_pdu.len = 0;
  17607. 8027b56: 4c0e ldr r4, [pc, #56] ; (8027b90 <ups_megatec_rx_pdu+0x3c>)
  17608. 8027b58: 2000 movs r0, #0
  17609. 8027b5a: 8660 strh r0, [r4, #50] ; 0x32
  17610. while ((ups_pdu.len < UPS_PDU_MAX_LEN) && (c != 0x0d)) {
  17611. 8027b5c: e00d b.n 8027b7a <ups_megatec_rx_pdu+0x26>
  17612. c = ups_getchar(500);//portMAX_DELAY
  17613. 8027b5e: f44f 70fa mov.w r0, #500 ; 0x1f4
  17614. 8027b62: f7fe fe4f bl 8026804 <ups_getchar>
  17615. if(c < 0)
  17616. 8027b66: 2800 cmp r0, #0
  17617. 8027b68: da03 bge.n 8027b72 <ups_megatec_rx_pdu+0x1e>
  17618. {
  17619. ups_pdu.len = 0;
  17620. 8027b6a: 4b09 ldr r3, [pc, #36] ; (8027b90 <ups_megatec_rx_pdu+0x3c>)
  17621. 8027b6c: 2200 movs r2, #0
  17622. 8027b6e: 865a strh r2, [r3, #50] ; 0x32
  17623. break;
  17624. 8027b70: e008 b.n 8027b84 <ups_megatec_rx_pdu+0x30>
  17625. }
  17626. ups_pdu.data[ups_pdu.len++] = c;
  17627. 8027b72: 8e63 ldrh r3, [r4, #50] ; 0x32
  17628. 8027b74: 54e0 strb r0, [r4, r3]
  17629. 8027b76: 3301 adds r3, #1
  17630. 8027b78: 8663 strh r3, [r4, #50] ; 0x32
  17631. {
  17632. int c = 0;
  17633. ups_pdu.len = 0;
  17634. while ((ups_pdu.len < UPS_PDU_MAX_LEN) && (c != 0x0d)) {
  17635. 8027b7a: 8e63 ldrh r3, [r4, #50] ; 0x32
  17636. 8027b7c: 2b31 cmp r3, #49 ; 0x31
  17637. 8027b7e: d801 bhi.n 8027b84 <ups_megatec_rx_pdu+0x30>
  17638. 8027b80: 280d cmp r0, #13
  17639. 8027b82: d1ec bne.n 8027b5e <ups_megatec_rx_pdu+0xa>
  17640. break;
  17641. }
  17642. ups_pdu.data[ups_pdu.len++] = c;
  17643. }
  17644. if (ups_pdu.len == 0)
  17645. 8027b84: 4b02 ldr r3, [pc, #8] ; (8027b90 <ups_megatec_rx_pdu+0x3c>)
  17646. 8027b86: 8e58 ldrh r0, [r3, #50] ; 0x32
  17647. return false;
  17648. return true;
  17649. }
  17650. 8027b88: 3000 adds r0, #0
  17651. 8027b8a: bf18 it ne
  17652. 8027b8c: 2001 movne r0, #1
  17653. 8027b8e: bd10 pop {r4, pc}
  17654. 8027b90: 200028a2 .word 0x200028a2
  17655. 08027b94 <ups_status_response>:
  17656. void ups_status_response(char *data)
  17657. {
  17658. 8027b94: e92d 41ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, lr}
  17659. char *endValue;
  17660. char value[10];
  17661. uint8_t len = 0;
  17662. if(data[0] != '(')
  17663. 8027b98: 7803 ldrb r3, [r0, #0]
  17664. 8027b9a: 2b28 cmp r3, #40 ; 0x28
  17665. 8027b9c: f040 809c bne.w 8027cd8 <ups_status_response+0x144>
  17666. return;
  17667. data++;
  17668. 8027ba0: 1c44 adds r4, r0, #1
  17669. memset(value, 0, 10);
  17670. 8027ba2: 220a movs r2, #10
  17671. 8027ba4: 2100 movs r1, #0
  17672. 8027ba6: a801 add r0, sp, #4
  17673. 8027ba8: f7f9 fe06 bl 80217b8 <memset>
  17674. endValue = strpbrk(data," ");
  17675. 8027bac: 4620 mov r0, r4
  17676. 8027bae: 494b ldr r1, [pc, #300] ; (8027cdc <ups_status_response+0x148>)
  17677. 8027bb0: f7fa f8c4 bl 8021d3c <strpbrk>
  17678. len = endValue - data;
  17679. 8027bb4: 1b00 subs r0, r0, r4
  17680. void ups_megatec_init(void) {
  17681. init_UPS_value();
  17682. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  17683. }
  17684. 8027bb6: b2c5 uxtb r5, r0
  17685. data++;
  17686. memset(value, 0, 10);
  17687. endValue = strpbrk(data," ");
  17688. len = endValue - data;
  17689. strncpy(value, data, len);
  17690. 8027bb8: 462a mov r2, r5
  17691. 8027bba: 4621 mov r1, r4
  17692. 8027bbc: a801 add r0, sp, #4
  17693. 8027bbe: f7fa f88b bl 8021cd8 <strncpy>
  17694. data += (len + 1);
  17695. UPS.VAC_in = atof(value);
  17696. 8027bc2: a801 add r0, sp, #4
  17697. 8027bc4: f7f9 fcd4 bl 8021570 <atof>
  17698. 8027bc8: f7f8 ffbc bl 8020b44 <__aeabi_d2f>
  17699. memset(value, 0, 10);
  17700. endValue = strpbrk(data," ");
  17701. len = endValue - data;
  17702. strncpy(value, data, len);
  17703. data += (len + 1);
  17704. 8027bcc: 3501 adds r5, #1
  17705. 8027bce: 1965 adds r5, r4, r5
  17706. UPS.VAC_in = atof(value);
  17707. 8027bd0: 4c43 ldr r4, [pc, #268] ; (8027ce0 <ups_status_response+0x14c>)
  17708. //TODO
  17709. memset(value, 0, 10);
  17710. 8027bd2: 220a movs r2, #10
  17711. 8027bd4: 2100 movs r1, #0
  17712. memset(value, 0, 10);
  17713. endValue = strpbrk(data," ");
  17714. len = endValue - data;
  17715. strncpy(value, data, len);
  17716. data += (len + 1);
  17717. UPS.VAC_in = atof(value);
  17718. 8027bd6: 6060 str r0, [r4, #4]
  17719. //TODO
  17720. memset(value, 0, 10);
  17721. 8027bd8: a801 add r0, sp, #4
  17722. 8027bda: f7f9 fded bl 80217b8 <memset>
  17723. endValue = strpbrk(data," ");
  17724. 8027bde: 4628 mov r0, r5
  17725. 8027be0: 493e ldr r1, [pc, #248] ; (8027cdc <ups_status_response+0x148>)
  17726. 8027be2: f7fa f8ab bl 8021d3c <strpbrk>
  17727. len = endValue - data;
  17728. 8027be6: 1b40 subs r0, r0, r5
  17729. void ups_megatec_init(void) {
  17730. init_UPS_value();
  17731. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  17732. }
  17733. 8027be8: fa5f f880 uxtb.w r8, r0
  17734. //TODO
  17735. memset(value, 0, 10);
  17736. endValue = strpbrk(data," ");
  17737. len = endValue - data;
  17738. strncpy(value, data, len);
  17739. 8027bec: 4629 mov r1, r5
  17740. 8027bee: 4642 mov r2, r8
  17741. 8027bf0: a801 add r0, sp, #4
  17742. data += (len + 1);
  17743. 8027bf2: f108 0801 add.w r8, r8, #1
  17744. //TODO
  17745. memset(value, 0, 10);
  17746. endValue = strpbrk(data," ");
  17747. len = endValue - data;
  17748. strncpy(value, data, len);
  17749. 8027bf6: f7fa f86f bl 8021cd8 <strncpy>
  17750. data += (len + 1);
  17751. 8027bfa: 44a8 add r8, r5
  17752. memset(value, 0, 10);
  17753. 8027bfc: 220a movs r2, #10
  17754. 8027bfe: 2100 movs r1, #0
  17755. 8027c00: a801 add r0, sp, #4
  17756. 8027c02: f7f9 fdd9 bl 80217b8 <memset>
  17757. endValue = strpbrk(data," ");
  17758. 8027c06: 4935 ldr r1, [pc, #212] ; (8027cdc <ups_status_response+0x148>)
  17759. 8027c08: 4640 mov r0, r8
  17760. 8027c0a: f7fa f897 bl 8021d3c <strpbrk>
  17761. len = endValue - data;
  17762. 8027c0e: ebc8 0000 rsb r0, r8, r0
  17763. void ups_megatec_init(void) {
  17764. init_UPS_value();
  17765. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  17766. }
  17767. 8027c12: b2c7 uxtb r7, r0
  17768. data += (len + 1);
  17769. memset(value, 0, 10);
  17770. endValue = strpbrk(data," ");
  17771. len = endValue - data;
  17772. strncpy(value, data, len);
  17773. 8027c14: 463a mov r2, r7
  17774. 8027c16: 4641 mov r1, r8
  17775. 8027c18: a801 add r0, sp, #4
  17776. 8027c1a: f7fa f85d bl 8021cd8 <strncpy>
  17777. data += (len + 1);
  17778. UPS.VAC_out = atof(value);
  17779. 8027c1e: a801 add r0, sp, #4
  17780. 8027c20: f7f9 fca6 bl 8021570 <atof>
  17781. 8027c24: f7f8 ff8e bl 8020b44 <__aeabi_d2f>
  17782. memset(value, 0, 10);
  17783. endValue = strpbrk(data," ");
  17784. len = endValue - data;
  17785. strncpy(value, data, len);
  17786. data += (len + 1);
  17787. 8027c28: 3701 adds r7, #1
  17788. 8027c2a: 4447 add r7, r8
  17789. UPS.VAC_out = atof(value);
  17790. memset(value, 0, 10);
  17791. 8027c2c: 220a movs r2, #10
  17792. 8027c2e: 2100 movs r1, #0
  17793. memset(value, 0, 10);
  17794. endValue = strpbrk(data," ");
  17795. len = endValue - data;
  17796. strncpy(value, data, len);
  17797. data += (len + 1);
  17798. UPS.VAC_out = atof(value);
  17799. 8027c30: 60a0 str r0, [r4, #8]
  17800. memset(value, 0, 10);
  17801. 8027c32: a801 add r0, sp, #4
  17802. 8027c34: f7f9 fdc0 bl 80217b8 <memset>
  17803. endValue = strpbrk(data," ");
  17804. 8027c38: 4928 ldr r1, [pc, #160] ; (8027cdc <ups_status_response+0x148>)
  17805. 8027c3a: 4638 mov r0, r7
  17806. 8027c3c: f7fa f87e bl 8021d3c <strpbrk>
  17807. len = endValue - data;
  17808. 8027c40: 1bc0 subs r0, r0, r7
  17809. void ups_megatec_init(void) {
  17810. init_UPS_value();
  17811. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  17812. }
  17813. 8027c42: b2c6 uxtb r6, r0
  17814. UPS.VAC_out = atof(value);
  17815. memset(value, 0, 10);
  17816. endValue = strpbrk(data," ");
  17817. len = endValue - data;
  17818. strncpy(value, data, len);
  17819. 8027c44: 4632 mov r2, r6
  17820. 8027c46: 4639 mov r1, r7
  17821. 8027c48: a801 add r0, sp, #4
  17822. 8027c4a: f7fa f845 bl 8021cd8 <strncpy>
  17823. data += (len + 1);
  17824. UPS.Load = atoi(value);
  17825. 8027c4e: a801 add r0, sp, #4
  17826. 8027c50: f7f9 fc92 bl 8021578 <atoi>
  17827. memset(value, 0, 10);
  17828. endValue = strpbrk(data," ");
  17829. len = endValue - data;
  17830. strncpy(value, data, len);
  17831. data += (len + 1);
  17832. 8027c54: 3601 adds r6, #1
  17833. 8027c56: 19be adds r6, r7, r6
  17834. UPS.Load = atoi(value);
  17835. memset(value, 0, 10);
  17836. 8027c58: 220a movs r2, #10
  17837. 8027c5a: 2100 movs r1, #0
  17838. memset(value, 0, 10);
  17839. endValue = strpbrk(data," ");
  17840. len = endValue - data;
  17841. strncpy(value, data, len);
  17842. data += (len + 1);
  17843. UPS.Load = atoi(value);
  17844. 8027c5c: 7420 strb r0, [r4, #16]
  17845. memset(value, 0, 10);
  17846. 8027c5e: a801 add r0, sp, #4
  17847. 8027c60: f7f9 fdaa bl 80217b8 <memset>
  17848. endValue = strpbrk(data," ");
  17849. 8027c64: 4630 mov r0, r6
  17850. 8027c66: 491d ldr r1, [pc, #116] ; (8027cdc <ups_status_response+0x148>)
  17851. 8027c68: f7fa f868 bl 8021d3c <strpbrk>
  17852. len = endValue - data;
  17853. 8027c6c: 1b80 subs r0, r0, r6
  17854. void ups_megatec_init(void) {
  17855. init_UPS_value();
  17856. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  17857. }
  17858. 8027c6e: b2c5 uxtb r5, r0
  17859. UPS.Load = atoi(value);
  17860. memset(value, 0, 10);
  17861. endValue = strpbrk(data," ");
  17862. len = endValue - data;
  17863. strncpy(value, data, len);
  17864. 8027c70: 462a mov r2, r5
  17865. 8027c72: 4631 mov r1, r6
  17866. 8027c74: a801 add r0, sp, #4
  17867. 8027c76: f7fa f82f bl 8021cd8 <strncpy>
  17868. data += (len + 1);
  17869. UPS.Freq_in = atof(value);
  17870. 8027c7a: a801 add r0, sp, #4
  17871. 8027c7c: f7f9 fc78 bl 8021570 <atof>
  17872. 8027c80: f7f8 ff60 bl 8020b44 <__aeabi_d2f>
  17873. memset(value, 0, 10);
  17874. endValue = strpbrk(data," ");
  17875. len = endValue - data;
  17876. strncpy(value, data, len);
  17877. data += (len + 1);
  17878. 8027c84: 3501 adds r5, #1
  17879. 8027c86: 1975 adds r5, r6, r5
  17880. UPS.Freq_in = atof(value);
  17881. //TODO
  17882. memset(value, 0, 10);
  17883. 8027c88: 220a movs r2, #10
  17884. memset(value, 0, 10);
  17885. endValue = strpbrk(data," ");
  17886. len = endValue - data;
  17887. strncpy(value, data, len);
  17888. data += (len + 1);
  17889. UPS.Freq_in = atof(value);
  17890. 8027c8a: 6020 str r0, [r4, #0]
  17891. //TODO
  17892. memset(value, 0, 10);
  17893. 8027c8c: 2100 movs r1, #0
  17894. 8027c8e: a801 add r0, sp, #4
  17895. 8027c90: f7f9 fd92 bl 80217b8 <memset>
  17896. endValue = strpbrk(data," ");
  17897. 8027c94: 4628 mov r0, r5
  17898. 8027c96: 4911 ldr r1, [pc, #68] ; (8027cdc <ups_status_response+0x148>)
  17899. 8027c98: f7fa f850 bl 8021d3c <strpbrk>
  17900. len = endValue - data;
  17901. 8027c9c: 1b40 subs r0, r0, r5
  17902. void ups_megatec_init(void) {
  17903. init_UPS_value();
  17904. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  17905. }
  17906. 8027c9e: b2c6 uxtb r6, r0
  17907. //TODO
  17908. memset(value, 0, 10);
  17909. endValue = strpbrk(data," ");
  17910. len = endValue - data;
  17911. strncpy(value, data, len);
  17912. 8027ca0: 4629 mov r1, r5
  17913. 8027ca2: 4632 mov r2, r6
  17914. 8027ca4: a801 add r0, sp, #4
  17915. data += (len + 1);
  17916. 8027ca6: 3601 adds r6, #1
  17917. //TODO
  17918. memset(value, 0, 10);
  17919. endValue = strpbrk(data," ");
  17920. len = endValue - data;
  17921. strncpy(value, data, len);
  17922. 8027ca8: f7fa f816 bl 8021cd8 <strncpy>
  17923. data += (len + 1);
  17924. 8027cac: 19ad adds r5, r5, r6
  17925. memset(value, 0, 10);
  17926. 8027cae: 220a movs r2, #10
  17927. 8027cb0: 2100 movs r1, #0
  17928. 8027cb2: a801 add r0, sp, #4
  17929. 8027cb4: f7f9 fd80 bl 80217b8 <memset>
  17930. endValue = strpbrk(data," ");
  17931. 8027cb8: 4908 ldr r1, [pc, #32] ; (8027cdc <ups_status_response+0x148>)
  17932. 8027cba: 4628 mov r0, r5
  17933. 8027cbc: f7fa f83e bl 8021d3c <strpbrk>
  17934. len = endValue - data;
  17935. 8027cc0: 1b42 subs r2, r0, r5
  17936. strncpy(value, data, len);
  17937. 8027cc2: b2d2 uxtb r2, r2
  17938. 8027cc4: 4629 mov r1, r5
  17939. 8027cc6: a801 add r0, sp, #4
  17940. 8027cc8: f7fa f806 bl 8021cd8 <strncpy>
  17941. data += (len + 1);
  17942. UPS.Temp = atof(value);
  17943. 8027ccc: a801 add r0, sp, #4
  17944. 8027cce: f7f9 fc4f bl 8021570 <atof>
  17945. 8027cd2: f7f8 ff37 bl 8020b44 <__aeabi_d2f>
  17946. 8027cd6: 60e0 str r0, [r4, #12]
  17947. //TODO
  17948. }
  17949. 8027cd8: e8bd 81ff ldmia.w sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, pc}
  17950. 8027cdc: 08033ec0 .word 0x08033ec0
  17951. 8027ce0: 2000e858 .word 0x2000e858
  17952. 08027ce4 <request_task>:
  17953. break;
  17954. }
  17955. }
  17956. void request_task(void)
  17957. {
  17958. 8027ce4: b508 push {r3, lr}
  17959. for(;;)
  17960. {
  17961. send_MegaTec_cmd(ups_status_req);
  17962. 8027ce6: 2000 movs r0, #0
  17963. 8027ce8: f7ff ff1e bl 8027b28 <send_MegaTec_cmd>
  17964. if (ups_megatec_rx_pdu())
  17965. 8027cec: f7ff ff32 bl 8027b54 <ups_megatec_rx_pdu>
  17966. 8027cf0: b110 cbz r0, 8027cf8 <request_task+0x14>
  17967. void ups_megatec_process_pdu(cmdMegaTecEnums_t command)
  17968. {
  17969. switch(command)
  17970. {
  17971. case ups_status_req:
  17972. ups_status_response(ups_pdu.data);
  17973. 8027cf2: 4804 ldr r0, [pc, #16] ; (8027d04 <request_task+0x20>)
  17974. 8027cf4: f7ff ff4e bl 8027b94 <ups_status_response>
  17975. {
  17976. send_MegaTec_cmd(ups_status_req);
  17977. if (ups_megatec_rx_pdu())
  17978. ups_megatec_process_pdu(ups_status_req);
  17979. vTaskDelay(1000);
  17980. 8027cf8: f44f 707a mov.w r0, #1000 ; 0x3e8
  17981. 8027cfc: f000 fe2a bl 8028954 <vTaskDelay>
  17982. }
  17983. 8027d00: e7f1 b.n 8027ce6 <request_task+0x2>
  17984. 8027d02: bf00 nop
  17985. 8027d04: 200028a2 .word 0x200028a2
  17986. 08027d08 <ups_megatec_init>:
  17987. }
  17988. void ups_megatec_init(void) {
  17989. 8027d08: b51f push {r0, r1, r2, r3, r4, lr}
  17990. init_UPS_value();
  17991. 8027d0a: f7ff fefd bl 8027b08 <init_UPS_value>
  17992. xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  17993. 8027d0e: 2300 movs r3, #0
  17994. 8027d10: 9300 str r3, [sp, #0]
  17995. 8027d12: 9301 str r3, [sp, #4]
  17996. 8027d14: 9302 str r3, [sp, #8]
  17997. 8027d16: 9303 str r3, [sp, #12]
  17998. 8027d18: 4903 ldr r1, [pc, #12] ; (8027d28 <ups_megatec_init+0x20>)
  17999. 8027d1a: 4804 ldr r0, [pc, #16] ; (8027d2c <ups_megatec_init+0x24>)
  18000. 8027d1c: f44f 7280 mov.w r2, #256 ; 0x100
  18001. 8027d20: f000 fb82 bl 8028428 <xTaskGenericCreate>
  18002. }
  18003. 8027d24: b005 add sp, #20
  18004. 8027d26: bd00 pop {pc}
  18005. 8027d28: 08033ec2 .word 0x08033ec2
  18006. 8027d2c: 08027ce5 .word 0x08027ce5
  18007. 08027d30 <rbuf32_init>:
  18008. #define _size_w(n) sizeof(n) / sizeof(int)
  18009. void rbuf32_init(rbuf_t *rbuf32, uint32_t *buffer, uint32_t size) {
  18010. rbuf32->buf_ptr = buffer;
  18011. rbuf32->size = size;
  18012. rbuf32->read_index = 0;
  18013. 8027d30: 2300 movs r3, #0
  18014. #define _size_w(n) sizeof(n) / sizeof(int)
  18015. void rbuf32_init(rbuf_t *rbuf32, uint32_t *buffer, uint32_t size) {
  18016. rbuf32->buf_ptr = buffer;
  18017. rbuf32->size = size;
  18018. 8027d32: e880 0006 stmia.w r0, {r1, r2}
  18019. rbuf32->read_index = 0;
  18020. 8027d36: 6083 str r3, [r0, #8]
  18021. rbuf32->write_index = 0;
  18022. 8027d38: 60c3 str r3, [r0, #12]
  18023. 8027d3a: 4770 bx lr
  18024. 08027d3c <rbuf_isfull>:
  18025. return full_space;
  18026. }
  18027. bool rbuf_isfull(rbuf_t *rbuf) {
  18028. int r_tmp;
  18029. if (rbuf->write_index == (rbuf->size - 1)) {
  18030. 8027d3c: 6842 ldr r2, [r0, #4]
  18031. 8027d3e: 68c3 ldr r3, [r0, #12]
  18032. 8027d40: 6880 ldr r0, [r0, #8]
  18033. 8027d42: 1e51 subs r1, r2, #1
  18034. 8027d44: 428b cmp r3, r1
  18035. r_tmp = rbuf->read_index + rbuf->size;
  18036. 8027d46: bf08 it eq
  18037. 8027d48: 1810 addeq r0, r2, r0
  18038. }
  18039. else
  18040. r_tmp = rbuf->read_index;
  18041. if (r_tmp - rbuf->write_index == 1)
  18042. 8027d4a: 1ac0 subs r0, r0, r3
  18043. return true;
  18044. else
  18045. return false;
  18046. }
  18047. 8027d4c: 1e42 subs r2, r0, #1
  18048. 8027d4e: 4250 negs r0, r2
  18049. 8027d50: 4150 adcs r0, r2
  18050. 8027d52: 4770 bx lr
  18051. 08027d54 <rbuf32_get>:
  18052. rbuf64->read_index = 0;
  18053. rbuf64->write_index = 0;
  18054. }
  18055. bool rbuf_isempty(rbuf_t *rbuf) {
  18056. if (rbuf->read_index == rbuf->write_index)
  18057. 8027d54: 6883 ldr r3, [r0, #8]
  18058. 8027d56: 68c2 ldr r2, [r0, #12]
  18059. 8027d58: 4293 cmp r3, r2
  18060. 8027d5a: d105 bne.n 8027d68 <rbuf32_get+0x14>
  18061. 8027d5c: e002 b.n 8027d64 <rbuf32_get+0x10>
  18062. /* Check whether buffer is not empty */
  18063. if (!rbuf_isempty(rbuf32)) {
  18064. *data = rbuf32->buf_ptr[rbuf32->read_index++];
  18065. /* swap the read pointer */
  18066. if (rbuf32->read_index == (rbuf32->size))
  18067. rbuf32->read_index = 0;
  18068. 8027d5e: 2300 movs r3, #0
  18069. 8027d60: 6083 str r3, [r0, #8]
  18070. 8027d62: e00a b.n 8027d7a <rbuf32_get+0x26>
  18071. return true;
  18072. }
  18073. else
  18074. return false;
  18075. 8027d64: 2000 movs r0, #0
  18076. 8027d66: 4770 bx lr
  18077. }
  18078. bool rbuf32_get(rbuf_t *rbuf32, uint32_t *data) {
  18079. /* Check whether buffer is not empty */
  18080. if (!rbuf_isempty(rbuf32)) {
  18081. *data = rbuf32->buf_ptr[rbuf32->read_index++];
  18082. 8027d68: 6802 ldr r2, [r0, #0]
  18083. 8027d6a: f852 2023 ldr.w r2, [r2, r3, lsl #2]
  18084. 8027d6e: 600a str r2, [r1, #0]
  18085. /* swap the read pointer */
  18086. if (rbuf32->read_index == (rbuf32->size))
  18087. 8027d70: 6842 ldr r2, [r0, #4]
  18088. }
  18089. bool rbuf32_get(rbuf_t *rbuf32, uint32_t *data) {
  18090. /* Check whether buffer is not empty */
  18091. if (!rbuf_isempty(rbuf32)) {
  18092. *data = rbuf32->buf_ptr[rbuf32->read_index++];
  18093. 8027d72: 3301 adds r3, #1
  18094. /* swap the read pointer */
  18095. if (rbuf32->read_index == (rbuf32->size))
  18096. 8027d74: 4293 cmp r3, r2
  18097. }
  18098. bool rbuf32_get(rbuf_t *rbuf32, uint32_t *data) {
  18099. /* Check whether buffer is not empty */
  18100. if (!rbuf_isempty(rbuf32)) {
  18101. *data = rbuf32->buf_ptr[rbuf32->read_index++];
  18102. 8027d76: 6083 str r3, [r0, #8]
  18103. /* swap the read pointer */
  18104. if (rbuf32->read_index == (rbuf32->size))
  18105. 8027d78: d0f1 beq.n 8027d5e <rbuf32_get+0xa>
  18106. rbuf32->read_index = 0;
  18107. return true;
  18108. 8027d7a: 2001 movs r0, #1
  18109. }
  18110. else
  18111. return false;
  18112. }
  18113. 8027d7c: 4770 bx lr
  18114. 08027d7e <rbuf32_put>:
  18115. /*
  18116. * Oldest data is overwriting when write_ptr reaches read_ptr - 1 (!).
  18117. * For check use rbuf_isfull.
  18118. */
  18119. bool rbuf32_put(rbuf_t *rbuf32, uint32_t data) {
  18120. 8027d7e: b538 push {r3, r4, r5, lr}
  18121. 8027d80: 4604 mov r4, r0
  18122. 8027d82: 460d mov r5, r1
  18123. if(!rbuf_isfull(rbuf32))
  18124. 8027d84: f7ff ffda bl 8027d3c <rbuf_isfull>
  18125. 8027d88: b950 cbnz r0, 8027da0 <rbuf32_put+0x22>
  18126. {
  18127. rbuf32->buf_ptr[rbuf32->write_index++] = data;
  18128. 8027d8a: 68e3 ldr r3, [r4, #12]
  18129. 8027d8c: 6822 ldr r2, [r4, #0]
  18130. 8027d8e: f842 5023 str.w r5, [r2, r3, lsl #2]
  18131. /* swap the write pointer */
  18132. if (rbuf32->write_index == (rbuf32->size))
  18133. 8027d92: 6862 ldr r2, [r4, #4]
  18134. */
  18135. bool rbuf32_put(rbuf_t *rbuf32, uint32_t data) {
  18136. if(!rbuf_isfull(rbuf32))
  18137. {
  18138. rbuf32->buf_ptr[rbuf32->write_index++] = data;
  18139. 8027d94: 3301 adds r3, #1
  18140. /* swap the write pointer */
  18141. if (rbuf32->write_index == (rbuf32->size))
  18142. 8027d96: 4293 cmp r3, r2
  18143. */
  18144. bool rbuf32_put(rbuf_t *rbuf32, uint32_t data) {
  18145. if(!rbuf_isfull(rbuf32))
  18146. {
  18147. rbuf32->buf_ptr[rbuf32->write_index++] = data;
  18148. 8027d98: 60e3 str r3, [r4, #12]
  18149. /* swap the write pointer */
  18150. if (rbuf32->write_index == (rbuf32->size))
  18151. 8027d9a: d103 bne.n 8027da4 <rbuf32_put+0x26>
  18152. rbuf32->write_index = 0;
  18153. 8027d9c: 60e0 str r0, [r4, #12]
  18154. 8027d9e: e001 b.n 8027da4 <rbuf32_put+0x26>
  18155. return true;
  18156. }
  18157. else
  18158. return false;
  18159. 8027da0: 2000 movs r0, #0
  18160. 8027da2: bd38 pop {r3, r4, r5, pc}
  18161. bool rbuf32_put(rbuf_t *rbuf32, uint32_t data) {
  18162. if(!rbuf_isfull(rbuf32))
  18163. {
  18164. rbuf32->buf_ptr[rbuf32->write_index++] = data;
  18165. /* swap the write pointer */
  18166. if (rbuf32->write_index == (rbuf32->size))
  18167. 8027da4: 2001 movs r0, #1
  18168. rbuf32->write_index = 0;
  18169. return true;
  18170. }
  18171. else
  18172. return false;
  18173. }
  18174. 8027da6: bd38 pop {r3, r4, r5, pc}
  18175. 08027da8 <vListInitialise>:
  18176. void vListInitialise( List_t * const pxList )
  18177. {
  18178. /* The list structure contains a list item which is used to mark the
  18179. end of the list. To initialise the list the list end is inserted
  18180. as the only list entry. */
  18181. 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. */
  18182. 8027da8: f100 0308 add.w r3, r0, #8
  18183. 8027dac: 6043 str r3, [r0, #4]
  18184. /* The list end value is the highest possible value in the list to
  18185. ensure it remains at the end of the list. */
  18186. pxList->xListEnd.xItemValue = portMAX_DELAY;
  18187. 8027dae: f04f 32ff mov.w r2, #4294967295
  18188. /* The list end next and previous pointers point to itself so we know
  18189. when the list is empty. */
  18190. 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. */
  18191. 8027db2: 60c3 str r3, [r0, #12]
  18192. 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. */
  18193. 8027db4: 6103 str r3, [r0, #16]
  18194. pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
  18195. 8027db6: 2300 movs r3, #0
  18196. as the only list entry. */
  18197. 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. */
  18198. /* The list end value is the highest possible value in the list to
  18199. ensure it remains at the end of the list. */
  18200. pxList->xListEnd.xItemValue = portMAX_DELAY;
  18201. 8027db8: 6082 str r2, [r0, #8]
  18202. /* The list end next and previous pointers point to itself so we know
  18203. when the list is empty. */
  18204. 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. */
  18205. 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. */
  18206. pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
  18207. 8027dba: 6003 str r3, [r0, #0]
  18208. 8027dbc: 4770 bx lr
  18209. 08027dbe <vListInitialiseItem>:
  18210. /*-----------------------------------------------------------*/
  18211. void vListInitialiseItem( ListItem_t * const pxItem )
  18212. {
  18213. /* Make sure the list item is not recorded as being on a list. */
  18214. pxItem->pvContainer = NULL;
  18215. 8027dbe: 2300 movs r3, #0
  18216. 8027dc0: 6103 str r3, [r0, #16]
  18217. 8027dc2: 4770 bx lr
  18218. 08027dc4 <vListInsertEnd>:
  18219. }
  18220. /*-----------------------------------------------------------*/
  18221. void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem )
  18222. {
  18223. ListItem_t * const pxIndex = pxList->pxIndex;
  18224. 8027dc4: 6843 ldr r3, [r0, #4]
  18225. pxNewListItem->pxPrevious = pxIndex->pxPrevious;
  18226. pxIndex->pxPrevious->pxNext = pxNewListItem;
  18227. pxIndex->pxPrevious = pxNewListItem;
  18228. /* Remember which list the item is in. */
  18229. pxNewListItem->pvContainer = ( void * ) pxList;
  18230. 8027dc6: 6108 str r0, [r1, #16]
  18231. /* Insert a new list item into pxList, but rather than sort the list,
  18232. makes the new list item the last item to be removed by a call to
  18233. listGET_OWNER_OF_NEXT_ENTRY(). */
  18234. pxNewListItem->pxNext = pxIndex;
  18235. pxNewListItem->pxPrevious = pxIndex->pxPrevious;
  18236. 8027dc8: 689a ldr r2, [r3, #8]
  18237. listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );
  18238. /* Insert a new list item into pxList, but rather than sort the list,
  18239. makes the new list item the last item to be removed by a call to
  18240. listGET_OWNER_OF_NEXT_ENTRY(). */
  18241. pxNewListItem->pxNext = pxIndex;
  18242. 8027dca: 604b str r3, [r1, #4]
  18243. pxNewListItem->pxPrevious = pxIndex->pxPrevious;
  18244. 8027dcc: 608a str r2, [r1, #8]
  18245. pxIndex->pxPrevious->pxNext = pxNewListItem;
  18246. 8027dce: 689a ldr r2, [r3, #8]
  18247. pxIndex->pxPrevious = pxNewListItem;
  18248. 8027dd0: 6099 str r1, [r3, #8]
  18249. /* Remember which list the item is in. */
  18250. pxNewListItem->pvContainer = ( void * ) pxList;
  18251. ( pxList->uxNumberOfItems )++;
  18252. 8027dd2: 6803 ldr r3, [r0, #0]
  18253. /* Insert a new list item into pxList, but rather than sort the list,
  18254. makes the new list item the last item to be removed by a call to
  18255. listGET_OWNER_OF_NEXT_ENTRY(). */
  18256. pxNewListItem->pxNext = pxIndex;
  18257. pxNewListItem->pxPrevious = pxIndex->pxPrevious;
  18258. pxIndex->pxPrevious->pxNext = pxNewListItem;
  18259. 8027dd4: 6051 str r1, [r2, #4]
  18260. pxIndex->pxPrevious = pxNewListItem;
  18261. /* Remember which list the item is in. */
  18262. pxNewListItem->pvContainer = ( void * ) pxList;
  18263. ( pxList->uxNumberOfItems )++;
  18264. 8027dd6: 3301 adds r3, #1
  18265. 8027dd8: 6003 str r3, [r0, #0]
  18266. 8027dda: 4770 bx lr
  18267. 08027ddc <vListInsert>:
  18268. /*-----------------------------------------------------------*/
  18269. void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )
  18270. {
  18271. ListItem_t *pxIterator;
  18272. const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
  18273. 8027ddc: 680a ldr r2, [r1, #0]
  18274. new list item should be placed after it. This ensures that TCB's which are
  18275. stored in ready lists (all of which have the same xItemValue value) get a
  18276. share of the CPU. However, if the xItemValue is the same as the back marker
  18277. the iteration loop below will not end. Therefore the value is checked
  18278. first, and the algorithm slightly modified if necessary. */
  18279. if( xValueOfInsertion == portMAX_DELAY )
  18280. 8027dde: 1c53 adds r3, r2, #1
  18281. ( pxList->uxNumberOfItems )++;
  18282. }
  18283. /*-----------------------------------------------------------*/
  18284. void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )
  18285. {
  18286. 8027de0: b530 push {r4, r5, lr}
  18287. new list item should be placed after it. This ensures that TCB's which are
  18288. stored in ready lists (all of which have the same xItemValue value) get a
  18289. share of the CPU. However, if the xItemValue is the same as the back marker
  18290. the iteration loop below will not end. Therefore the value is checked
  18291. first, and the algorithm slightly modified if necessary. */
  18292. if( xValueOfInsertion == portMAX_DELAY )
  18293. 8027de2: d101 bne.n 8027de8 <vListInsert+0xc>
  18294. {
  18295. pxIterator = pxList->xListEnd.pxPrevious;
  18296. 8027de4: 6903 ldr r3, [r0, #16]
  18297. 8027de6: e007 b.n 8027df8 <vListInsert+0x1c>
  18298. 4) Using a queue or semaphore before it has been initialised or
  18299. before the scheduler has been started (are interrupts firing
  18300. before vTaskStartScheduler() has been called?).
  18301. **********************************************************************/
  18302. 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. */
  18303. 8027de8: f100 0308 add.w r3, r0, #8
  18304. 8027dec: e000 b.n 8027df0 <vListInsert+0x14>
  18305. 8027dee: 4623 mov r3, r4
  18306. 8027df0: 685c ldr r4, [r3, #4]
  18307. 8027df2: 6825 ldr r5, [r4, #0]
  18308. 8027df4: 4295 cmp r5, r2
  18309. 8027df6: d9fa bls.n 8027dee <vListInsert+0x12>
  18310. /* There is nothing to do here, just iterating to the wanted
  18311. insertion position. */
  18312. }
  18313. }
  18314. pxNewListItem->pxNext = pxIterator->pxNext;
  18315. 8027df8: 685a ldr r2, [r3, #4]
  18316. pxNewListItem->pxPrevious = pxIterator;
  18317. pxIterator->pxNext = pxNewListItem;
  18318. /* Remember which list the item is in. This allows fast removal of the
  18319. item later. */
  18320. pxNewListItem->pvContainer = ( void * ) pxList;
  18321. 8027dfa: 6108 str r0, [r1, #16]
  18322. /* There is nothing to do here, just iterating to the wanted
  18323. insertion position. */
  18324. }
  18325. }
  18326. pxNewListItem->pxNext = pxIterator->pxNext;
  18327. 8027dfc: 604a str r2, [r1, #4]
  18328. pxNewListItem->pxNext->pxPrevious = pxNewListItem;
  18329. 8027dfe: 6091 str r1, [r2, #8]
  18330. pxNewListItem->pxPrevious = pxIterator;
  18331. pxIterator->pxNext = pxNewListItem;
  18332. 8027e00: 6059 str r1, [r3, #4]
  18333. }
  18334. }
  18335. pxNewListItem->pxNext = pxIterator->pxNext;
  18336. pxNewListItem->pxNext->pxPrevious = pxNewListItem;
  18337. pxNewListItem->pxPrevious = pxIterator;
  18338. 8027e02: 608b str r3, [r1, #8]
  18339. /* Remember which list the item is in. This allows fast removal of the
  18340. item later. */
  18341. pxNewListItem->pvContainer = ( void * ) pxList;
  18342. ( pxList->uxNumberOfItems )++;
  18343. 8027e04: 6803 ldr r3, [r0, #0]
  18344. 8027e06: 3301 adds r3, #1
  18345. 8027e08: 6003 str r3, [r0, #0]
  18346. 8027e0a: bd30 pop {r4, r5, pc}
  18347. 08027e0c <uxListRemove>:
  18348. {
  18349. /* The list item knows which list it is in. Obtain the list from the list
  18350. item. */
  18351. List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;
  18352. pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
  18353. 8027e0c: 6841 ldr r1, [r0, #4]
  18354. 8027e0e: 6882 ldr r2, [r0, #8]
  18355. UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
  18356. {
  18357. /* The list item knows which list it is in. Obtain the list from the list
  18358. item. */
  18359. List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;
  18360. 8027e10: 6903 ldr r3, [r0, #16]
  18361. pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
  18362. 8027e12: 608a str r2, [r1, #8]
  18363. pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;
  18364. 8027e14: 6882 ldr r2, [r0, #8]
  18365. 8027e16: 6051 str r1, [r2, #4]
  18366. /* Make sure the index is left pointing to a valid item. */
  18367. if( pxList->pxIndex == pxItemToRemove )
  18368. 8027e18: 6859 ldr r1, [r3, #4]
  18369. 8027e1a: 4281 cmp r1, r0
  18370. {
  18371. pxList->pxIndex = pxItemToRemove->pxPrevious;
  18372. 8027e1c: bf08 it eq
  18373. 8027e1e: 605a streq r2, [r3, #4]
  18374. else
  18375. {
  18376. mtCOVERAGE_TEST_MARKER();
  18377. }
  18378. pxItemToRemove->pvContainer = NULL;
  18379. 8027e20: 2200 movs r2, #0
  18380. 8027e22: 6102 str r2, [r0, #16]
  18381. ( pxList->uxNumberOfItems )--;
  18382. 8027e24: 6818 ldr r0, [r3, #0]
  18383. 8027e26: 3801 subs r0, #1
  18384. 8027e28: 6018 str r0, [r3, #0]
  18385. return pxList->uxNumberOfItems;
  18386. }
  18387. 8027e2a: 4770 bx lr
  18388. 08027e2c <prvCopyDataFromQueue>:
  18389. }
  18390. /*-----------------------------------------------------------*/
  18391. static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer )
  18392. {
  18393. if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )
  18394. 8027e2c: 6c02 ldr r2, [r0, #64] ; 0x40
  18395. return xReturn;
  18396. }
  18397. /*-----------------------------------------------------------*/
  18398. static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer )
  18399. {
  18400. 8027e2e: b530 push {r4, r5, lr}
  18401. 8027e30: 4603 mov r3, r0
  18402. if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )
  18403. 8027e32: b16a cbz r2, 8027e50 <prvCopyDataFromQueue+0x24>
  18404. {
  18405. pxQueue->u.pcReadFrom += pxQueue->uxItemSize;
  18406. 8027e34: 68c4 ldr r4, [r0, #12]
  18407. if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */
  18408. 8027e36: 6845 ldr r5, [r0, #4]
  18409. static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer )
  18410. {
  18411. if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )
  18412. {
  18413. pxQueue->u.pcReadFrom += pxQueue->uxItemSize;
  18414. 8027e38: 18a4 adds r4, r4, r2
  18415. if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */
  18416. 8027e3a: 42ac cmp r4, r5
  18417. static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer )
  18418. {
  18419. if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )
  18420. {
  18421. pxQueue->u.pcReadFrom += pxQueue->uxItemSize;
  18422. 8027e3c: 60c4 str r4, [r0, #12]
  18423. if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */
  18424. {
  18425. pxQueue->u.pcReadFrom = pxQueue->pcHead;
  18426. 8027e3e: bf24 itt cs
  18427. 8027e40: 6804 ldrcs r4, [r0, #0]
  18428. 8027e42: 60c4 strcs r4, [r0, #12]
  18429. }
  18430. else
  18431. {
  18432. mtCOVERAGE_TEST_MARKER();
  18433. }
  18434. ( 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. */
  18435. 8027e44: 4608 mov r0, r1
  18436. 8027e46: 68d9 ldr r1, [r3, #12]
  18437. }
  18438. }
  18439. 8027e48: e8bd 4030 ldmia.w sp!, {r4, r5, lr}
  18440. }
  18441. else
  18442. {
  18443. mtCOVERAGE_TEST_MARKER();
  18444. }
  18445. ( 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. */
  18446. 8027e4c: f7f9 bbfa b.w 8021644 <memcpy>
  18447. 8027e50: bd30 pop {r4, r5, pc}
  18448. 08027e52 <prvUnlockQueue>:
  18449. }
  18450. }
  18451. /*-----------------------------------------------------------*/
  18452. static void prvUnlockQueue( Queue_t * const pxQueue )
  18453. {
  18454. 8027e52: b538 push {r3, r4, r5, lr}
  18455. 8027e54: 4604 mov r4, r0
  18456. {
  18457. /* Tasks that are removed from the event list will get added to
  18458. the pending ready list as the scheduler is still suspended. */
  18459. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  18460. {
  18461. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  18462. 8027e56: f104 0524 add.w r5, r4, #36 ; 0x24
  18463. /* The lock counts contains the number of extra data items placed or
  18464. removed from the queue while the queue was locked. When a queue is
  18465. locked items can be added or removed, but the event lists cannot be
  18466. updated. */
  18467. taskENTER_CRITICAL();
  18468. 8027e5a: f000 ff6b bl 8028d34 <vPortEnterCritical>
  18469. {
  18470. /* See if data was added to the queue while it was locked. */
  18471. while( pxQueue->xTxLock > queueLOCKED_UNMODIFIED )
  18472. 8027e5e: e00a b.n 8027e76 <prvUnlockQueue+0x24>
  18473. }
  18474. #else /* configUSE_QUEUE_SETS */
  18475. {
  18476. /* Tasks that are removed from the event list will get added to
  18477. the pending ready list as the scheduler is still suspended. */
  18478. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  18479. 8027e60: 6a63 ldr r3, [r4, #36] ; 0x24
  18480. 8027e62: b15b cbz r3, 8027e7c <prvUnlockQueue+0x2a>
  18481. {
  18482. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  18483. 8027e64: 4628 mov r0, r5
  18484. 8027e66: f000 fe0b bl 8028a80 <xTaskRemoveFromEventList>
  18485. 8027e6a: b108 cbz r0, 8027e70 <prvUnlockQueue+0x1e>
  18486. {
  18487. /* The task waiting has a higher priority so record that a
  18488. context switch is required. */
  18489. vTaskMissedYield();
  18490. 8027e6c: f000 fe82 bl 8028b74 <vTaskMissedYield>
  18491. break;
  18492. }
  18493. }
  18494. #endif /* configUSE_QUEUE_SETS */
  18495. --( pxQueue->xTxLock );
  18496. 8027e70: 6ca3 ldr r3, [r4, #72] ; 0x48
  18497. 8027e72: 3b01 subs r3, #1
  18498. 8027e74: 64a3 str r3, [r4, #72] ; 0x48
  18499. locked items can be added or removed, but the event lists cannot be
  18500. updated. */
  18501. taskENTER_CRITICAL();
  18502. {
  18503. /* See if data was added to the queue while it was locked. */
  18504. while( pxQueue->xTxLock > queueLOCKED_UNMODIFIED )
  18505. 8027e76: 6ca3 ldr r3, [r4, #72] ; 0x48
  18506. 8027e78: 2b00 cmp r3, #0
  18507. 8027e7a: dcf1 bgt.n 8027e60 <prvUnlockQueue+0xe>
  18508. #endif /* configUSE_QUEUE_SETS */
  18509. --( pxQueue->xTxLock );
  18510. }
  18511. pxQueue->xTxLock = queueUNLOCKED;
  18512. 8027e7c: f04f 33ff mov.w r3, #4294967295
  18513. 8027e80: 64a3 str r3, [r4, #72] ; 0x48
  18514. }
  18515. taskEXIT_CRITICAL();
  18516. 8027e82: f000 ff83 bl 8028d8c <vPortExitCritical>
  18517. {
  18518. while( pxQueue->xRxLock > queueLOCKED_UNMODIFIED )
  18519. {
  18520. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  18521. {
  18522. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
  18523. 8027e86: f104 0510 add.w r5, r4, #16
  18524. pxQueue->xTxLock = queueUNLOCKED;
  18525. }
  18526. taskEXIT_CRITICAL();
  18527. /* Do the same for the Rx lock. */
  18528. taskENTER_CRITICAL();
  18529. 8027e8a: f000 ff53 bl 8028d34 <vPortEnterCritical>
  18530. {
  18531. while( pxQueue->xRxLock > queueLOCKED_UNMODIFIED )
  18532. 8027e8e: e00a b.n 8027ea6 <prvUnlockQueue+0x54>
  18533. {
  18534. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  18535. 8027e90: 6923 ldr r3, [r4, #16]
  18536. 8027e92: b15b cbz r3, 8027eac <prvUnlockQueue+0x5a>
  18537. {
  18538. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
  18539. 8027e94: 4628 mov r0, r5
  18540. 8027e96: f000 fdf3 bl 8028a80 <xTaskRemoveFromEventList>
  18541. 8027e9a: b108 cbz r0, 8027ea0 <prvUnlockQueue+0x4e>
  18542. {
  18543. vTaskMissedYield();
  18544. 8027e9c: f000 fe6a bl 8028b74 <vTaskMissedYield>
  18545. else
  18546. {
  18547. mtCOVERAGE_TEST_MARKER();
  18548. }
  18549. --( pxQueue->xRxLock );
  18550. 8027ea0: 6c63 ldr r3, [r4, #68] ; 0x44
  18551. 8027ea2: 3b01 subs r3, #1
  18552. 8027ea4: 6463 str r3, [r4, #68] ; 0x44
  18553. taskEXIT_CRITICAL();
  18554. /* Do the same for the Rx lock. */
  18555. taskENTER_CRITICAL();
  18556. {
  18557. while( pxQueue->xRxLock > queueLOCKED_UNMODIFIED )
  18558. 8027ea6: 6c63 ldr r3, [r4, #68] ; 0x44
  18559. 8027ea8: 2b00 cmp r3, #0
  18560. 8027eaa: dcf1 bgt.n 8027e90 <prvUnlockQueue+0x3e>
  18561. {
  18562. break;
  18563. }
  18564. }
  18565. pxQueue->xRxLock = queueUNLOCKED;
  18566. 8027eac: f04f 33ff mov.w r3, #4294967295
  18567. 8027eb0: 6463 str r3, [r4, #68] ; 0x44
  18568. }
  18569. taskEXIT_CRITICAL();
  18570. }
  18571. 8027eb2: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  18572. }
  18573. }
  18574. pxQueue->xRxLock = queueUNLOCKED;
  18575. }
  18576. taskEXIT_CRITICAL();
  18577. 8027eb6: f000 bf69 b.w 8028d8c <vPortExitCritical>
  18578. 08027eba <prvCopyDataToQueue>:
  18579. #endif /* configUSE_TRACE_FACILITY */
  18580. /*-----------------------------------------------------------*/
  18581. static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
  18582. {
  18583. 8027eba: b538 push {r3, r4, r5, lr}
  18584. 8027ebc: 4615 mov r5, r2
  18585. BaseType_t xReturn = pdFALSE;
  18586. if( pxQueue->uxItemSize == ( UBaseType_t ) 0 )
  18587. 8027ebe: 6c02 ldr r2, [r0, #64] ; 0x40
  18588. #endif /* configUSE_TRACE_FACILITY */
  18589. /*-----------------------------------------------------------*/
  18590. static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
  18591. {
  18592. 8027ec0: 4604 mov r4, r0
  18593. BaseType_t xReturn = pdFALSE;
  18594. if( pxQueue->uxItemSize == ( UBaseType_t ) 0 )
  18595. 8027ec2: b93a cbnz r2, 8027ed4 <prvCopyDataToQueue+0x1a>
  18596. {
  18597. #if ( configUSE_MUTEXES == 1 )
  18598. {
  18599. if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )
  18600. 8027ec4: 6805 ldr r5, [r0, #0]
  18601. 8027ec6: b105 cbz r5, 8027eca <prvCopyDataToQueue+0x10>
  18602. 8027ec8: e028 b.n 8027f1c <prvCopyDataToQueue+0x62>
  18603. {
  18604. /* The mutex is no longer being held. */
  18605. xReturn = xTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder );
  18606. 8027eca: 6840 ldr r0, [r0, #4]
  18607. 8027ecc: f000 fea4 bl 8028c18 <xTaskPriorityDisinherit>
  18608. pxQueue->pxMutexHolder = NULL;
  18609. 8027ed0: 6065 str r5, [r4, #4]
  18610. 8027ed2: e024 b.n 8027f1e <prvCopyDataToQueue+0x64>
  18611. mtCOVERAGE_TEST_MARKER();
  18612. }
  18613. }
  18614. #endif /* configUSE_MUTEXES */
  18615. }
  18616. else if( xPosition == queueSEND_TO_BACK )
  18617. 8027ed4: b96d cbnz r5, 8027ef2 <prvCopyDataToQueue+0x38>
  18618. {
  18619. ( 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. */
  18620. 8027ed6: 6880 ldr r0, [r0, #8]
  18621. 8027ed8: f7f9 fbb4 bl 8021644 <memcpy>
  18622. pxQueue->pcWriteTo += pxQueue->uxItemSize;
  18623. 8027edc: 68a2 ldr r2, [r4, #8]
  18624. 8027ede: 6c23 ldr r3, [r4, #64] ; 0x40
  18625. 8027ee0: 18d3 adds r3, r2, r3
  18626. if( pxQueue->pcWriteTo >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  18627. 8027ee2: 6862 ldr r2, [r4, #4]
  18628. #endif /* configUSE_MUTEXES */
  18629. }
  18630. else if( xPosition == queueSEND_TO_BACK )
  18631. {
  18632. ( 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. */
  18633. pxQueue->pcWriteTo += pxQueue->uxItemSize;
  18634. 8027ee4: 60a3 str r3, [r4, #8]
  18635. if( pxQueue->pcWriteTo >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  18636. 8027ee6: 4293 cmp r3, r2
  18637. 8027ee8: d318 bcc.n 8027f1c <prvCopyDataToQueue+0x62>
  18638. {
  18639. pxQueue->pcWriteTo = pxQueue->pcHead;
  18640. 8027eea: 6823 ldr r3, [r4, #0]
  18641. #endif /* configUSE_TRACE_FACILITY */
  18642. /*-----------------------------------------------------------*/
  18643. static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
  18644. {
  18645. BaseType_t xReturn = pdFALSE;
  18646. 8027eec: 4628 mov r0, r5
  18647. {
  18648. ( 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. */
  18649. pxQueue->pcWriteTo += pxQueue->uxItemSize;
  18650. if( pxQueue->pcWriteTo >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  18651. {
  18652. pxQueue->pcWriteTo = pxQueue->pcHead;
  18653. 8027eee: 60a3 str r3, [r4, #8]
  18654. 8027ef0: e015 b.n 8027f1e <prvCopyDataToQueue+0x64>
  18655. mtCOVERAGE_TEST_MARKER();
  18656. }
  18657. }
  18658. else
  18659. {
  18660. ( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  18661. 8027ef2: 68c0 ldr r0, [r0, #12]
  18662. 8027ef4: f7f9 fba6 bl 8021644 <memcpy>
  18663. pxQueue->u.pcReadFrom -= pxQueue->uxItemSize;
  18664. 8027ef8: 6c23 ldr r3, [r4, #64] ; 0x40
  18665. 8027efa: 68e2 ldr r2, [r4, #12]
  18666. if( pxQueue->u.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  18667. 8027efc: 6821 ldr r1, [r4, #0]
  18668. }
  18669. }
  18670. else
  18671. {
  18672. ( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  18673. pxQueue->u.pcReadFrom -= pxQueue->uxItemSize;
  18674. 8027efe: 425b negs r3, r3
  18675. 8027f00: 18d2 adds r2, r2, r3
  18676. if( pxQueue->u.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  18677. 8027f02: 428a cmp r2, r1
  18678. }
  18679. }
  18680. else
  18681. {
  18682. ( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  18683. pxQueue->u.pcReadFrom -= pxQueue->uxItemSize;
  18684. 8027f04: 60e2 str r2, [r4, #12]
  18685. if( pxQueue->u.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
  18686. 8027f06: d202 bcs.n 8027f0e <prvCopyDataToQueue+0x54>
  18687. {
  18688. pxQueue->u.pcReadFrom = ( pxQueue->pcTail - pxQueue->uxItemSize );
  18689. 8027f08: 6862 ldr r2, [r4, #4]
  18690. 8027f0a: 18d3 adds r3, r2, r3
  18691. 8027f0c: 60e3 str r3, [r4, #12]
  18692. else
  18693. {
  18694. mtCOVERAGE_TEST_MARKER();
  18695. }
  18696. if( xPosition == queueOVERWRITE )
  18697. 8027f0e: 2d02 cmp r5, #2
  18698. 8027f10: d104 bne.n 8027f1c <prvCopyDataToQueue+0x62>
  18699. {
  18700. if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 )
  18701. 8027f12: 6ba3 ldr r3, [r4, #56] ; 0x38
  18702. 8027f14: b113 cbz r3, 8027f1c <prvCopyDataToQueue+0x62>
  18703. {
  18704. /* An item is not being added but overwritten, so subtract
  18705. one from the recorded number of items in the queue so when
  18706. one is added again below the number of recorded items remains
  18707. correct. */
  18708. --( pxQueue->uxMessagesWaiting );
  18709. 8027f16: 6ba3 ldr r3, [r4, #56] ; 0x38
  18710. 8027f18: 3b01 subs r3, #1
  18711. 8027f1a: 63a3 str r3, [r4, #56] ; 0x38
  18712. #endif /* configUSE_TRACE_FACILITY */
  18713. /*-----------------------------------------------------------*/
  18714. static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
  18715. {
  18716. BaseType_t xReturn = pdFALSE;
  18717. 8027f1c: 2000 movs r0, #0
  18718. {
  18719. mtCOVERAGE_TEST_MARKER();
  18720. }
  18721. }
  18722. ++( pxQueue->uxMessagesWaiting );
  18723. 8027f1e: 6ba3 ldr r3, [r4, #56] ; 0x38
  18724. 8027f20: 3301 adds r3, #1
  18725. 8027f22: 63a3 str r3, [r4, #56] ; 0x38
  18726. return xReturn;
  18727. }
  18728. 8027f24: bd38 pop {r3, r4, r5, pc}
  18729. 08027f26 <xQueueGenericReset>:
  18730. } \
  18731. taskEXIT_CRITICAL()
  18732. /*-----------------------------------------------------------*/
  18733. BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue )
  18734. {
  18735. 8027f26: b538 push {r3, r4, r5, lr}
  18736. 8027f28: 460d mov r5, r1
  18737. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  18738. configASSERT( pxQueue );
  18739. 8027f2a: 4604 mov r4, r0
  18740. 8027f2c: b910 cbnz r0, 8027f34 <xQueueGenericReset+0xe>
  18741. 8027f2e: f000 fef9 bl 8028d24 <ulPortSetInterruptMask>
  18742. 8027f32: e7fe b.n 8027f32 <xQueueGenericReset+0xc>
  18743. taskENTER_CRITICAL();
  18744. 8027f34: f000 fefe bl 8028d34 <vPortEnterCritical>
  18745. {
  18746. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  18747. 8027f38: 6823 ldr r3, [r4, #0]
  18748. 8027f3a: 6be0 ldr r0, [r4, #60] ; 0x3c
  18749. 8027f3c: 6c22 ldr r2, [r4, #64] ; 0x40
  18750. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  18751. pxQueue->pcWriteTo = pxQueue->pcHead;
  18752. 8027f3e: 60a3 str r3, [r4, #8]
  18753. configASSERT( pxQueue );
  18754. taskENTER_CRITICAL();
  18755. {
  18756. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  18757. 8027f40: fb00 3102 mla r1, r0, r2, r3
  18758. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  18759. pxQueue->pcWriteTo = pxQueue->pcHead;
  18760. pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
  18761. 8027f44: 3801 subs r0, #1
  18762. 8027f46: fb02 3300 mla r3, r2, r0, r3
  18763. configASSERT( pxQueue );
  18764. taskENTER_CRITICAL();
  18765. {
  18766. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  18767. 8027f4a: 6061 str r1, [r4, #4]
  18768. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  18769. pxQueue->pcWriteTo = pxQueue->pcHead;
  18770. pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
  18771. 8027f4c: 60e3 str r3, [r4, #12]
  18772. configASSERT( pxQueue );
  18773. taskENTER_CRITICAL();
  18774. {
  18775. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  18776. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  18777. 8027f4e: 2100 movs r1, #0
  18778. pxQueue->pcWriteTo = pxQueue->pcHead;
  18779. pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
  18780. pxQueue->xRxLock = queueUNLOCKED;
  18781. 8027f50: f04f 33ff mov.w r3, #4294967295
  18782. configASSERT( pxQueue );
  18783. taskENTER_CRITICAL();
  18784. {
  18785. pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
  18786. pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  18787. 8027f54: 63a1 str r1, [r4, #56] ; 0x38
  18788. pxQueue->pcWriteTo = pxQueue->pcHead;
  18789. pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
  18790. pxQueue->xRxLock = queueUNLOCKED;
  18791. 8027f56: 6463 str r3, [r4, #68] ; 0x44
  18792. pxQueue->xTxLock = queueUNLOCKED;
  18793. 8027f58: 64a3 str r3, [r4, #72] ; 0x48
  18794. if( xNewQueue == pdFALSE )
  18795. 8027f5a: b955 cbnz r5, 8027f72 <xQueueGenericReset+0x4c>
  18796. /* If there are tasks blocked waiting to read from the queue, then
  18797. the tasks will remain blocked as after this function exits the queue
  18798. will still be empty. If there are tasks blocked waiting to write to
  18799. the queue, then one should be unblocked as after this function exits
  18800. it will be possible to write to it. */
  18801. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  18802. 8027f5c: 6923 ldr r3, [r4, #16]
  18803. 8027f5e: b183 cbz r3, 8027f82 <xQueueGenericReset+0x5c>
  18804. {
  18805. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE )
  18806. 8027f60: f104 0010 add.w r0, r4, #16
  18807. 8027f64: f000 fd8c bl 8028a80 <xTaskRemoveFromEventList>
  18808. 8027f68: 2801 cmp r0, #1
  18809. 8027f6a: d10a bne.n 8027f82 <xQueueGenericReset+0x5c>
  18810. {
  18811. queueYIELD_IF_USING_PREEMPTION();
  18812. 8027f6c: f000 fece bl 8028d0c <vPortYield>
  18813. 8027f70: e007 b.n 8027f82 <xQueueGenericReset+0x5c>
  18814. }
  18815. }
  18816. else
  18817. {
  18818. /* Ensure the event queues start in the correct state. */
  18819. vListInitialise( &( pxQueue->xTasksWaitingToSend ) );
  18820. 8027f72: f104 0010 add.w r0, r4, #16
  18821. 8027f76: f7ff ff17 bl 8027da8 <vListInitialise>
  18822. vListInitialise( &( pxQueue->xTasksWaitingToReceive ) );
  18823. 8027f7a: f104 0024 add.w r0, r4, #36 ; 0x24
  18824. 8027f7e: f7ff ff13 bl 8027da8 <vListInitialise>
  18825. }
  18826. }
  18827. taskEXIT_CRITICAL();
  18828. 8027f82: f000 ff03 bl 8028d8c <vPortExitCritical>
  18829. /* A value is returned for calling semantic consistency with previous
  18830. versions. */
  18831. return pdPASS;
  18832. }
  18833. 8027f86: 2001 movs r0, #1
  18834. 8027f88: bd38 pop {r3, r4, r5, pc}
  18835. 08027f8a <xQueueGenericCreate>:
  18836. /*-----------------------------------------------------------*/
  18837. QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType )
  18838. {
  18839. 8027f8a: b5f8 push {r3, r4, r5, r6, r7, lr}
  18840. 8027f8c: 460d mov r5, r1
  18841. 8027f8e: 4617 mov r7, r2
  18842. /* Remove compiler warnings about unused parameters should
  18843. configUSE_TRACE_FACILITY not be set to 1. */
  18844. ( void ) ucQueueType;
  18845. configASSERT( uxQueueLength > ( UBaseType_t ) 0 );
  18846. 8027f90: 4606 mov r6, r0
  18847. 8027f92: b910 cbnz r0, 8027f9a <xQueueGenericCreate+0x10>
  18848. 8027f94: f000 fec6 bl 8028d24 <ulPortSetInterruptMask>
  18849. 8027f98: e7fe b.n 8027f98 <xQueueGenericCreate+0xe>
  18850. if( uxItemSize == ( UBaseType_t ) 0 )
  18851. 8027f9a: b111 cbz r1, 8027fa2 <xQueueGenericCreate+0x18>
  18852. }
  18853. else
  18854. {
  18855. /* The queue is one byte longer than asked for to make wrap checking
  18856. easier/faster. */
  18857. xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ) + ( size_t ) 1; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  18858. 8027f9c: 4348 muls r0, r1
  18859. 8027f9e: 3001 adds r0, #1
  18860. 8027fa0: e000 b.n 8027fa4 <xQueueGenericCreate+0x1a>
  18861. configASSERT( uxQueueLength > ( UBaseType_t ) 0 );
  18862. if( uxItemSize == ( UBaseType_t ) 0 )
  18863. {
  18864. /* There is not going to be a queue storage area. */
  18865. xQueueSizeInBytes = ( size_t ) 0;
  18866. 8027fa2: 4608 mov r0, r1
  18867. easier/faster. */
  18868. xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ) + ( size_t ) 1; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  18869. }
  18870. /* Allocate the new queue structure and storage area. */
  18871. pcAllocatedBuffer = ( int8_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes );
  18872. 8027fa4: 3054 adds r0, #84 ; 0x54
  18873. 8027fa6: f000 ffd3 bl 8028f50 <pvPortMalloc>
  18874. if( pcAllocatedBuffer != NULL )
  18875. 8027faa: 4604 mov r4, r0
  18876. 8027fac: b138 cbz r0, 8027fbe <xQueueGenericCreate+0x34>
  18877. {
  18878. pxNewQueue = ( Queue_t * ) pcAllocatedBuffer; /*lint !e826 MISRA The buffer cannot be to small because it was dimensioned by sizeof( Queue_t ) + xQueueSizeInBytes. */
  18879. if( uxItemSize == ( UBaseType_t ) 0 )
  18880. 8027fae: b90d cbnz r5, 8027fb4 <xQueueGenericCreate+0x2a>
  18881. {
  18882. /* No RAM was allocated for the queue storage area, but PC head
  18883. cannot be set to NULL because NULL is used as a key to say the queue
  18884. is used as a mutex. Therefore just set pcHead to point to the queue
  18885. as a benign value that is known to be within the memory map. */
  18886. pxNewQueue->pcHead = ( int8_t * ) pxNewQueue;
  18887. 8027fb0: 6020 str r0, [r4, #0]
  18888. 8027fb2: e007 b.n 8027fc4 <xQueueGenericCreate+0x3a>
  18889. }
  18890. else
  18891. {
  18892. /* Jump past the queue structure to find the location of the queue
  18893. storage area - adding the padding bytes to get a better alignment. */
  18894. pxNewQueue->pcHead = pcAllocatedBuffer + sizeof( Queue_t );
  18895. 8027fb4: f100 0354 add.w r3, r0, #84 ; 0x54
  18896. 8027fb8: 6003 str r3, [r0, #0]
  18897. 8027fba: e003 b.n 8027fc4 <xQueueGenericCreate+0x3a>
  18898. 8027fbc: e7fe b.n 8027fbc <xQueueGenericCreate+0x32>
  18899. else
  18900. {
  18901. mtCOVERAGE_TEST_MARKER();
  18902. }
  18903. configASSERT( xReturn );
  18904. 8027fbe: f000 feb1 bl 8028d24 <ulPortSetInterruptMask>
  18905. 8027fc2: e7fb b.n 8027fbc <xQueueGenericCreate+0x32>
  18906. pxNewQueue->pcHead = pcAllocatedBuffer + sizeof( Queue_t );
  18907. }
  18908. /* Initialise the queue members as described above where the queue type
  18909. is defined. */
  18910. pxNewQueue->uxLength = uxQueueLength;
  18911. 8027fc4: 63e6 str r6, [r4, #60] ; 0x3c
  18912. pxNewQueue->uxItemSize = uxItemSize;
  18913. 8027fc6: 6425 str r5, [r4, #64] ; 0x40
  18914. ( void ) xQueueGenericReset( pxNewQueue, pdTRUE );
  18915. 8027fc8: 4620 mov r0, r4
  18916. 8027fca: 2101 movs r1, #1
  18917. 8027fcc: f7ff ffab bl 8027f26 <xQueueGenericReset>
  18918. #if ( configUSE_TRACE_FACILITY == 1 )
  18919. {
  18920. pxNewQueue->ucQueueType = ucQueueType;
  18921. 8027fd0: f884 7050 strb.w r7, [r4, #80] ; 0x50
  18922. }
  18923. configASSERT( xReturn );
  18924. return xReturn;
  18925. }
  18926. 8027fd4: 4620 mov r0, r4
  18927. 8027fd6: bdf8 pop {r3, r4, r5, r6, r7, pc}
  18928. 08027fd8 <xQueueCreateCountingSemaphore>:
  18929. /*-----------------------------------------------------------*/
  18930. #if ( configUSE_COUNTING_SEMAPHORES == 1 )
  18931. QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount )
  18932. {
  18933. 8027fd8: b510 push {r4, lr}
  18934. 8027fda: 460c mov r4, r1
  18935. QueueHandle_t xHandle;
  18936. configASSERT( uxMaxCount != 0 );
  18937. 8027fdc: b910 cbnz r0, 8027fe4 <xQueueCreateCountingSemaphore+0xc>
  18938. 8027fde: f000 fea1 bl 8028d24 <ulPortSetInterruptMask>
  18939. 8027fe2: e7fe b.n 8027fe2 <xQueueCreateCountingSemaphore+0xa>
  18940. configASSERT( uxInitialCount <= uxMaxCount );
  18941. 8027fe4: 4281 cmp r1, r0
  18942. 8027fe6: d902 bls.n 8027fee <xQueueCreateCountingSemaphore+0x16>
  18943. 8027fe8: f000 fe9c bl 8028d24 <ulPortSetInterruptMask>
  18944. 8027fec: e7fe b.n 8027fec <xQueueCreateCountingSemaphore+0x14>
  18945. xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE );
  18946. 8027fee: 2100 movs r1, #0
  18947. 8027ff0: 2202 movs r2, #2
  18948. 8027ff2: f7ff ffca bl 8027f8a <xQueueGenericCreate>
  18949. if( xHandle != NULL )
  18950. 8027ff6: b110 cbz r0, 8027ffe <xQueueCreateCountingSemaphore+0x26>
  18951. {
  18952. ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount;
  18953. 8027ff8: 6384 str r4, [r0, #56] ; 0x38
  18954. 8027ffa: bd10 pop {r4, pc}
  18955. 8027ffc: e7fe b.n 8027ffc <xQueueCreateCountingSemaphore+0x24>
  18956. else
  18957. {
  18958. traceCREATE_COUNTING_SEMAPHORE_FAILED();
  18959. }
  18960. configASSERT( xHandle );
  18961. 8027ffe: f000 fe91 bl 8028d24 <ulPortSetInterruptMask>
  18962. 8028002: e7fb b.n 8027ffc <xQueueCreateCountingSemaphore+0x24>
  18963. 08028004 <xQueueGenericSend>:
  18964. #endif /* configUSE_COUNTING_SEMAPHORES */
  18965. /*-----------------------------------------------------------*/
  18966. BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition )
  18967. {
  18968. 8028004: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  18969. 8028008: b085 sub sp, #20
  18970. 802800a: 460f mov r7, r1
  18971. 802800c: 9201 str r2, [sp, #4]
  18972. 802800e: 461d mov r5, r3
  18973. BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired;
  18974. TimeOut_t xTimeOut;
  18975. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  18976. configASSERT( pxQueue );
  18977. 8028010: 4604 mov r4, r0
  18978. 8028012: b910 cbnz r0, 802801a <xQueueGenericSend+0x16>
  18979. 8028014: f000 fe86 bl 8028d24 <ulPortSetInterruptMask>
  18980. 8028018: e7fe b.n 8028018 <xQueueGenericSend+0x14>
  18981. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  18982. 802801a: 2900 cmp r1, #0
  18983. 802801c: d177 bne.n 802810e <xQueueGenericSend+0x10a>
  18984. 802801e: 6c03 ldr r3, [r0, #64] ; 0x40
  18985. 8028020: 2b00 cmp r3, #0
  18986. 8028022: d074 beq.n 802810e <xQueueGenericSend+0x10a>
  18987. 8028024: e070 b.n 8028108 <xQueueGenericSend+0x104>
  18988. 8028026: e7fe b.n 8028026 <xQueueGenericSend+0x22>
  18989. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  18990. 8028028: 6be3 ldr r3, [r4, #60] ; 0x3c
  18991. 802802a: 2b01 cmp r3, #1
  18992. 802802c: d172 bne.n 8028114 <xQueueGenericSend+0x110>
  18993. 802802e: e002 b.n 8028036 <xQueueGenericSend+0x32>
  18994. 8028030: e7fe b.n 8028030 <xQueueGenericSend+0x2c>
  18995. 8028032: 2601 movs r6, #1
  18996. 8028034: e002 b.n 802803c <xQueueGenericSend+0x38>
  18997. 8028036: 2600 movs r6, #0
  18998. /* Interrupts and other tasks can send to and receive from the queue
  18999. now the critical section has been exited. */
  19000. vTaskSuspendAll();
  19001. prvLockQueue( pxQueue );
  19002. 8028038: f04f 0800 mov.w r8, #0
  19003. /* This function relaxes the coding standard somewhat to allow return
  19004. statements within the function itself. This is done in the interest
  19005. of execution time efficiency. */
  19006. for( ;; )
  19007. {
  19008. taskENTER_CRITICAL();
  19009. 802803c: f000 fe7a bl 8028d34 <vPortEnterCritical>
  19010. {
  19011. /* Is there room on the queue now? The running task must be
  19012. the highest priority task wanting to access the queue. If
  19013. the head item in the queue is to be overwritten then it does
  19014. not matter if the queue is full. */
  19015. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  19016. 8028040: 6ba2 ldr r2, [r4, #56] ; 0x38
  19017. 8028042: 6be3 ldr r3, [r4, #60] ; 0x3c
  19018. 8028044: 429a cmp r2, r3
  19019. 8028046: d301 bcc.n 802804c <xQueueGenericSend+0x48>
  19020. 8028048: 2d02 cmp r5, #2
  19021. 802804a: d115 bne.n 8028078 <xQueueGenericSend+0x74>
  19022. {
  19023. traceQUEUE_SEND( pxQueue );
  19024. xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
  19025. 802804c: 4620 mov r0, r4
  19026. 802804e: 4639 mov r1, r7
  19027. 8028050: 462a mov r2, r5
  19028. 8028052: f7ff ff32 bl 8027eba <prvCopyDataToQueue>
  19029. }
  19030. #else /* configUSE_QUEUE_SETS */
  19031. {
  19032. /* If there was a task waiting for data to arrive on the
  19033. queue then unblock it now. */
  19034. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  19035. 8028056: 6a63 ldr r3, [r4, #36] ; 0x24
  19036. 8028058: b143 cbz r3, 802806c <xQueueGenericSend+0x68>
  19037. {
  19038. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) == pdTRUE )
  19039. 802805a: f104 0024 add.w r0, r4, #36 ; 0x24
  19040. 802805e: f000 fd0f bl 8028a80 <xTaskRemoveFromEventList>
  19041. 8028062: 2801 cmp r0, #1
  19042. 8028064: d104 bne.n 8028070 <xQueueGenericSend+0x6c>
  19043. {
  19044. /* The unblocked task has a priority higher than
  19045. our own so yield immediately. Yes it is ok to do
  19046. this from within the critical section - the kernel
  19047. takes care of that. */
  19048. queueYIELD_IF_USING_PREEMPTION();
  19049. 8028066: f000 fe51 bl 8028d0c <vPortYield>
  19050. 802806a: e001 b.n 8028070 <xQueueGenericSend+0x6c>
  19051. else
  19052. {
  19053. mtCOVERAGE_TEST_MARKER();
  19054. }
  19055. }
  19056. else if( xYieldRequired != pdFALSE )
  19057. 802806c: 2800 cmp r0, #0
  19058. 802806e: d1fa bne.n 8028066 <xQueueGenericSend+0x62>
  19059. mtCOVERAGE_TEST_MARKER();
  19060. }
  19061. }
  19062. #endif /* configUSE_QUEUE_SETS */
  19063. taskEXIT_CRITICAL();
  19064. 8028070: f000 fe8c bl 8028d8c <vPortExitCritical>
  19065. return pdPASS;
  19066. 8028074: 2001 movs r0, #1
  19067. 8028076: e050 b.n 802811a <xQueueGenericSend+0x116>
  19068. }
  19069. else
  19070. {
  19071. if( xTicksToWait == ( TickType_t ) 0 )
  19072. 8028078: f8dd 9004 ldr.w r9, [sp, #4]
  19073. 802807c: f1b9 0f00 cmp.w r9, #0
  19074. 8028080: d102 bne.n 8028088 <xQueueGenericSend+0x84>
  19075. {
  19076. /* The queue was full and no block time is specified (or
  19077. the block time has expired) so leave now. */
  19078. taskEXIT_CRITICAL();
  19079. 8028082: f000 fe83 bl 8028d8c <vPortExitCritical>
  19080. 8028086: e03d b.n 8028104 <xQueueGenericSend+0x100>
  19081. /* Return to the original privilege level before exiting
  19082. the function. */
  19083. traceQUEUE_SEND_FAILED( pxQueue );
  19084. return errQUEUE_FULL;
  19085. }
  19086. else if( xEntryTimeSet == pdFALSE )
  19087. 8028088: b916 cbnz r6, 8028090 <xQueueGenericSend+0x8c>
  19088. {
  19089. /* The queue was full and a block time was specified so
  19090. configure the timeout structure. */
  19091. vTaskSetTimeOutState( &xTimeOut );
  19092. 802808a: a802 add r0, sp, #8
  19093. 802808c: f000 fd34 bl 8028af8 <vTaskSetTimeOutState>
  19094. /* Entry time was already set. */
  19095. mtCOVERAGE_TEST_MARKER();
  19096. }
  19097. }
  19098. }
  19099. taskEXIT_CRITICAL();
  19100. 8028090: f000 fe7c bl 8028d8c <vPortExitCritical>
  19101. /* Interrupts and other tasks can send to and receive from the queue
  19102. now the critical section has been exited. */
  19103. vTaskSuspendAll();
  19104. 8028094: f000 fb24 bl 80286e0 <vTaskSuspendAll>
  19105. prvLockQueue( pxQueue );
  19106. 8028098: f000 fe4c bl 8028d34 <vPortEnterCritical>
  19107. 802809c: 6c63 ldr r3, [r4, #68] ; 0x44
  19108. 802809e: 3301 adds r3, #1
  19109. 80280a0: bf08 it eq
  19110. 80280a2: f8c4 8044 streq.w r8, [r4, #68] ; 0x44
  19111. 80280a6: 6ca3 ldr r3, [r4, #72] ; 0x48
  19112. 80280a8: 3301 adds r3, #1
  19113. 80280aa: bf08 it eq
  19114. 80280ac: f8c4 8048 streq.w r8, [r4, #72] ; 0x48
  19115. 80280b0: f000 fe6c bl 8028d8c <vPortExitCritical>
  19116. /* Update the timeout state to see if it has expired yet. */
  19117. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  19118. 80280b4: a802 add r0, sp, #8
  19119. 80280b6: a901 add r1, sp, #4
  19120. 80280b8: f000 fd2e bl 8028b18 <xTaskCheckForTimeOut>
  19121. 80280bc: b9e8 cbnz r0, 80280fa <xQueueGenericSend+0xf6>
  19122. static BaseType_t prvIsQueueFull( const Queue_t *pxQueue )
  19123. {
  19124. BaseType_t xReturn;
  19125. taskENTER_CRITICAL();
  19126. 80280be: f000 fe39 bl 8028d34 <vPortEnterCritical>
  19127. {
  19128. if( pxQueue->uxMessagesWaiting == pxQueue->uxLength )
  19129. 80280c2: f8d4 9038 ldr.w r9, [r4, #56] ; 0x38
  19130. 80280c6: 6be6 ldr r6, [r4, #60] ; 0x3c
  19131. else
  19132. {
  19133. xReturn = pdFALSE;
  19134. }
  19135. }
  19136. taskEXIT_CRITICAL();
  19137. 80280c8: f000 fe60 bl 8028d8c <vPortExitCritical>
  19138. prvLockQueue( pxQueue );
  19139. /* Update the timeout state to see if it has expired yet. */
  19140. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  19141. {
  19142. if( prvIsQueueFull( pxQueue ) != pdFALSE )
  19143. 80280cc: 45b1 cmp r9, r6
  19144. 80280ce: d10e bne.n 80280ee <xQueueGenericSend+0xea>
  19145. {
  19146. traceBLOCKING_ON_QUEUE_SEND( pxQueue );
  19147. vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait );
  19148. 80280d0: f104 0010 add.w r0, r4, #16
  19149. 80280d4: 9901 ldr r1, [sp, #4]
  19150. 80280d6: f000 fc9f bl 8028a18 <vTaskPlaceOnEventList>
  19151. /* Unlocking the queue means queue events can effect the
  19152. event list. It is possible that interrupts occurring now
  19153. remove this task from the event list again - but as the
  19154. scheduler is suspended the task will go onto the pending
  19155. ready last instead of the actual ready list. */
  19156. prvUnlockQueue( pxQueue );
  19157. 80280da: 4620 mov r0, r4
  19158. 80280dc: f7ff feb9 bl 8027e52 <prvUnlockQueue>
  19159. /* Resuming the scheduler will move tasks from the pending
  19160. ready list into the ready list - so it is feasible that this
  19161. task is already in a ready list before it yields - in which
  19162. case the yield will not cause a context switch unless there
  19163. is also a higher priority task in the pending ready list. */
  19164. if( xTaskResumeAll() == pdFALSE )
  19165. 80280e0: f000 fb9a bl 8028818 <xTaskResumeAll>
  19166. 80280e4: 2800 cmp r0, #0
  19167. 80280e6: d1a4 bne.n 8028032 <xQueueGenericSend+0x2e>
  19168. {
  19169. portYIELD_WITHIN_API();
  19170. 80280e8: f000 fe10 bl 8028d0c <vPortYield>
  19171. 80280ec: e7a1 b.n 8028032 <xQueueGenericSend+0x2e>
  19172. }
  19173. }
  19174. else
  19175. {
  19176. /* Try again. */
  19177. prvUnlockQueue( pxQueue );
  19178. 80280ee: 4620 mov r0, r4
  19179. 80280f0: f7ff feaf bl 8027e52 <prvUnlockQueue>
  19180. ( void ) xTaskResumeAll();
  19181. 80280f4: f000 fb90 bl 8028818 <xTaskResumeAll>
  19182. 80280f8: e79b b.n 8028032 <xQueueGenericSend+0x2e>
  19183. }
  19184. }
  19185. else
  19186. {
  19187. /* The timeout has expired. */
  19188. prvUnlockQueue( pxQueue );
  19189. 80280fa: 4620 mov r0, r4
  19190. 80280fc: f7ff fea9 bl 8027e52 <prvUnlockQueue>
  19191. ( void ) xTaskResumeAll();
  19192. 8028100: f000 fb8a bl 8028818 <xTaskResumeAll>
  19193. /* Return to the original privilege level before exiting the
  19194. function. */
  19195. traceQUEUE_SEND_FAILED( pxQueue );
  19196. return errQUEUE_FULL;
  19197. 8028104: 2000 movs r0, #0
  19198. 8028106: e008 b.n 802811a <xQueueGenericSend+0x116>
  19199. BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired;
  19200. TimeOut_t xTimeOut;
  19201. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  19202. configASSERT( pxQueue );
  19203. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  19204. 8028108: f000 fe0c bl 8028d24 <ulPortSetInterruptMask>
  19205. 802810c: e78b b.n 8028026 <xQueueGenericSend+0x22>
  19206. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  19207. 802810e: 2d02 cmp r5, #2
  19208. 8028110: d191 bne.n 8028036 <xQueueGenericSend+0x32>
  19209. 8028112: e789 b.n 8028028 <xQueueGenericSend+0x24>
  19210. 8028114: f000 fe06 bl 8028d24 <ulPortSetInterruptMask>
  19211. 8028118: e78a b.n 8028030 <xQueueGenericSend+0x2c>
  19212. function. */
  19213. traceQUEUE_SEND_FAILED( pxQueue );
  19214. return errQUEUE_FULL;
  19215. }
  19216. }
  19217. }
  19218. 802811a: b005 add sp, #20
  19219. 802811c: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  19220. 08028120 <xQueueCreateMutex>:
  19221. /*-----------------------------------------------------------*/
  19222. #if ( configUSE_MUTEXES == 1 )
  19223. QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType )
  19224. {
  19225. 8028120: b570 push {r4, r5, r6, lr}
  19226. 8028122: 4606 mov r6, r0
  19227. /* Prevent compiler warnings about unused parameters if
  19228. configUSE_TRACE_FACILITY does not equal 1. */
  19229. ( void ) ucQueueType;
  19230. /* Allocate the new queue structure. */
  19231. pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) );
  19232. 8028124: 2054 movs r0, #84 ; 0x54
  19233. 8028126: f000 ff13 bl 8028f50 <pvPortMalloc>
  19234. if( pxNewQueue != NULL )
  19235. 802812a: 4604 mov r4, r0
  19236. 802812c: b108 cbz r0, 8028132 <xQueueCreateMutex+0x12>
  19237. 802812e: e003 b.n 8028138 <xQueueCreateMutex+0x18>
  19238. 8028130: e7fe b.n 8028130 <xQueueCreateMutex+0x10>
  19239. else
  19240. {
  19241. traceCREATE_MUTEX_FAILED();
  19242. }
  19243. configASSERT( pxNewQueue );
  19244. 8028132: f000 fdf7 bl 8028d24 <ulPortSetInterruptMask>
  19245. 8028136: e7fb b.n 8028130 <xQueueCreateMutex+0x10>
  19246. /* Each mutex has a length of 1 (like a binary semaphore) and
  19247. an item size of 0 as nothing is actually copied into or out
  19248. of the mutex. */
  19249. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  19250. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  19251. 8028138: 2301 movs r3, #1
  19252. /* Allocate the new queue structure. */
  19253. pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) );
  19254. if( pxNewQueue != NULL )
  19255. {
  19256. /* Information required for priority inheritance. */
  19257. pxNewQueue->pxMutexHolder = NULL;
  19258. 802813a: 2500 movs r5, #0
  19259. /* Each mutex has a length of 1 (like a binary semaphore) and
  19260. an item size of 0 as nothing is actually copied into or out
  19261. of the mutex. */
  19262. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  19263. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  19264. 802813c: 63c3 str r3, [r0, #60] ; 0x3c
  19265. pxNewQueue->uxItemSize = ( UBaseType_t ) 0U;
  19266. pxNewQueue->xRxLock = queueUNLOCKED;
  19267. 802813e: f04f 33ff mov.w r3, #4294967295
  19268. pxNewQueue->u.pcReadFrom = NULL;
  19269. /* Each mutex has a length of 1 (like a binary semaphore) and
  19270. an item size of 0 as nothing is actually copied into or out
  19271. of the mutex. */
  19272. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  19273. 8028142: 6385 str r5, [r0, #56] ; 0x38
  19274. /* Allocate the new queue structure. */
  19275. pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) );
  19276. if( pxNewQueue != NULL )
  19277. {
  19278. /* Information required for priority inheritance. */
  19279. pxNewQueue->pxMutexHolder = NULL;
  19280. 8028144: 6045 str r5, [r0, #4]
  19281. an item size of 0 as nothing is actually copied into or out
  19282. of the mutex. */
  19283. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  19284. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  19285. pxNewQueue->uxItemSize = ( UBaseType_t ) 0U;
  19286. pxNewQueue->xRxLock = queueUNLOCKED;
  19287. 8028146: 6443 str r3, [r0, #68] ; 0x44
  19288. pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) );
  19289. if( pxNewQueue != NULL )
  19290. {
  19291. /* Information required for priority inheritance. */
  19292. pxNewQueue->pxMutexHolder = NULL;
  19293. pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX;
  19294. 8028148: 6005 str r5, [r0, #0]
  19295. of the mutex. */
  19296. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  19297. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  19298. pxNewQueue->uxItemSize = ( UBaseType_t ) 0U;
  19299. pxNewQueue->xRxLock = queueUNLOCKED;
  19300. pxNewQueue->xTxLock = queueUNLOCKED;
  19301. 802814a: 6483 str r3, [r0, #72] ; 0x48
  19302. pxNewQueue->pxMutexHolder = NULL;
  19303. pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX;
  19304. /* Queues used as a mutex no data is actually copied into or out
  19305. of the queue. */
  19306. pxNewQueue->pcWriteTo = NULL;
  19307. 802814c: 6085 str r5, [r0, #8]
  19308. pxNewQueue->u.pcReadFrom = NULL;
  19309. 802814e: 60c5 str r5, [r0, #12]
  19310. /* Each mutex has a length of 1 (like a binary semaphore) and
  19311. an item size of 0 as nothing is actually copied into or out
  19312. of the mutex. */
  19313. pxNewQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
  19314. pxNewQueue->uxLength = ( UBaseType_t ) 1U;
  19315. pxNewQueue->uxItemSize = ( UBaseType_t ) 0U;
  19316. 8028150: 6405 str r5, [r0, #64] ; 0x40
  19317. pxNewQueue->xRxLock = queueUNLOCKED;
  19318. pxNewQueue->xTxLock = queueUNLOCKED;
  19319. #if ( configUSE_TRACE_FACILITY == 1 )
  19320. {
  19321. pxNewQueue->ucQueueType = ucQueueType;
  19322. 8028152: f880 6050 strb.w r6, [r0, #80] ; 0x50
  19323. pxNewQueue->pxQueueSetContainer = NULL;
  19324. }
  19325. #endif
  19326. /* Ensure the event queues start with the correct state. */
  19327. vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) );
  19328. 8028156: 3010 adds r0, #16
  19329. 8028158: f7ff fe26 bl 8027da8 <vListInitialise>
  19330. vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) );
  19331. 802815c: f104 0024 add.w r0, r4, #36 ; 0x24
  19332. 8028160: f7ff fe22 bl 8027da8 <vListInitialise>
  19333. traceCREATE_MUTEX( pxNewQueue );
  19334. /* Start with the semaphore in the expected state. */
  19335. ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK );
  19336. 8028164: 4620 mov r0, r4
  19337. 8028166: 4629 mov r1, r5
  19338. 8028168: 462a mov r2, r5
  19339. 802816a: 462b mov r3, r5
  19340. 802816c: f7ff ff4a bl 8028004 <xQueueGenericSend>
  19341. traceCREATE_MUTEX_FAILED();
  19342. }
  19343. configASSERT( pxNewQueue );
  19344. return pxNewQueue;
  19345. }
  19346. 8028170: 4620 mov r0, r4
  19347. 8028172: bd70 pop {r4, r5, r6, pc}
  19348. 08028174 <xQueueGenericSendFromISR>:
  19349. #endif /* configUSE_ALTERNATIVE_API */
  19350. /*-----------------------------------------------------------*/
  19351. BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition )
  19352. {
  19353. 8028174: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  19354. 8028178: 460f mov r7, r1
  19355. 802817a: 4616 mov r6, r2
  19356. 802817c: 461d mov r5, r3
  19357. BaseType_t xReturn;
  19358. UBaseType_t uxSavedInterruptStatus;
  19359. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  19360. configASSERT( pxQueue );
  19361. 802817e: 4604 mov r4, r0
  19362. 8028180: b910 cbnz r0, 8028188 <xQueueGenericSendFromISR+0x14>
  19363. 8028182: f000 fdcf bl 8028d24 <ulPortSetInterruptMask>
  19364. 8028186: e7fe b.n 8028186 <xQueueGenericSendFromISR+0x12>
  19365. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  19366. 8028188: bb41 cbnz r1, 80281dc <xQueueGenericSendFromISR+0x68>
  19367. 802818a: 6c03 ldr r3, [r0, #64] ; 0x40
  19368. 802818c: b333 cbz r3, 80281dc <xQueueGenericSendFromISR+0x68>
  19369. 802818e: e022 b.n 80281d6 <xQueueGenericSendFromISR+0x62>
  19370. 8028190: e7fe b.n 8028190 <xQueueGenericSendFromISR+0x1c>
  19371. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  19372. 8028192: 6be3 ldr r3, [r4, #60] ; 0x3c
  19373. 8028194: 2b01 cmp r3, #1
  19374. 8028196: d124 bne.n 80281e2 <xQueueGenericSendFromISR+0x6e>
  19375. 8028198: e026 b.n 80281e8 <xQueueGenericSendFromISR+0x74>
  19376. 802819a: e7fe b.n 802819a <xQueueGenericSendFromISR+0x26>
  19377. read, instead return a flag to say whether a context switch is required or
  19378. not (i.e. has a task with a higher priority than us been woken by this
  19379. post). */
  19380. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  19381. {
  19382. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  19383. 802819c: 2d02 cmp r5, #2
  19384. 802819e: d118 bne.n 80281d2 <xQueueGenericSendFromISR+0x5e>
  19385. /* A task can only have an inherited priority if it is a mutex
  19386. holder - and if there is a mutex holder then the mutex cannot be
  19387. given from an ISR. Therefore, unlike the xQueueGenericGive()
  19388. function, there is no need to determine the need for priority
  19389. disinheritance here or to clear the mutex holder TCB member. */
  19390. ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
  19391. 80281a0: 4620 mov r0, r4
  19392. 80281a2: 4639 mov r1, r7
  19393. 80281a4: 462a mov r2, r5
  19394. 80281a6: f7ff fe88 bl 8027eba <prvCopyDataToQueue>
  19395. /* The event list is not altered if the queue is locked. This will
  19396. be done when the queue is unlocked later. */
  19397. if( pxQueue->xTxLock == queueUNLOCKED )
  19398. 80281aa: 6ca3 ldr r3, [r4, #72] ; 0x48
  19399. 80281ac: 3301 adds r3, #1
  19400. 80281ae: d10b bne.n 80281c8 <xQueueGenericSendFromISR+0x54>
  19401. }
  19402. }
  19403. }
  19404. #else /* configUSE_QUEUE_SETS */
  19405. {
  19406. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  19407. 80281b0: 6a63 ldr r3, [r4, #36] ; 0x24
  19408. 80281b2: b903 cbnz r3, 80281b6 <xQueueGenericSendFromISR+0x42>
  19409. 80281b4: e00b b.n 80281ce <xQueueGenericSendFromISR+0x5a>
  19410. {
  19411. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  19412. 80281b6: f104 0024 add.w r0, r4, #36 ; 0x24
  19413. 80281ba: f000 fc61 bl 8028a80 <xTaskRemoveFromEventList>
  19414. 80281be: b130 cbz r0, 80281ce <xQueueGenericSendFromISR+0x5a>
  19415. {
  19416. /* The task waiting has a higher priority so record that a
  19417. context switch is required. */
  19418. if( pxHigherPriorityTaskWoken != NULL )
  19419. 80281c0: b12e cbz r6, 80281ce <xQueueGenericSendFromISR+0x5a>
  19420. {
  19421. *pxHigherPriorityTaskWoken = pdTRUE;
  19422. 80281c2: 2401 movs r4, #1
  19423. 80281c4: 6034 str r4, [r6, #0]
  19424. 80281c6: e019 b.n 80281fc <xQueueGenericSendFromISR+0x88>
  19425. }
  19426. else
  19427. {
  19428. /* Increment the lock count so the task that unlocks the queue
  19429. knows that data was posted while it was locked. */
  19430. ++( pxQueue->xTxLock );
  19431. 80281c8: 6ca3 ldr r3, [r4, #72] ; 0x48
  19432. 80281ca: 3301 adds r3, #1
  19433. 80281cc: 64a3 str r3, [r4, #72] ; 0x48
  19434. }
  19435. xReturn = pdPASS;
  19436. 80281ce: 2401 movs r4, #1
  19437. 80281d0: e014 b.n 80281fc <xQueueGenericSendFromISR+0x88>
  19438. }
  19439. else
  19440. {
  19441. traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );
  19442. xReturn = errQUEUE_FULL;
  19443. 80281d2: 2400 movs r4, #0
  19444. 80281d4: e012 b.n 80281fc <xQueueGenericSendFromISR+0x88>
  19445. BaseType_t xReturn;
  19446. UBaseType_t uxSavedInterruptStatus;
  19447. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  19448. configASSERT( pxQueue );
  19449. configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  19450. 80281d6: f000 fda5 bl 8028d24 <ulPortSetInterruptMask>
  19451. 80281da: e7d9 b.n 8028190 <xQueueGenericSendFromISR+0x1c>
  19452. configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
  19453. 80281dc: 2d02 cmp r5, #2
  19454. 80281de: d103 bne.n 80281e8 <xQueueGenericSendFromISR+0x74>
  19455. 80281e0: e7d7 b.n 8028192 <xQueueGenericSendFromISR+0x1e>
  19456. 80281e2: f000 fd9f bl 8028d24 <ulPortSetInterruptMask>
  19457. 80281e6: e7d8 b.n 802819a <xQueueGenericSendFromISR+0x26>
  19458. that have been assigned a priority at or (logically) below the maximum
  19459. system call interrupt priority. FreeRTOS maintains a separate interrupt
  19460. safe API to ensure interrupt entry is as fast and as simple as possible.
  19461. More information (albeit Cortex-M specific) is provided on the following
  19462. link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */
  19463. portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
  19464. 80281e8: f000 fe6c bl 8028ec4 <vPortValidateInterruptPriority>
  19465. /* Similar to xQueueGenericSend, except without blocking if there is no room
  19466. in the queue. Also don't directly wake a task that was blocked on a queue
  19467. read, instead return a flag to say whether a context switch is required or
  19468. not (i.e. has a task with a higher priority than us been woken by this
  19469. post). */
  19470. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  19471. 80281ec: f000 fd9a bl 8028d24 <ulPortSetInterruptMask>
  19472. {
  19473. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  19474. 80281f0: 6ba2 ldr r2, [r4, #56] ; 0x38
  19475. 80281f2: 6be3 ldr r3, [r4, #60] ; 0x3c
  19476. 80281f4: 429a cmp r2, r3
  19477. /* Similar to xQueueGenericSend, except without blocking if there is no room
  19478. in the queue. Also don't directly wake a task that was blocked on a queue
  19479. read, instead return a flag to say whether a context switch is required or
  19480. not (i.e. has a task with a higher priority than us been woken by this
  19481. post). */
  19482. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  19483. 80281f6: 4680 mov r8, r0
  19484. {
  19485. if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
  19486. 80281f8: d2d0 bcs.n 802819c <xQueueGenericSendFromISR+0x28>
  19487. 80281fa: e7d1 b.n 80281a0 <xQueueGenericSendFromISR+0x2c>
  19488. {
  19489. traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );
  19490. xReturn = errQUEUE_FULL;
  19491. }
  19492. }
  19493. portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
  19494. 80281fc: 4640 mov r0, r8
  19495. 80281fe: f000 fdc1 bl 8028d84 <vPortClearInterruptMask>
  19496. return xReturn;
  19497. }
  19498. 8028202: 4620 mov r0, r4
  19499. 8028204: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  19500. 08028208 <xQueueGiveFromISR>:
  19501. /*-----------------------------------------------------------*/
  19502. BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken )
  19503. {
  19504. 8028208: b5f8 push {r3, r4, r5, r6, r7, lr}
  19505. 802820a: 460d mov r5, r1
  19506. BaseType_t xReturn;
  19507. UBaseType_t uxSavedInterruptStatus;
  19508. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  19509. configASSERT( pxQueue );
  19510. 802820c: 4604 mov r4, r0
  19511. 802820e: b910 cbnz r0, 8028216 <xQueueGiveFromISR+0xe>
  19512. 8028210: f000 fd88 bl 8028d24 <ulPortSetInterruptMask>
  19513. 8028214: e7fe b.n 8028214 <xQueueGiveFromISR+0xc>
  19514. /* xQueueGenericSendFromISR() should be used in the item size is not 0. */
  19515. configASSERT( pxQueue->uxItemSize == 0 );
  19516. 8028216: 6c06 ldr r6, [r0, #64] ; 0x40
  19517. 8028218: b116 cbz r6, 8028220 <xQueueGiveFromISR+0x18>
  19518. 802821a: f000 fd83 bl 8028d24 <ulPortSetInterruptMask>
  19519. 802821e: e7fe b.n 802821e <xQueueGiveFromISR+0x16>
  19520. that have been assigned a priority at or (logically) below the maximum
  19521. system call interrupt priority. FreeRTOS maintains a separate interrupt
  19522. safe API to ensure interrupt entry is as fast and as simple as possible.
  19523. More information (albeit Cortex-M specific) is provided on the following
  19524. link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */
  19525. portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
  19526. 8028220: f000 fe50 bl 8028ec4 <vPortValidateInterruptPriority>
  19527. /* Similar to xQueueGenericSendFromISR() but used with semaphores where the
  19528. item size is 0. Don't directly wake a task that was blocked on a queue
  19529. read, instead return a flag to say whether a context switch is required or
  19530. not (i.e. has a task with a higher priority than us been woken by this
  19531. post). */
  19532. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  19533. 8028224: f000 fd7e bl 8028d24 <ulPortSetInterruptMask>
  19534. {
  19535. /* When the queue is used to implement a semaphore no data is ever
  19536. moved through the queue but it is still valid to see if the queue 'has
  19537. space'. */
  19538. if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )
  19539. 8028228: 6ba2 ldr r2, [r4, #56] ; 0x38
  19540. 802822a: 6be3 ldr r3, [r4, #60] ; 0x3c
  19541. 802822c: 429a cmp r2, r3
  19542. /* Similar to xQueueGenericSendFromISR() but used with semaphores where the
  19543. item size is 0. Don't directly wake a task that was blocked on a queue
  19544. read, instead return a flag to say whether a context switch is required or
  19545. not (i.e. has a task with a higher priority than us been woken by this
  19546. post). */
  19547. uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
  19548. 802822e: 4607 mov r7, r0
  19549. {
  19550. /* When the queue is used to implement a semaphore no data is ever
  19551. moved through the queue but it is still valid to see if the queue 'has
  19552. space'. */
  19553. if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )
  19554. 8028230: d216 bcs.n 8028260 <xQueueGiveFromISR+0x58>
  19555. holder - and if there is a mutex holder then the mutex cannot be
  19556. given from an ISR. Therefore, unlike the xQueueGenericGive()
  19557. function, there is no need to determine the need for priority
  19558. disinheritance here or to clear the mutex holder TCB member. */
  19559. ++( pxQueue->uxMessagesWaiting );
  19560. 8028232: 6ba3 ldr r3, [r4, #56] ; 0x38
  19561. 8028234: 3301 adds r3, #1
  19562. 8028236: 63a3 str r3, [r4, #56] ; 0x38
  19563. /* The event list is not altered if the queue is locked. This will
  19564. be done when the queue is unlocked later. */
  19565. if( pxQueue->xTxLock == queueUNLOCKED )
  19566. 8028238: 6ca3 ldr r3, [r4, #72] ; 0x48
  19567. 802823a: 3301 adds r3, #1
  19568. 802823c: d10b bne.n 8028256 <xQueueGiveFromISR+0x4e>
  19569. }
  19570. }
  19571. }
  19572. #else /* configUSE_QUEUE_SETS */
  19573. {
  19574. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  19575. 802823e: 6a63 ldr r3, [r4, #36] ; 0x24
  19576. 8028240: b903 cbnz r3, 8028244 <xQueueGiveFromISR+0x3c>
  19577. 8028242: e00b b.n 802825c <xQueueGiveFromISR+0x54>
  19578. {
  19579. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  19580. 8028244: f104 0024 add.w r0, r4, #36 ; 0x24
  19581. 8028248: f000 fc1a bl 8028a80 <xTaskRemoveFromEventList>
  19582. 802824c: b130 cbz r0, 802825c <xQueueGiveFromISR+0x54>
  19583. {
  19584. /* The task waiting has a higher priority so record that a
  19585. context switch is required. */
  19586. if( pxHigherPriorityTaskWoken != NULL )
  19587. 802824e: b12d cbz r5, 802825c <xQueueGiveFromISR+0x54>
  19588. {
  19589. *pxHigherPriorityTaskWoken = pdTRUE;
  19590. 8028250: 2401 movs r4, #1
  19591. 8028252: 602c str r4, [r5, #0]
  19592. 8028254: e005 b.n 8028262 <xQueueGiveFromISR+0x5a>
  19593. }
  19594. else
  19595. {
  19596. /* Increment the lock count so the task that unlocks the queue
  19597. knows that data was posted while it was locked. */
  19598. ++( pxQueue->xTxLock );
  19599. 8028256: 6ca3 ldr r3, [r4, #72] ; 0x48
  19600. 8028258: 3301 adds r3, #1
  19601. 802825a: 64a3 str r3, [r4, #72] ; 0x48
  19602. }
  19603. xReturn = pdPASS;
  19604. 802825c: 2401 movs r4, #1
  19605. 802825e: e000 b.n 8028262 <xQueueGiveFromISR+0x5a>
  19606. }
  19607. else
  19608. {
  19609. traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );
  19610. xReturn = errQUEUE_FULL;
  19611. 8028260: 4634 mov r4, r6
  19612. }
  19613. }
  19614. portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
  19615. 8028262: 4638 mov r0, r7
  19616. 8028264: f000 fd8e bl 8028d84 <vPortClearInterruptMask>
  19617. return xReturn;
  19618. }
  19619. 8028268: 4620 mov r0, r4
  19620. 802826a: bdf8 pop {r3, r4, r5, r6, r7, pc}
  19621. 0802826c <xQueueGenericReceive>:
  19622. /*-----------------------------------------------------------*/
  19623. BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeeking )
  19624. {
  19625. 802826c: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  19626. 8028270: b085 sub sp, #20
  19627. 8028272: 460d mov r5, r1
  19628. 8028274: 9201 str r2, [sp, #4]
  19629. 8028276: 4699 mov r9, r3
  19630. BaseType_t xEntryTimeSet = pdFALSE;
  19631. TimeOut_t xTimeOut;
  19632. int8_t *pcOriginalReadPosition;
  19633. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  19634. configASSERT( pxQueue );
  19635. 8028278: 4604 mov r4, r0
  19636. 802827a: b910 cbnz r0, 8028282 <xQueueGenericReceive+0x16>
  19637. 802827c: f000 fd52 bl 8028d24 <ulPortSetInterruptMask>
  19638. 8028280: e7fe b.n 8028280 <xQueueGenericReceive+0x14>
  19639. configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  19640. 8028282: b929 cbnz r1, 8028290 <xQueueGenericReceive+0x24>
  19641. 8028284: 6c03 ldr r3, [r0, #64] ; 0x40
  19642. 8028286: b12b cbz r3, 8028294 <xQueueGenericReceive+0x28>
  19643. 8028288: e07e b.n 8028388 <xQueueGenericReceive+0x11c>
  19644. 802828a: e7fe b.n 802828a <xQueueGenericReceive+0x1e>
  19645. 802828c: 2601 movs r6, #1
  19646. 802828e: e003 b.n 8028298 <xQueueGenericReceive+0x2c>
  19647. 8028290: 2600 movs r6, #0
  19648. 8028292: e000 b.n 8028296 <xQueueGenericReceive+0x2a>
  19649. 8028294: 460e mov r6, r1
  19650. /* Interrupts and other tasks can send to and receive from the queue
  19651. now the critical section has been exited. */
  19652. vTaskSuspendAll();
  19653. prvLockQueue( pxQueue );
  19654. 8028296: 2700 movs r7, #0
  19655. statements within the function itself. This is done in the interest
  19656. of execution time efficiency. */
  19657. for( ;; )
  19658. {
  19659. taskENTER_CRITICAL();
  19660. 8028298: f000 fd4c bl 8028d34 <vPortEnterCritical>
  19661. {
  19662. /* Is there data in the queue now? To be running the calling task
  19663. must be the highest priority task wanting to access the queue. */
  19664. if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 )
  19665. 802829c: 6ba3 ldr r3, [r4, #56] ; 0x38
  19666. 802829e: b33b cbz r3, 80282f0 <xQueueGenericReceive+0x84>
  19667. {
  19668. /* Remember the read position in case the queue is only being
  19669. peeked. */
  19670. pcOriginalReadPosition = pxQueue->u.pcReadFrom;
  19671. prvCopyDataFromQueue( pxQueue, pvBuffer );
  19672. 80282a0: 4620 mov r0, r4
  19673. 80282a2: 4629 mov r1, r5
  19674. must be the highest priority task wanting to access the queue. */
  19675. if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 )
  19676. {
  19677. /* Remember the read position in case the queue is only being
  19678. peeked. */
  19679. pcOriginalReadPosition = pxQueue->u.pcReadFrom;
  19680. 80282a4: 68e6 ldr r6, [r4, #12]
  19681. prvCopyDataFromQueue( pxQueue, pvBuffer );
  19682. 80282a6: f7ff fdc1 bl 8027e2c <prvCopyDataFromQueue>
  19683. if( xJustPeeking == pdFALSE )
  19684. 80282aa: f1b9 0f00 cmp.w r9, #0
  19685. 80282ae: d112 bne.n 80282d6 <xQueueGenericReceive+0x6a>
  19686. {
  19687. traceQUEUE_RECEIVE( pxQueue );
  19688. /* Actually removing data, not just peeking. */
  19689. --( pxQueue->uxMessagesWaiting );
  19690. 80282b0: 6ba3 ldr r3, [r4, #56] ; 0x38
  19691. 80282b2: 3b01 subs r3, #1
  19692. 80282b4: 63a3 str r3, [r4, #56] ; 0x38
  19693. #if ( configUSE_MUTEXES == 1 )
  19694. {
  19695. if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )
  19696. 80282b6: 6823 ldr r3, [r4, #0]
  19697. 80282b8: b913 cbnz r3, 80282c0 <xQueueGenericReceive+0x54>
  19698. {
  19699. /* Record the information required to implement
  19700. priority inheritance should it become necessary. */
  19701. pxQueue->pxMutexHolder = ( int8_t * ) pvTaskIncrementMutexHeldCount(); /*lint !e961 Cast is not redundant as TaskHandle_t is a typedef. */
  19702. 80282ba: f000 fceb bl 8028c94 <pvTaskIncrementMutexHeldCount>
  19703. 80282be: 6060 str r0, [r4, #4]
  19704. mtCOVERAGE_TEST_MARKER();
  19705. }
  19706. }
  19707. #endif /* configUSE_MUTEXES */
  19708. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
  19709. 80282c0: 6923 ldr r3, [r4, #16]
  19710. 80282c2: b18b cbz r3, 80282e8 <xQueueGenericReceive+0x7c>
  19711. {
  19712. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE )
  19713. 80282c4: f104 0010 add.w r0, r4, #16
  19714. 80282c8: f000 fbda bl 8028a80 <xTaskRemoveFromEventList>
  19715. 80282cc: 2801 cmp r0, #1
  19716. 80282ce: d10b bne.n 80282e8 <xQueueGenericReceive+0x7c>
  19717. {
  19718. queueYIELD_IF_USING_PREEMPTION();
  19719. 80282d0: f000 fd1c bl 8028d0c <vPortYield>
  19720. 80282d4: e008 b.n 80282e8 <xQueueGenericReceive+0x7c>
  19721. pointer. */
  19722. pxQueue->u.pcReadFrom = pcOriginalReadPosition;
  19723. /* The data is being left in the queue, so see if there are
  19724. any other tasks waiting for the data. */
  19725. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  19726. 80282d6: 6a63 ldr r3, [r4, #36] ; 0x24
  19727. {
  19728. traceQUEUE_PEEK( pxQueue );
  19729. /* The data is not being removed, so reset the read
  19730. pointer. */
  19731. pxQueue->u.pcReadFrom = pcOriginalReadPosition;
  19732. 80282d8: 60e6 str r6, [r4, #12]
  19733. /* The data is being left in the queue, so see if there are
  19734. any other tasks waiting for the data. */
  19735. if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
  19736. 80282da: b12b cbz r3, 80282e8 <xQueueGenericReceive+0x7c>
  19737. {
  19738. /* Tasks that are removed from the event list will get added to
  19739. the pending ready list as the scheduler is still suspended. */
  19740. if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
  19741. 80282dc: f104 0024 add.w r0, r4, #36 ; 0x24
  19742. 80282e0: f000 fbce bl 8028a80 <xTaskRemoveFromEventList>
  19743. 80282e4: 2800 cmp r0, #0
  19744. 80282e6: d1f3 bne.n 80282d0 <xQueueGenericReceive+0x64>
  19745. {
  19746. mtCOVERAGE_TEST_MARKER();
  19747. }
  19748. }
  19749. taskEXIT_CRITICAL();
  19750. 80282e8: f000 fd50 bl 8028d8c <vPortExitCritical>
  19751. return pdPASS;
  19752. 80282ec: 2001 movs r0, #1
  19753. 80282ee: e04e b.n 802838e <xQueueGenericReceive+0x122>
  19754. }
  19755. else
  19756. {
  19757. if( xTicksToWait == ( TickType_t ) 0 )
  19758. 80282f0: f8dd 8004 ldr.w r8, [sp, #4]
  19759. 80282f4: f1b8 0f00 cmp.w r8, #0
  19760. 80282f8: d102 bne.n 8028300 <xQueueGenericReceive+0x94>
  19761. {
  19762. /* The queue was empty and no block time is specified (or
  19763. the block time has expired) so leave now. */
  19764. taskEXIT_CRITICAL();
  19765. 80282fa: f000 fd47 bl 8028d8c <vPortExitCritical>
  19766. 80282fe: e041 b.n 8028384 <xQueueGenericReceive+0x118>
  19767. traceQUEUE_RECEIVE_FAILED( pxQueue );
  19768. return errQUEUE_EMPTY;
  19769. }
  19770. else if( xEntryTimeSet == pdFALSE )
  19771. 8028300: b916 cbnz r6, 8028308 <xQueueGenericReceive+0x9c>
  19772. {
  19773. /* The queue was empty and a block time was specified so
  19774. configure the timeout structure. */
  19775. vTaskSetTimeOutState( &xTimeOut );
  19776. 8028302: a802 add r0, sp, #8
  19777. 8028304: f000 fbf8 bl 8028af8 <vTaskSetTimeOutState>
  19778. /* Entry time was already set. */
  19779. mtCOVERAGE_TEST_MARKER();
  19780. }
  19781. }
  19782. }
  19783. taskEXIT_CRITICAL();
  19784. 8028308: f000 fd40 bl 8028d8c <vPortExitCritical>
  19785. /* Interrupts and other tasks can send to and receive from the queue
  19786. now the critical section has been exited. */
  19787. vTaskSuspendAll();
  19788. 802830c: f000 f9e8 bl 80286e0 <vTaskSuspendAll>
  19789. prvLockQueue( pxQueue );
  19790. 8028310: f000 fd10 bl 8028d34 <vPortEnterCritical>
  19791. 8028314: 6c63 ldr r3, [r4, #68] ; 0x44
  19792. 8028316: 3301 adds r3, #1
  19793. 8028318: bf08 it eq
  19794. 802831a: 6467 streq r7, [r4, #68] ; 0x44
  19795. 802831c: 6ca3 ldr r3, [r4, #72] ; 0x48
  19796. 802831e: 3301 adds r3, #1
  19797. 8028320: bf08 it eq
  19798. 8028322: 64a7 streq r7, [r4, #72] ; 0x48
  19799. 8028324: f000 fd32 bl 8028d8c <vPortExitCritical>
  19800. /* Update the timeout state to see if it has expired yet. */
  19801. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  19802. 8028328: a802 add r0, sp, #8
  19803. 802832a: a901 add r1, sp, #4
  19804. 802832c: f000 fbf4 bl 8028b18 <xTaskCheckForTimeOut>
  19805. 8028330: bb18 cbnz r0, 802837a <xQueueGenericReceive+0x10e>
  19806. static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue )
  19807. {
  19808. BaseType_t xReturn;
  19809. taskENTER_CRITICAL();
  19810. 8028332: f000 fcff bl 8028d34 <vPortEnterCritical>
  19811. {
  19812. if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 )
  19813. 8028336: 6ba6 ldr r6, [r4, #56] ; 0x38
  19814. else
  19815. {
  19816. xReturn = pdFALSE;
  19817. }
  19818. }
  19819. taskEXIT_CRITICAL();
  19820. 8028338: f000 fd28 bl 8028d8c <vPortExitCritical>
  19821. prvLockQueue( pxQueue );
  19822. /* Update the timeout state to see if it has expired yet. */
  19823. if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
  19824. {
  19825. if( prvIsQueueEmpty( pxQueue ) != pdFALSE )
  19826. 802833c: b9be cbnz r6, 802836e <xQueueGenericReceive+0x102>
  19827. {
  19828. traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue );
  19829. #if ( configUSE_MUTEXES == 1 )
  19830. {
  19831. if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )
  19832. 802833e: 6823 ldr r3, [r4, #0]
  19833. 8028340: b933 cbnz r3, 8028350 <xQueueGenericReceive+0xe4>
  19834. {
  19835. taskENTER_CRITICAL();
  19836. 8028342: f000 fcf7 bl 8028d34 <vPortEnterCritical>
  19837. {
  19838. vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder );
  19839. 8028346: 6860 ldr r0, [r4, #4]
  19840. 8028348: f000 fc1a bl 8028b80 <vTaskPriorityInherit>
  19841. }
  19842. taskEXIT_CRITICAL();
  19843. 802834c: f000 fd1e bl 8028d8c <vPortExitCritical>
  19844. mtCOVERAGE_TEST_MARKER();
  19845. }
  19846. }
  19847. #endif
  19848. vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );
  19849. 8028350: f104 0024 add.w r0, r4, #36 ; 0x24
  19850. 8028354: 9901 ldr r1, [sp, #4]
  19851. 8028356: f000 fb5f bl 8028a18 <vTaskPlaceOnEventList>
  19852. prvUnlockQueue( pxQueue );
  19853. 802835a: 4620 mov r0, r4
  19854. 802835c: f7ff fd79 bl 8027e52 <prvUnlockQueue>
  19855. if( xTaskResumeAll() == pdFALSE )
  19856. 8028360: f000 fa5a bl 8028818 <xTaskResumeAll>
  19857. 8028364: 2800 cmp r0, #0
  19858. 8028366: d191 bne.n 802828c <xQueueGenericReceive+0x20>
  19859. {
  19860. portYIELD_WITHIN_API();
  19861. 8028368: f000 fcd0 bl 8028d0c <vPortYield>
  19862. 802836c: e78e b.n 802828c <xQueueGenericReceive+0x20>
  19863. }
  19864. }
  19865. else
  19866. {
  19867. /* Try again. */
  19868. prvUnlockQueue( pxQueue );
  19869. 802836e: 4620 mov r0, r4
  19870. 8028370: f7ff fd6f bl 8027e52 <prvUnlockQueue>
  19871. ( void ) xTaskResumeAll();
  19872. 8028374: f000 fa50 bl 8028818 <xTaskResumeAll>
  19873. 8028378: e788 b.n 802828c <xQueueGenericReceive+0x20>
  19874. }
  19875. }
  19876. else
  19877. {
  19878. prvUnlockQueue( pxQueue );
  19879. 802837a: 4620 mov r0, r4
  19880. 802837c: f7ff fd69 bl 8027e52 <prvUnlockQueue>
  19881. ( void ) xTaskResumeAll();
  19882. 8028380: f000 fa4a bl 8028818 <xTaskResumeAll>
  19883. traceQUEUE_RECEIVE_FAILED( pxQueue );
  19884. return errQUEUE_EMPTY;
  19885. 8028384: 2000 movs r0, #0
  19886. 8028386: e002 b.n 802838e <xQueueGenericReceive+0x122>
  19887. TimeOut_t xTimeOut;
  19888. int8_t *pcOriginalReadPosition;
  19889. Queue_t * const pxQueue = ( Queue_t * ) xQueue;
  19890. configASSERT( pxQueue );
  19891. configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
  19892. 8028388: f000 fccc bl 8028d24 <ulPortSetInterruptMask>
  19893. 802838c: e77d b.n 802828a <xQueueGenericReceive+0x1e>
  19894. ( void ) xTaskResumeAll();
  19895. traceQUEUE_RECEIVE_FAILED( pxQueue );
  19896. return errQUEUE_EMPTY;
  19897. }
  19898. }
  19899. }
  19900. 802838e: b005 add sp, #20
  19901. 8028390: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  19902. 08028394 <uxQueueSpacesAvailable>:
  19903. return uxReturn;
  19904. } /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */
  19905. /*-----------------------------------------------------------*/
  19906. UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue )
  19907. {
  19908. 8028394: b510 push {r4, lr}
  19909. UBaseType_t uxReturn;
  19910. Queue_t *pxQueue;
  19911. pxQueue = ( Queue_t * ) xQueue;
  19912. configASSERT( pxQueue );
  19913. 8028396: 4604 mov r4, r0
  19914. 8028398: b910 cbnz r0, 80283a0 <uxQueueSpacesAvailable+0xc>
  19915. 802839a: f000 fcc3 bl 8028d24 <ulPortSetInterruptMask>
  19916. 802839e: e7fe b.n 802839e <uxQueueSpacesAvailable+0xa>
  19917. taskENTER_CRITICAL();
  19918. 80283a0: f000 fcc8 bl 8028d34 <vPortEnterCritical>
  19919. {
  19920. uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting;
  19921. 80283a4: 6ba3 ldr r3, [r4, #56] ; 0x38
  19922. 80283a6: 6be4 ldr r4, [r4, #60] ; 0x3c
  19923. 80283a8: 1ae4 subs r4, r4, r3
  19924. }
  19925. taskEXIT_CRITICAL();
  19926. 80283aa: f000 fcef bl 8028d8c <vPortExitCritical>
  19927. return uxReturn;
  19928. } /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */
  19929. 80283ae: 4620 mov r0, r4
  19930. 80283b0: bd10 pop {r4, pc}
  19931. 80283b2: 0000 movs r0, r0
  19932. 080283b4 <prvResetNextTaskUnblockTime>:
  19933. static void prvResetNextTaskUnblockTime( void )
  19934. {
  19935. TCB_t *pxTCB;
  19936. if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )
  19937. 80283b4: 4a06 ldr r2, [pc, #24] ; (80283d0 <prvResetNextTaskUnblockTime+0x1c>)
  19938. 80283b6: 6813 ldr r3, [r2, #0]
  19939. 80283b8: 6819 ldr r1, [r3, #0]
  19940. 80283ba: 4b06 ldr r3, [pc, #24] ; (80283d4 <prvResetNextTaskUnblockTime+0x20>)
  19941. 80283bc: b911 cbnz r1, 80283c4 <prvResetNextTaskUnblockTime+0x10>
  19942. /* The new current delayed list is empty. Set
  19943. xNextTaskUnblockTime to the maximum possible value so it is
  19944. extremely unlikely that the
  19945. if( xTickCount >= xNextTaskUnblockTime ) test will pass until
  19946. there is an item in the delayed list. */
  19947. xNextTaskUnblockTime = portMAX_DELAY;
  19948. 80283be: f04f 32ff mov.w r2, #4294967295
  19949. 80283c2: e003 b.n 80283cc <prvResetNextTaskUnblockTime+0x18>
  19950. {
  19951. /* The new current delayed list is not empty, get the value of
  19952. the item at the head of the delayed list. This is the time at
  19953. which the task at the head of the delayed list should be removed
  19954. from the Blocked state. */
  19955. ( pxTCB ) = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );
  19956. 80283c4: 6812 ldr r2, [r2, #0]
  19957. 80283c6: 68d2 ldr r2, [r2, #12]
  19958. xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xGenericListItem ) );
  19959. 80283c8: 68d2 ldr r2, [r2, #12]
  19960. 80283ca: 6852 ldr r2, [r2, #4]
  19961. 80283cc: 601a str r2, [r3, #0]
  19962. 80283ce: 4770 bx lr
  19963. 80283d0: 200028dc .word 0x200028dc
  19964. 80283d4: 200015d4 .word 0x200015d4
  19965. 080283d8 <prvAddCurrentTaskToDelayedList>:
  19966. /*-----------------------------------------------------------*/
  19967. static void prvAddCurrentTaskToDelayedList( const TickType_t xTimeToWake )
  19968. {
  19969. /* The list item will be inserted in wake time order. */
  19970. listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
  19971. 80283d8: 4b0e ldr r3, [pc, #56] ; (8028414 <prvAddCurrentTaskToDelayedList+0x3c>)
  19972. 80283da: 681a ldr r2, [r3, #0]
  19973. #endif /* vTaskDelete */
  19974. }
  19975. /*-----------------------------------------------------------*/
  19976. static void prvAddCurrentTaskToDelayedList( const TickType_t xTimeToWake )
  19977. {
  19978. 80283dc: b510 push {r4, lr}
  19979. /* The list item will be inserted in wake time order. */
  19980. listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
  19981. 80283de: 6050 str r0, [r2, #4]
  19982. if( xTimeToWake < xTickCount )
  19983. 80283e0: 4a0d ldr r2, [pc, #52] ; (8028418 <prvAddCurrentTaskToDelayedList+0x40>)
  19984. 80283e2: 6812 ldr r2, [r2, #0]
  19985. 80283e4: 4290 cmp r0, r2
  19986. #endif /* vTaskDelete */
  19987. }
  19988. /*-----------------------------------------------------------*/
  19989. static void prvAddCurrentTaskToDelayedList( const TickType_t xTimeToWake )
  19990. {
  19991. 80283e6: 4604 mov r4, r0
  19992. /* The list item will be inserted in wake time order. */
  19993. listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
  19994. if( xTimeToWake < xTickCount )
  19995. 80283e8: d207 bcs.n 80283fa <prvAddCurrentTaskToDelayedList+0x22>
  19996. {
  19997. /* Wake time has overflowed. Place this item in the overflow list. */
  19998. vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  19999. 80283ea: 4a0c ldr r2, [pc, #48] ; (802841c <prvAddCurrentTaskToDelayedList+0x44>)
  20000. 80283ec: 6810 ldr r0, [r2, #0]
  20001. 80283ee: 6819 ldr r1, [r3, #0]
  20002. 80283f0: 3104 adds r1, #4
  20003. else
  20004. {
  20005. mtCOVERAGE_TEST_MARKER();
  20006. }
  20007. }
  20008. }
  20009. 80283f2: e8bd 4010 ldmia.w sp!, {r4, lr}
  20010. listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
  20011. if( xTimeToWake < xTickCount )
  20012. {
  20013. /* Wake time has overflowed. Place this item in the overflow list. */
  20014. vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  20015. 80283f6: f7ff bcf1 b.w 8027ddc <vListInsert>
  20016. }
  20017. else
  20018. {
  20019. /* The wake time has not overflowed, so the current block list is used. */
  20020. vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  20021. 80283fa: 4a09 ldr r2, [pc, #36] ; (8028420 <prvAddCurrentTaskToDelayedList+0x48>)
  20022. 80283fc: 6810 ldr r0, [r2, #0]
  20023. 80283fe: 6819 ldr r1, [r3, #0]
  20024. 8028400: 3104 adds r1, #4
  20025. 8028402: f7ff fceb bl 8027ddc <vListInsert>
  20026. /* If the task entering the blocked state was placed at the head of the
  20027. list of blocked tasks then xNextTaskUnblockTime needs to be updated
  20028. too. */
  20029. if( xTimeToWake < xNextTaskUnblockTime )
  20030. 8028406: 4b07 ldr r3, [pc, #28] ; (8028424 <prvAddCurrentTaskToDelayedList+0x4c>)
  20031. 8028408: 681a ldr r2, [r3, #0]
  20032. 802840a: 4294 cmp r4, r2
  20033. {
  20034. xNextTaskUnblockTime = xTimeToWake;
  20035. 802840c: bf38 it cc
  20036. 802840e: 601c strcc r4, [r3, #0]
  20037. 8028410: bd10 pop {r4, pc}
  20038. 8028412: bf00 nop
  20039. 8028414: 2000298c .word 0x2000298c
  20040. 8028418: 200029a8 .word 0x200029a8
  20041. 802841c: 200029ac .word 0x200029ac
  20042. 8028420: 200028dc .word 0x200028dc
  20043. 8028424: 200015d4 .word 0x200015d4
  20044. 08028428 <xTaskGenericCreate>:
  20045. #endif
  20046. /*-----------------------------------------------------------*/
  20047. 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. */
  20048. {
  20049. 8028428: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  20050. 802842c: 9d0a ldr r5, [sp, #40] ; 0x28
  20051. 802842e: f8dd 802c ldr.w r8, [sp, #44] ; 0x2c
  20052. 8028432: 9e0c ldr r6, [sp, #48] ; 0x30
  20053. 8028434: 460f mov r7, r1
  20054. 8028436: 4693 mov fp, r2
  20055. 8028438: 469a mov sl, r3
  20056. BaseType_t xReturn;
  20057. TCB_t * pxNewTCB;
  20058. StackType_t *pxTopOfStack;
  20059. configASSERT( pxTaskCode );
  20060. 802843a: 4681 mov r9, r0
  20061. 802843c: b910 cbnz r0, 8028444 <xTaskGenericCreate+0x1c>
  20062. 802843e: f000 fc71 bl 8028d24 <ulPortSetInterruptMask>
  20063. 8028442: e7fe b.n 8028442 <xTaskGenericCreate+0x1a>
  20064. configASSERT( ( ( uxPriority & ( ~portPRIVILEGE_BIT ) ) < configMAX_PRIORITIES ) );
  20065. 8028444: 2d04 cmp r5, #4
  20066. 8028446: d902 bls.n 802844e <xTaskGenericCreate+0x26>
  20067. 8028448: f000 fc6c bl 8028d24 <ulPortSetInterruptMask>
  20068. 802844c: e7fe b.n 802844c <xTaskGenericCreate+0x24>
  20069. #else /* portSTACK_GROWTH */
  20070. {
  20071. StackType_t *pxStack;
  20072. /* Allocate space for the stack used by the task being created. */
  20073. pxStack = ( StackType_t * ) pvPortMallocAligned( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ), puxStackBuffer ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
  20074. 802844e: b936 cbnz r6, 802845e <xTaskGenericCreate+0x36>
  20075. 8028450: 0090 lsls r0, r2, #2
  20076. 8028452: f000 fd7d bl 8028f50 <pvPortMalloc>
  20077. if( pxStack != NULL )
  20078. 8028456: 4606 mov r6, r0
  20079. 8028458: 2800 cmp r0, #0
  20080. 802845a: f000 809e beq.w 802859a <xTaskGenericCreate+0x172>
  20081. {
  20082. /* Allocate space for the TCB. Where the memory comes from depends
  20083. on the implementation of the port malloc function. */
  20084. pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) );
  20085. 802845e: 205c movs r0, #92 ; 0x5c
  20086. 8028460: f000 fd76 bl 8028f50 <pvPortMalloc>
  20087. if( pxNewTCB != NULL )
  20088. 8028464: 4604 mov r4, r0
  20089. 8028466: b178 cbz r0, 8028488 <xTaskGenericCreate+0x60>
  20090. {
  20091. /* Store the stack location in the TCB. */
  20092. pxNewTCB->pxStack = pxStack;
  20093. 8028468: 6306 str r6, [r0, #48] ; 0x30
  20094. {
  20095. /* Avoid dependency on memset() if it is not required. */
  20096. #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) )
  20097. {
  20098. /* Just to help debugging. */
  20099. ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) usStackDepth * sizeof( StackType_t ) );
  20100. 802846a: ea4f 028b mov.w r2, fp, lsl #2
  20101. 802846e: 4630 mov r0, r6
  20102. 8028470: 21a5 movs r1, #165 ; 0xa5
  20103. 8028472: f7f9 f9a1 bl 80217b8 <memset>
  20104. stack grows from high memory to low (as per the 80x86) or vice versa.
  20105. portSTACK_GROWTH is used to make the result positive or negative as
  20106. required by the port. */
  20107. #if( portSTACK_GROWTH < 0 )
  20108. {
  20109. pxTopOfStack = pxNewTCB->pxStack + ( usStackDepth - ( uint16_t ) 1 );
  20110. 8028476: 6b23 ldr r3, [r4, #48] ; 0x30
  20111. 8028478: f10b 3bff add.w fp, fp, #4294967295
  20112. 802847c: eb03 0b8b add.w fp, r3, fp, lsl #2
  20113. 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. */
  20114. 8028480: f02b 0b07 bic.w fp, fp, #7
  20115. 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. */
  20116. {
  20117. UBaseType_t x;
  20118. /* Store the task name in the TCB. */
  20119. for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )
  20120. 8028484: 2600 movs r6, #0
  20121. 8028486: e003 b.n 8028490 <xTaskGenericCreate+0x68>
  20122. }
  20123. else
  20124. {
  20125. /* The stack cannot be used as the TCB was not created. Free it
  20126. again. */
  20127. vPortFree( pxStack );
  20128. 8028488: 4630 mov r0, r6
  20129. 802848a: f000 fde7 bl 802905c <vPortFree>
  20130. 802848e: e084 b.n 802859a <xTaskGenericCreate+0x172>
  20131. static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName );
  20132. #endif
  20133. /*-----------------------------------------------------------*/
  20134. 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. */
  20135. 8028490: 19a3 adds r3, r4, r6
  20136. UBaseType_t x;
  20137. /* Store the task name in the TCB. */
  20138. for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )
  20139. {
  20140. pxTCB->pcTaskName[ x ] = pcName[ x ];
  20141. 8028492: 5dba ldrb r2, [r7, r6]
  20142. 8028494: f883 2034 strb.w r2, [r3, #52] ; 0x34
  20143. /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than
  20144. configMAX_TASK_NAME_LEN characters just in case the memory after the
  20145. string is not accessible (extremely unlikely). */
  20146. if( pcName[ x ] == 0x00 )
  20147. 8028498: 5dbb ldrb r3, [r7, r6]
  20148. 802849a: b113 cbz r3, 80284a2 <xTaskGenericCreate+0x7a>
  20149. 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. */
  20150. {
  20151. UBaseType_t x;
  20152. /* Store the task name in the TCB. */
  20153. for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )
  20154. 802849c: 3601 adds r6, #1
  20155. 802849e: 2e10 cmp r6, #16
  20156. 80284a0: d1f6 bne.n 8028490 <xTaskGenericCreate+0x68>
  20157. }
  20158. }
  20159. /* Ensure the name string is terminated in the case that the string length
  20160. was greater or equal to configMAX_TASK_NAME_LEN. */
  20161. pxTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0';
  20162. 80284a2: 2600 movs r6, #0
  20163. pxTCB->uxBasePriority = uxPriority;
  20164. pxTCB->uxMutexesHeld = 0;
  20165. }
  20166. #endif /* configUSE_MUTEXES */
  20167. vListInitialiseItem( &( pxTCB->xGenericListItem ) );
  20168. 80284a4: 1d27 adds r7, r4, #4
  20169. 80284a6: 4638 mov r0, r7
  20170. }
  20171. }
  20172. /* Ensure the name string is terminated in the case that the string length
  20173. was greater or equal to configMAX_TASK_NAME_LEN. */
  20174. pxTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0';
  20175. 80284a8: f884 6043 strb.w r6, [r4, #67] ; 0x43
  20176. else
  20177. {
  20178. mtCOVERAGE_TEST_MARKER();
  20179. }
  20180. pxTCB->uxPriority = uxPriority;
  20181. 80284ac: 62e5 str r5, [r4, #44] ; 0x2c
  20182. #if ( configUSE_MUTEXES == 1 )
  20183. {
  20184. pxTCB->uxBasePriority = uxPriority;
  20185. 80284ae: 64e5 str r5, [r4, #76] ; 0x4c
  20186. pxTCB->uxMutexesHeld = 0;
  20187. 80284b0: 6526 str r6, [r4, #80] ; 0x50
  20188. }
  20189. #endif /* configUSE_MUTEXES */
  20190. vListInitialiseItem( &( pxTCB->xGenericListItem ) );
  20191. 80284b2: f7ff fc84 bl 8027dbe <vListInitialiseItem>
  20192. vListInitialiseItem( &( pxTCB->xEventListItem ) );
  20193. 80284b6: f104 0018 add.w r0, r4, #24
  20194. 80284ba: f7ff fc80 bl 8027dbe <vListInitialiseItem>
  20195. /* Set the pxTCB as a link back from the ListItem_t. This is so we can get
  20196. back to the containing TCB from a generic item in a list. */
  20197. listSET_LIST_ITEM_OWNER( &( pxTCB->xGenericListItem ), pxTCB );
  20198. /* Event lists are always in priority order. */
  20199. 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. */
  20200. 80284be: f1c5 0305 rsb r3, r5, #5
  20201. }
  20202. #endif /* portUSING_MPU_WRAPPERS */
  20203. #if ( configUSE_TASK_NOTIFICATIONS == 1 )
  20204. {
  20205. pxTCB->ulNotifiedValue = 0;
  20206. 80284c2: 6566 str r6, [r4, #84] ; 0x54
  20207. vListInitialiseItem( &( pxTCB->xGenericListItem ) );
  20208. vListInitialiseItem( &( pxTCB->xEventListItem ) );
  20209. /* Set the pxTCB as a link back from the ListItem_t. This is so we can get
  20210. back to the containing TCB from a generic item in a list. */
  20211. listSET_LIST_ITEM_OWNER( &( pxTCB->xGenericListItem ), pxTCB );
  20212. 80284c4: 6124 str r4, [r4, #16]
  20213. /* Event lists are always in priority order. */
  20214. 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. */
  20215. 80284c6: 61a3 str r3, [r4, #24]
  20216. listSET_LIST_ITEM_OWNER( &( pxTCB->xEventListItem ), pxTCB );
  20217. 80284c8: 6264 str r4, [r4, #36] ; 0x24
  20218. #endif /* portUSING_MPU_WRAPPERS */
  20219. #if ( configUSE_TASK_NOTIFICATIONS == 1 )
  20220. {
  20221. pxTCB->ulNotifiedValue = 0;
  20222. pxTCB->eNotifyState = eNotWaitingNotification;
  20223. 80284ca: f884 6058 strb.w r6, [r4, #88] ; 0x58
  20224. {
  20225. pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged );
  20226. }
  20227. #else /* portUSING_MPU_WRAPPERS */
  20228. {
  20229. pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters );
  20230. 80284ce: 4658 mov r0, fp
  20231. 80284d0: 4649 mov r1, r9
  20232. 80284d2: 4652 mov r2, sl
  20233. 80284d4: f000 fbfa bl 8028ccc <pxPortInitialiseStack>
  20234. 80284d8: 6020 str r0, [r4, #0]
  20235. }
  20236. #endif /* portUSING_MPU_WRAPPERS */
  20237. if( ( void * ) pxCreatedTask != NULL )
  20238. 80284da: f1b8 0f00 cmp.w r8, #0
  20239. 80284de: d001 beq.n 80284e4 <xTaskGenericCreate+0xbc>
  20240. {
  20241. /* Pass the TCB out - in an anonymous way. The calling function/
  20242. task can use this as a handle to delete the task later if
  20243. required.*/
  20244. *pxCreatedTask = ( TaskHandle_t ) pxNewTCB;
  20245. 80284e0: f8c8 4000 str.w r4, [r8]
  20246. mtCOVERAGE_TEST_MARKER();
  20247. }
  20248. /* Ensure interrupts don't access the task lists while they are being
  20249. updated. */
  20250. taskENTER_CRITICAL();
  20251. 80284e4: f000 fc26 bl 8028d34 <vPortEnterCritical>
  20252. {
  20253. uxCurrentNumberOfTasks++;
  20254. 80284e8: 4a2e ldr r2, [pc, #184] ; (80285a4 <xTaskGenericCreate+0x17c>)
  20255. 80284ea: 6813 ldr r3, [r2, #0]
  20256. 80284ec: 3301 adds r3, #1
  20257. 80284ee: 6013 str r3, [r2, #0]
  20258. if( pxCurrentTCB == NULL )
  20259. 80284f0: 4b2d ldr r3, [pc, #180] ; (80285a8 <xTaskGenericCreate+0x180>)
  20260. 80284f2: 681e ldr r6, [r3, #0]
  20261. 80284f4: bb36 cbnz r6, 8028544 <xTaskGenericCreate+0x11c>
  20262. {
  20263. /* There are no other tasks, or all the other tasks are in
  20264. the suspended state - make this the current task. */
  20265. pxCurrentTCB = pxNewTCB;
  20266. 80284f6: 601c str r4, [r3, #0]
  20267. if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 )
  20268. 80284f8: 6813 ldr r3, [r2, #0]
  20269. 80284fa: 2b01 cmp r3, #1
  20270. 80284fc: d12a bne.n 8028554 <xTaskGenericCreate+0x12c>
  20271. {
  20272. UBaseType_t uxPriority;
  20273. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  20274. {
  20275. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  20276. 80284fe: f8df 80d0 ldr.w r8, [pc, #208] ; 80285d0 <xTaskGenericCreate+0x1a8>
  20277. 8028502: f04f 0914 mov.w r9, #20
  20278. 8028506: fb09 8006 mla r0, r9, r6, r8
  20279. static void prvInitialiseTaskLists( void )
  20280. {
  20281. UBaseType_t uxPriority;
  20282. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  20283. 802850a: 3601 adds r6, #1
  20284. {
  20285. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  20286. 802850c: f7ff fc4c bl 8027da8 <vListInitialise>
  20287. static void prvInitialiseTaskLists( void )
  20288. {
  20289. UBaseType_t uxPriority;
  20290. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  20291. 8028510: 2e05 cmp r6, #5
  20292. 8028512: d1f8 bne.n 8028506 <xTaskGenericCreate+0xde>
  20293. {
  20294. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  20295. }
  20296. vListInitialise( &xDelayedTaskList1 );
  20297. 8028514: f8df 80bc ldr.w r8, [pc, #188] ; 80285d4 <xTaskGenericCreate+0x1ac>
  20298. vListInitialise( &xDelayedTaskList2 );
  20299. 8028518: 4e24 ldr r6, [pc, #144] ; (80285ac <xTaskGenericCreate+0x184>)
  20300. for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
  20301. {
  20302. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  20303. }
  20304. vListInitialise( &xDelayedTaskList1 );
  20305. 802851a: 4640 mov r0, r8
  20306. 802851c: f7ff fc44 bl 8027da8 <vListInitialise>
  20307. vListInitialise( &xDelayedTaskList2 );
  20308. 8028520: 4630 mov r0, r6
  20309. 8028522: f7ff fc41 bl 8027da8 <vListInitialise>
  20310. vListInitialise( &xPendingReadyList );
  20311. 8028526: 4822 ldr r0, [pc, #136] ; (80285b0 <xTaskGenericCreate+0x188>)
  20312. 8028528: f7ff fc3e bl 8027da8 <vListInitialise>
  20313. #if ( INCLUDE_vTaskDelete == 1 )
  20314. {
  20315. vListInitialise( &xTasksWaitingTermination );
  20316. 802852c: 4821 ldr r0, [pc, #132] ; (80285b4 <xTaskGenericCreate+0x18c>)
  20317. 802852e: f7ff fc3b bl 8027da8 <vListInitialise>
  20318. }
  20319. #endif /* INCLUDE_vTaskDelete */
  20320. #if ( INCLUDE_vTaskSuspend == 1 )
  20321. {
  20322. vListInitialise( &xSuspendedTaskList );
  20323. 8028532: 4821 ldr r0, [pc, #132] ; (80285b8 <xTaskGenericCreate+0x190>)
  20324. 8028534: f7ff fc38 bl 8027da8 <vListInitialise>
  20325. }
  20326. #endif /* INCLUDE_vTaskSuspend */
  20327. /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList
  20328. using list2. */
  20329. pxDelayedTaskList = &xDelayedTaskList1;
  20330. 8028538: 4b20 ldr r3, [pc, #128] ; (80285bc <xTaskGenericCreate+0x194>)
  20331. 802853a: f8c3 8000 str.w r8, [r3]
  20332. pxOverflowDelayedTaskList = &xDelayedTaskList2;
  20333. 802853e: 4b20 ldr r3, [pc, #128] ; (80285c0 <xTaskGenericCreate+0x198>)
  20334. 8028540: 601e str r6, [r3, #0]
  20335. 8028542: e007 b.n 8028554 <xTaskGenericCreate+0x12c>
  20336. else
  20337. {
  20338. /* If the scheduler is not already running, make this task the
  20339. current task if it is the highest priority task to be created
  20340. so far. */
  20341. if( xSchedulerRunning == pdFALSE )
  20342. 8028544: 4a1f ldr r2, [pc, #124] ; (80285c4 <xTaskGenericCreate+0x19c>)
  20343. 8028546: 6812 ldr r2, [r2, #0]
  20344. 8028548: b922 cbnz r2, 8028554 <xTaskGenericCreate+0x12c>
  20345. {
  20346. if( pxCurrentTCB->uxPriority <= uxPriority )
  20347. 802854a: 681a ldr r2, [r3, #0]
  20348. 802854c: 6ad2 ldr r2, [r2, #44] ; 0x2c
  20349. 802854e: 42aa cmp r2, r5
  20350. {
  20351. pxCurrentTCB = pxNewTCB;
  20352. 8028550: bf98 it ls
  20353. 8028552: 601c strls r4, [r3, #0]
  20354. {
  20355. mtCOVERAGE_TEST_MARKER();
  20356. }
  20357. }
  20358. uxTaskNumber++;
  20359. 8028554: 4a1c ldr r2, [pc, #112] ; (80285c8 <xTaskGenericCreate+0x1a0>)
  20360. 8028556: 6813 ldr r3, [r2, #0]
  20361. 8028558: 3301 adds r3, #1
  20362. 802855a: 6013 str r3, [r2, #0]
  20363. pxNewTCB->uxTCBNumber = uxTaskNumber;
  20364. }
  20365. #endif /* configUSE_TRACE_FACILITY */
  20366. traceTASK_CREATE( pxNewTCB );
  20367. prvAddTaskToReadyList( pxNewTCB );
  20368. 802855c: 4a1b ldr r2, [pc, #108] ; (80285cc <xTaskGenericCreate+0x1a4>)
  20369. uxTaskNumber++;
  20370. #if ( configUSE_TRACE_FACILITY == 1 )
  20371. {
  20372. /* Add a counter into the TCB for tracing only. */
  20373. pxNewTCB->uxTCBNumber = uxTaskNumber;
  20374. 802855e: 6463 str r3, [r4, #68] ; 0x44
  20375. }
  20376. #endif /* configUSE_TRACE_FACILITY */
  20377. traceTASK_CREATE( pxNewTCB );
  20378. prvAddTaskToReadyList( pxNewTCB );
  20379. 8028560: 6ae3 ldr r3, [r4, #44] ; 0x2c
  20380. 8028562: 6811 ldr r1, [r2, #0]
  20381. 8028564: 2401 movs r4, #1
  20382. 8028566: fa04 f003 lsl.w r0, r4, r3
  20383. 802856a: 4301 orrs r1, r0
  20384. 802856c: 6011 str r1, [r2, #0]
  20385. 802856e: 4a18 ldr r2, [pc, #96] ; (80285d0 <xTaskGenericCreate+0x1a8>)
  20386. 8028570: 2014 movs r0, #20
  20387. 8028572: fb00 2003 mla r0, r0, r3, r2
  20388. 8028576: 4639 mov r1, r7
  20389. 8028578: f7ff fc24 bl 8027dc4 <vListInsertEnd>
  20390. xReturn = pdPASS;
  20391. portSETUP_TCB( pxNewTCB );
  20392. }
  20393. taskEXIT_CRITICAL();
  20394. 802857c: f000 fc06 bl 8028d8c <vPortExitCritical>
  20395. traceTASK_CREATE_FAILED();
  20396. }
  20397. if( xReturn == pdPASS )
  20398. {
  20399. if( xSchedulerRunning != pdFALSE )
  20400. 8028580: 4b10 ldr r3, [pc, #64] ; (80285c4 <xTaskGenericCreate+0x19c>)
  20401. 8028582: 681b ldr r3, [r3, #0]
  20402. 8028584: b133 cbz r3, 8028594 <xTaskGenericCreate+0x16c>
  20403. {
  20404. /* If the created task is of a higher priority than the current task
  20405. then it should run now. */
  20406. if( pxCurrentTCB->uxPriority < uxPriority )
  20407. 8028586: 4b08 ldr r3, [pc, #32] ; (80285a8 <xTaskGenericCreate+0x180>)
  20408. 8028588: 681b ldr r3, [r3, #0]
  20409. 802858a: 6adb ldr r3, [r3, #44] ; 0x2c
  20410. 802858c: 42ab cmp r3, r5
  20411. 802858e: d201 bcs.n 8028594 <xTaskGenericCreate+0x16c>
  20412. {
  20413. taskYIELD_IF_USING_PREEMPTION();
  20414. 8028590: f000 fbbc bl 8028d0c <vPortYield>
  20415. #endif /* configUSE_TRACE_FACILITY */
  20416. traceTASK_CREATE( pxNewTCB );
  20417. prvAddTaskToReadyList( pxNewTCB );
  20418. xReturn = pdPASS;
  20419. 8028594: 4620 mov r0, r4
  20420. 8028596: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  20421. }
  20422. taskEXIT_CRITICAL();
  20423. }
  20424. else
  20425. {
  20426. xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
  20427. 802859a: f04f 30ff mov.w r0, #4294967295
  20428. mtCOVERAGE_TEST_MARKER();
  20429. }
  20430. }
  20431. return xReturn;
  20432. }
  20433. 802859e: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  20434. 80285a2: bf00 nop
  20435. 80285a4: 200029b4 .word 0x200029b4
  20436. 80285a8: 2000298c .word 0x2000298c
  20437. 80285ac: 200028fc .word 0x200028fc
  20438. 80285b0: 20002990 .word 0x20002990
  20439. 80285b4: 20002978 .word 0x20002978
  20440. 80285b8: 200029b8 .word 0x200029b8
  20441. 80285bc: 200028dc .word 0x200028dc
  20442. 80285c0: 200029ac .word 0x200029ac
  20443. 80285c4: 200028e0 .word 0x200028e0
  20444. 80285c8: 200029b0 .word 0x200029b0
  20445. 80285cc: 200029cc .word 0x200029cc
  20446. 80285d0: 20002914 .word 0x20002914
  20447. 80285d4: 200028e8 .word 0x200028e8
  20448. 080285d8 <vTaskDelete>:
  20449. /*-----------------------------------------------------------*/
  20450. #if ( INCLUDE_vTaskDelete == 1 )
  20451. void vTaskDelete( TaskHandle_t xTaskToDelete )
  20452. {
  20453. 80285d8: b538 push {r3, r4, r5, lr}
  20454. 80285da: 4604 mov r4, r0
  20455. TCB_t *pxTCB;
  20456. taskENTER_CRITICAL();
  20457. 80285dc: f000 fbaa bl 8028d34 <vPortEnterCritical>
  20458. {
  20459. /* If null is passed in here then it is the calling task that is
  20460. being deleted. */
  20461. pxTCB = prvGetTCBFromHandle( xTaskToDelete );
  20462. 80285e0: b90c cbnz r4, 80285e6 <vTaskDelete+0xe>
  20463. 80285e2: 4b22 ldr r3, [pc, #136] ; (802866c <vTaskDelete+0x94>)
  20464. 80285e4: 681c ldr r4, [r3, #0]
  20465. /* Remove task from the ready list and place in the termination list.
  20466. This will stop the task from be scheduled. The idle task will check
  20467. the termination list and free up any memory allocated by the
  20468. scheduler for the TCB and stack. */
  20469. if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  20470. 80285e6: 1d25 adds r5, r4, #4
  20471. 80285e8: 4628 mov r0, r5
  20472. 80285ea: f7ff fc0f bl 8027e0c <uxListRemove>
  20473. 80285ee: b968 cbnz r0, 802860c <vTaskDelete+0x34>
  20474. {
  20475. taskRESET_READY_PRIORITY( pxTCB->uxPriority );
  20476. 80285f0: 6ae2 ldr r2, [r4, #44] ; 0x2c
  20477. 80285f2: 491f ldr r1, [pc, #124] ; (8028670 <vTaskDelete+0x98>)
  20478. 80285f4: 2314 movs r3, #20
  20479. 80285f6: 4353 muls r3, r2
  20480. 80285f8: 58cb ldr r3, [r1, r3]
  20481. 80285fa: b93b cbnz r3, 802860c <vTaskDelete+0x34>
  20482. 80285fc: 4b1d ldr r3, [pc, #116] ; (8028674 <vTaskDelete+0x9c>)
  20483. 80285fe: 2001 movs r0, #1
  20484. 8028600: 6819 ldr r1, [r3, #0]
  20485. 8028602: fa00 f202 lsl.w r2, r0, r2
  20486. 8028606: ea21 0202 bic.w r2, r1, r2
  20487. 802860a: 601a str r2, [r3, #0]
  20488. {
  20489. mtCOVERAGE_TEST_MARKER();
  20490. }
  20491. /* Is the task waiting on an event also? */
  20492. if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
  20493. 802860c: 6aa3 ldr r3, [r4, #40] ; 0x28
  20494. 802860e: b11b cbz r3, 8028618 <vTaskDelete+0x40>
  20495. {
  20496. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  20497. 8028610: f104 0018 add.w r0, r4, #24
  20498. 8028614: f7ff fbfa bl 8027e0c <uxListRemove>
  20499. else
  20500. {
  20501. mtCOVERAGE_TEST_MARKER();
  20502. }
  20503. vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xGenericListItem ) );
  20504. 8028618: 4817 ldr r0, [pc, #92] ; (8028678 <vTaskDelete+0xa0>)
  20505. 802861a: 4629 mov r1, r5
  20506. 802861c: f7ff fbd2 bl 8027dc4 <vListInsertEnd>
  20507. /* Increment the ucTasksDeleted variable so the idle task knows
  20508. there is a task that has been deleted and that it should therefore
  20509. check the xTasksWaitingTermination list. */
  20510. ++uxTasksDeleted;
  20511. 8028620: 4b16 ldr r3, [pc, #88] ; (802867c <vTaskDelete+0xa4>)
  20512. 8028622: 681a ldr r2, [r3, #0]
  20513. 8028624: 3201 adds r2, #1
  20514. 8028626: 601a str r2, [r3, #0]
  20515. /* Increment the uxTaskNumberVariable also so kernel aware debuggers
  20516. can detect that the task lists need re-generating. */
  20517. uxTaskNumber++;
  20518. 8028628: 4b15 ldr r3, [pc, #84] ; (8028680 <vTaskDelete+0xa8>)
  20519. 802862a: 681a ldr r2, [r3, #0]
  20520. 802862c: 3201 adds r2, #1
  20521. 802862e: 601a str r2, [r3, #0]
  20522. traceTASK_DELETE( pxTCB );
  20523. }
  20524. taskEXIT_CRITICAL();
  20525. 8028630: f000 fbac bl 8028d8c <vPortExitCritical>
  20526. /* Force a reschedule if it is the currently running task that has just
  20527. been deleted. */
  20528. if( xSchedulerRunning != pdFALSE )
  20529. 8028634: 4b13 ldr r3, [pc, #76] ; (8028684 <vTaskDelete+0xac>)
  20530. 8028636: 681b ldr r3, [r3, #0]
  20531. 8028638: 2b00 cmp r3, #0
  20532. 802863a: d015 beq.n 8028668 <vTaskDelete+0x90>
  20533. {
  20534. if( pxTCB == pxCurrentTCB )
  20535. 802863c: 4b0b ldr r3, [pc, #44] ; (802866c <vTaskDelete+0x94>)
  20536. 802863e: 681b ldr r3, [r3, #0]
  20537. 8028640: 429c cmp r4, r3
  20538. 8028642: d109 bne.n 8028658 <vTaskDelete+0x80>
  20539. {
  20540. configASSERT( uxSchedulerSuspended == 0 );
  20541. 8028644: 4b10 ldr r3, [pc, #64] ; (8028688 <vTaskDelete+0xb0>)
  20542. 8028646: 681b ldr r3, [r3, #0]
  20543. 8028648: b113 cbz r3, 8028650 <vTaskDelete+0x78>
  20544. 802864a: f000 fb6b bl 8028d24 <ulPortSetInterruptMask>
  20545. 802864e: e7fe b.n 802864e <vTaskDelete+0x76>
  20546. prvResetNextTaskUnblockTime();
  20547. }
  20548. taskEXIT_CRITICAL();
  20549. }
  20550. }
  20551. }
  20552. 8028650: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  20553. in which Windows specific clean up operations are performed,
  20554. after which it is not possible to yield away from this task -
  20555. hence xYieldPending is used to latch that a context switch is
  20556. required. */
  20557. portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending );
  20558. portYIELD_WITHIN_API();
  20559. 8028654: f000 bb5a b.w 8028d0c <vPortYield>
  20560. }
  20561. else
  20562. {
  20563. /* Reset the next expected unblock time in case it referred to
  20564. the task that has just been deleted. */
  20565. taskENTER_CRITICAL();
  20566. 8028658: f000 fb6c bl 8028d34 <vPortEnterCritical>
  20567. {
  20568. prvResetNextTaskUnblockTime();
  20569. 802865c: f7ff feaa bl 80283b4 <prvResetNextTaskUnblockTime>
  20570. }
  20571. taskEXIT_CRITICAL();
  20572. }
  20573. }
  20574. }
  20575. 8028660: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  20576. the task that has just been deleted. */
  20577. taskENTER_CRITICAL();
  20578. {
  20579. prvResetNextTaskUnblockTime();
  20580. }
  20581. taskEXIT_CRITICAL();
  20582. 8028664: f000 bb92 b.w 8028d8c <vPortExitCritical>
  20583. 8028668: bd38 pop {r3, r4, r5, pc}
  20584. 802866a: bf00 nop
  20585. 802866c: 2000298c .word 0x2000298c
  20586. 8028670: 20002914 .word 0x20002914
  20587. 8028674: 200029cc .word 0x200029cc
  20588. 8028678: 20002978 .word 0x20002978
  20589. 802867c: 200028e4 .word 0x200028e4
  20590. 8028680: 200029b0 .word 0x200029b0
  20591. 8028684: 200028e0 .word 0x200028e0
  20592. 8028688: 200029a4 .word 0x200029a4
  20593. 0802868c <vTaskStartScheduler>:
  20594. #endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */
  20595. /*-----------------------------------------------------------*/
  20596. void vTaskStartScheduler( void )
  20597. {
  20598. 802868c: b530 push {r4, r5, lr}
  20599. 802868e: b085 sub sp, #20
  20600. 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. */
  20601. }
  20602. #else
  20603. {
  20604. /* Create the idle task without storing its handle. */
  20605. 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. */
  20606. 8028690: 2400 movs r4, #0
  20607. 8028692: 2280 movs r2, #128 ; 0x80
  20608. 8028694: 9400 str r4, [sp, #0]
  20609. 8028696: 9401 str r4, [sp, #4]
  20610. 8028698: 9402 str r4, [sp, #8]
  20611. 802869a: 9403 str r4, [sp, #12]
  20612. 802869c: 480c ldr r0, [pc, #48] ; (80286d0 <vTaskStartScheduler+0x44>)
  20613. 802869e: 490d ldr r1, [pc, #52] ; (80286d4 <vTaskStartScheduler+0x48>)
  20614. 80286a0: 4623 mov r3, r4
  20615. 80286a2: f7ff fec1 bl 8028428 <xTaskGenericCreate>
  20616. mtCOVERAGE_TEST_MARKER();
  20617. }
  20618. }
  20619. #endif /* configUSE_TIMERS */
  20620. if( xReturn == pdPASS )
  20621. 80286a6: 2801 cmp r0, #1
  20622. 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. */
  20623. }
  20624. #else
  20625. {
  20626. /* Create the idle task without storing its handle. */
  20627. 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. */
  20628. 80286a8: 4605 mov r5, r0
  20629. mtCOVERAGE_TEST_MARKER();
  20630. }
  20631. }
  20632. #endif /* configUSE_TIMERS */
  20633. if( xReturn == pdPASS )
  20634. 80286aa: d10a bne.n 80286c2 <vTaskStartScheduler+0x36>
  20635. /* Interrupts are turned off here, to ensure a tick does not occur
  20636. before or during the call to xPortStartScheduler(). The stacks of
  20637. the created tasks contain a status word with interrupts switched on
  20638. so interrupts will automatically get re-enabled when the first task
  20639. starts to run. */
  20640. portDISABLE_INTERRUPTS();
  20641. 80286ac: f000 fb3a bl 8028d24 <ulPortSetInterruptMask>
  20642. structure specific to the task that will run first. */
  20643. _impure_ptr = &( pxCurrentTCB->xNewLib_reent );
  20644. }
  20645. #endif /* configUSE_NEWLIB_REENTRANT */
  20646. xSchedulerRunning = pdTRUE;
  20647. 80286b0: 4b09 ldr r3, [pc, #36] ; (80286d8 <vTaskStartScheduler+0x4c>)
  20648. 80286b2: 601d str r5, [r3, #0]
  20649. xTickCount = ( TickType_t ) 0U;
  20650. 80286b4: 4b09 ldr r3, [pc, #36] ; (80286dc <vTaskStartScheduler+0x50>)
  20651. 80286b6: 601c str r4, [r3, #0]
  20652. /* This line will only be reached if the kernel could not be started,
  20653. because there was not enough FreeRTOS heap to create the idle task
  20654. or the timer task. */
  20655. configASSERT( xReturn );
  20656. }
  20657. }
  20658. 80286b8: b005 add sp, #20
  20659. 80286ba: e8bd 4030 ldmia.w sp!, {r4, r5, lr}
  20660. the run time counter time base. */
  20661. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS();
  20662. /* Setting up the timer tick is hardware specific and thus in the
  20663. portable interface. */
  20664. if( xPortStartScheduler() != pdFALSE )
  20665. 80286be: f000 bbbd b.w 8028e3c <xPortStartScheduler>
  20666. else
  20667. {
  20668. /* This line will only be reached if the kernel could not be started,
  20669. because there was not enough FreeRTOS heap to create the idle task
  20670. or the timer task. */
  20671. configASSERT( xReturn );
  20672. 80286c2: b910 cbnz r0, 80286ca <vTaskStartScheduler+0x3e>
  20673. 80286c4: f000 fb2e bl 8028d24 <ulPortSetInterruptMask>
  20674. 80286c8: e7fe b.n 80286c8 <vTaskStartScheduler+0x3c>
  20675. }
  20676. }
  20677. 80286ca: b005 add sp, #20
  20678. 80286cc: bd30 pop {r4, r5, pc}
  20679. 80286ce: bf00 nop
  20680. 80286d0: 080288f1 .word 0x080288f1
  20681. 80286d4: 08033eed .word 0x08033eed
  20682. 80286d8: 200028e0 .word 0x200028e0
  20683. 80286dc: 200029a8 .word 0x200029a8
  20684. 080286e0 <vTaskSuspendAll>:
  20685. {
  20686. /* A critical section is not required as the variable is of type
  20687. BaseType_t. Please read Richard Barry's reply in the following link to a
  20688. post in the FreeRTOS support forum before reporting this as a bug! -
  20689. http://goo.gl/wu4acr */
  20690. ++uxSchedulerSuspended;
  20691. 80286e0: 4b02 ldr r3, [pc, #8] ; (80286ec <vTaskSuspendAll+0xc>)
  20692. 80286e2: 681a ldr r2, [r3, #0]
  20693. 80286e4: 3201 adds r2, #1
  20694. 80286e6: 601a str r2, [r3, #0]
  20695. 80286e8: 4770 bx lr
  20696. 80286ea: bf00 nop
  20697. 80286ec: 200029a4 .word 0x200029a4
  20698. 080286f0 <xTaskGetTickCount>:
  20699. TickType_t xTicks;
  20700. /* Critical section required if running on a 16 bit processor. */
  20701. portTICK_TYPE_ENTER_CRITICAL();
  20702. {
  20703. xTicks = xTickCount;
  20704. 80286f0: 4b01 ldr r3, [pc, #4] ; (80286f8 <xTaskGetTickCount+0x8>)
  20705. 80286f2: 6818 ldr r0, [r3, #0]
  20706. }
  20707. portTICK_TYPE_EXIT_CRITICAL();
  20708. return xTicks;
  20709. }
  20710. 80286f4: 4770 bx lr
  20711. 80286f6: bf00 nop
  20712. 80286f8: 200029a8 .word 0x200029a8
  20713. 080286fc <xTaskIncrementTick>:
  20714. /* Called by the portable layer each time a tick interrupt occurs.
  20715. Increments the tick then checks to see if the new tick value will cause any
  20716. tasks to be unblocked. */
  20717. traceTASK_INCREMENT_TICK( xTickCount );
  20718. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  20719. 80286fc: 4b3b ldr r3, [pc, #236] ; (80287ec <xTaskIncrementTick+0xf0>)
  20720. 80286fe: 681b ldr r3, [r3, #0]
  20721. #endif /* configUSE_TICKLESS_IDLE */
  20722. /*----------------------------------------------------------*/
  20723. BaseType_t xTaskIncrementTick( void )
  20724. {
  20725. 8028700: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  20726. /* Called by the portable layer each time a tick interrupt occurs.
  20727. Increments the tick then checks to see if the new tick value will cause any
  20728. tasks to be unblocked. */
  20729. traceTASK_INCREMENT_TICK( xTickCount );
  20730. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  20731. 8028704: 2b00 cmp r3, #0
  20732. 8028706: d15b bne.n 80287c0 <xTaskIncrementTick+0xc4>
  20733. {
  20734. /* Increment the RTOS tick, switching the delayed and overflowed
  20735. delayed lists if it wraps to 0. */
  20736. ++xTickCount;
  20737. 8028708: 4b39 ldr r3, [pc, #228] ; (80287f0 <xTaskIncrementTick+0xf4>)
  20738. 802870a: 681a ldr r2, [r3, #0]
  20739. 802870c: 3201 adds r2, #1
  20740. 802870e: 601a str r2, [r3, #0]
  20741. {
  20742. /* Minor optimisation. The tick count cannot change in this
  20743. block. */
  20744. const TickType_t xConstTickCount = xTickCount;
  20745. 8028710: 681e ldr r6, [r3, #0]
  20746. if( xConstTickCount == ( TickType_t ) 0U )
  20747. 8028712: b98e cbnz r6, 8028738 <xTaskIncrementTick+0x3c>
  20748. {
  20749. taskSWITCH_DELAYED_LISTS();
  20750. 8028714: 4b37 ldr r3, [pc, #220] ; (80287f4 <xTaskIncrementTick+0xf8>)
  20751. 8028716: 681a ldr r2, [r3, #0]
  20752. 8028718: 6812 ldr r2, [r2, #0]
  20753. 802871a: b112 cbz r2, 8028722 <xTaskIncrementTick+0x26>
  20754. 802871c: f000 fb02 bl 8028d24 <ulPortSetInterruptMask>
  20755. 8028720: e7fe b.n 8028720 <xTaskIncrementTick+0x24>
  20756. 8028722: 4a35 ldr r2, [pc, #212] ; (80287f8 <xTaskIncrementTick+0xfc>)
  20757. 8028724: 6819 ldr r1, [r3, #0]
  20758. 8028726: 6810 ldr r0, [r2, #0]
  20759. 8028728: 6018 str r0, [r3, #0]
  20760. 802872a: 4b34 ldr r3, [pc, #208] ; (80287fc <xTaskIncrementTick+0x100>)
  20761. 802872c: 6011 str r1, [r2, #0]
  20762. 802872e: 681a ldr r2, [r3, #0]
  20763. 8028730: 3201 adds r2, #1
  20764. 8028732: 601a str r2, [r3, #0]
  20765. 8028734: f7ff fe3e bl 80283b4 <prvResetNextTaskUnblockTime>
  20766. /* See if this tick has made a timeout expire. Tasks are stored in
  20767. the queue in the order of their wake time - meaning once one task
  20768. has been found whose block time has not expired there is no need to
  20769. look any further down the list. */
  20770. if( xConstTickCount >= xNextTaskUnblockTime )
  20771. 8028738: 4b31 ldr r3, [pc, #196] ; (8028800 <xTaskIncrementTick+0x104>)
  20772. 802873a: 681b ldr r3, [r3, #0]
  20773. 802873c: 2400 movs r4, #0
  20774. 802873e: 429e cmp r6, r3
  20775. 8028740: d200 bcs.n 8028744 <xTaskIncrementTick+0x48>
  20776. 8028742: e032 b.n 80287aa <xTaskIncrementTick+0xae>
  20777. {
  20778. for( ;; )
  20779. {
  20780. if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )
  20781. 8028744: 4f2b ldr r7, [pc, #172] ; (80287f4 <xTaskIncrementTick+0xf8>)
  20782. mtCOVERAGE_TEST_MARKER();
  20783. }
  20784. /* Place the unblocked task into the appropriate ready
  20785. list. */
  20786. prvAddTaskToReadyList( pxTCB );
  20787. 8028746: f8df 80cc ldr.w r8, [pc, #204] ; 8028814 <xTaskIncrementTick+0x118>
  20788. 802874a: f8df a0bc ldr.w sl, [pc, #188] ; 8028808 <xTaskIncrementTick+0x10c>
  20789. look any further down the list. */
  20790. if( xConstTickCount >= xNextTaskUnblockTime )
  20791. {
  20792. for( ;; )
  20793. {
  20794. if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )
  20795. 802874e: 683b ldr r3, [r7, #0]
  20796. 8028750: 681b ldr r3, [r3, #0]
  20797. 8028752: 2b00 cmp r3, #0
  20798. 8028754: d13a bne.n 80287cc <xTaskIncrementTick+0xd0>
  20799. /* The delayed list is empty. Set xNextTaskUnblockTime
  20800. to the maximum possible value so it is extremely
  20801. unlikely that the
  20802. if( xTickCount >= xNextTaskUnblockTime ) test will pass
  20803. next time through. */
  20804. xNextTaskUnblockTime = portMAX_DELAY;
  20805. 8028756: 4b2a ldr r3, [pc, #168] ; (8028800 <xTaskIncrementTick+0x104>)
  20806. 8028758: f04f 32ff mov.w r2, #4294967295
  20807. 802875c: 601a str r2, [r3, #0]
  20808. break;
  20809. 802875e: e024 b.n 80287aa <xTaskIncrementTick+0xae>
  20810. /* It is not time to unblock this item yet, but the
  20811. item value is the time at which the task at the head
  20812. of the blocked list must be removed from the Blocked
  20813. state - so record the item value in
  20814. xNextTaskUnblockTime. */
  20815. xNextTaskUnblockTime = xItemValue;
  20816. 8028760: 4a27 ldr r2, [pc, #156] ; (8028800 <xTaskIncrementTick+0x104>)
  20817. 8028762: 6013 str r3, [r2, #0]
  20818. break;
  20819. 8028764: e021 b.n 80287aa <xTaskIncrementTick+0xae>
  20820. {
  20821. mtCOVERAGE_TEST_MARKER();
  20822. }
  20823. /* It is time to remove the item from the Blocked state. */
  20824. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  20825. 8028766: f105 0904 add.w r9, r5, #4
  20826. 802876a: 4648 mov r0, r9
  20827. 802876c: f7ff fb4e bl 8027e0c <uxListRemove>
  20828. /* Is the task waiting on an event also? If so remove
  20829. it from the event list. */
  20830. if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
  20831. 8028770: 6aab ldr r3, [r5, #40] ; 0x28
  20832. 8028772: b11b cbz r3, 802877c <xTaskIncrementTick+0x80>
  20833. {
  20834. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  20835. 8028774: f105 0018 add.w r0, r5, #24
  20836. 8028778: f7ff fb48 bl 8027e0c <uxListRemove>
  20837. mtCOVERAGE_TEST_MARKER();
  20838. }
  20839. /* Place the unblocked task into the appropriate ready
  20840. list. */
  20841. prvAddTaskToReadyList( pxTCB );
  20842. 802877c: 6aeb ldr r3, [r5, #44] ; 0x2c
  20843. 802877e: f8d8 1000 ldr.w r1, [r8]
  20844. 8028782: 2201 movs r2, #1
  20845. 8028784: fa02 f203 lsl.w r2, r2, r3
  20846. 8028788: 2014 movs r0, #20
  20847. 802878a: 430a orrs r2, r1
  20848. 802878c: fb00 a003 mla r0, r0, r3, sl
  20849. 8028790: 4649 mov r1, r9
  20850. 8028792: f8c8 2000 str.w r2, [r8]
  20851. 8028796: f7ff fb15 bl 8027dc4 <vListInsertEnd>
  20852. {
  20853. /* Preemption is on, but a context switch should
  20854. only be performed if the unblocked task has a
  20855. priority that is equal to or higher than the
  20856. currently executing task. */
  20857. if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
  20858. 802879a: 4b1a ldr r3, [pc, #104] ; (8028804 <xTaskIncrementTick+0x108>)
  20859. 802879c: 6aea ldr r2, [r5, #44] ; 0x2c
  20860. 802879e: 681b ldr r3, [r3, #0]
  20861. 80287a0: 6adb ldr r3, [r3, #44] ; 0x2c
  20862. {
  20863. xSwitchRequired = pdTRUE;
  20864. 80287a2: 429a cmp r2, r3
  20865. 80287a4: bf28 it cs
  20866. 80287a6: 2401 movcs r4, #1
  20867. 80287a8: e7d1 b.n 802874e <xTaskIncrementTick+0x52>
  20868. /* Tasks of equal priority to the currently running task will share
  20869. processing time (time slice) if preemption is on, and the application
  20870. writer has not explicitly turned time slicing off. */
  20871. #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) )
  20872. {
  20873. if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 )
  20874. 80287aa: 4b16 ldr r3, [pc, #88] ; (8028804 <xTaskIncrementTick+0x108>)
  20875. 80287ac: 681b ldr r3, [r3, #0]
  20876. 80287ae: 6adb ldr r3, [r3, #44] ; 0x2c
  20877. 80287b0: 2214 movs r2, #20
  20878. 80287b2: 4353 muls r3, r2
  20879. 80287b4: 4a14 ldr r2, [pc, #80] ; (8028808 <xTaskIncrementTick+0x10c>)
  20880. 80287b6: 58d3 ldr r3, [r2, r3]
  20881. {
  20882. xSwitchRequired = pdTRUE;
  20883. 80287b8: 2b01 cmp r3, #1
  20884. 80287ba: bf88 it hi
  20885. 80287bc: 2401 movhi r4, #1
  20886. 80287be: e00c b.n 80287da <xTaskIncrementTick+0xde>
  20887. }
  20888. #endif /* configUSE_TICK_HOOK */
  20889. }
  20890. else
  20891. {
  20892. ++uxPendedTicks;
  20893. 80287c0: 4b12 ldr r3, [pc, #72] ; (802880c <xTaskIncrementTick+0x110>)
  20894. 80287c2: 681a ldr r2, [r3, #0]
  20895. 80287c4: 3201 adds r2, #1
  20896. 80287c6: 601a str r2, [r3, #0]
  20897. BaseType_t xTaskIncrementTick( void )
  20898. {
  20899. TCB_t * pxTCB;
  20900. TickType_t xItemValue;
  20901. BaseType_t xSwitchRequired = pdFALSE;
  20902. 80287c8: 2400 movs r4, #0
  20903. 80287ca: e006 b.n 80287da <xTaskIncrementTick+0xde>
  20904. {
  20905. /* The delayed list is not empty, get the value of the
  20906. item at the head of the delayed list. This is the time
  20907. at which the task at the head of the delayed list must
  20908. be removed from the Blocked state. */
  20909. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );
  20910. 80287cc: 683b ldr r3, [r7, #0]
  20911. 80287ce: 68db ldr r3, [r3, #12]
  20912. 80287d0: 68dd ldr r5, [r3, #12]
  20913. xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) );
  20914. 80287d2: 686b ldr r3, [r5, #4]
  20915. if( xConstTickCount < xItemValue )
  20916. 80287d4: 429e cmp r6, r3
  20917. 80287d6: d2c6 bcs.n 8028766 <xTaskIncrementTick+0x6a>
  20918. 80287d8: e7c2 b.n 8028760 <xTaskIncrementTick+0x64>
  20919. #endif
  20920. }
  20921. #if ( configUSE_PREEMPTION == 1 )
  20922. {
  20923. if( xYieldPending != pdFALSE )
  20924. 80287da: 4b0d ldr r3, [pc, #52] ; (8028810 <xTaskIncrementTick+0x114>)
  20925. 80287dc: 681b ldr r3, [r3, #0]
  20926. {
  20927. xSwitchRequired = pdTRUE;
  20928. 80287de: 2b00 cmp r3, #0
  20929. 80287e0: bf18 it ne
  20930. 80287e2: 2401 movne r4, #1
  20931. }
  20932. }
  20933. #endif /* configUSE_PREEMPTION */
  20934. return xSwitchRequired;
  20935. }
  20936. 80287e4: 4620 mov r0, r4
  20937. 80287e6: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  20938. 80287ea: bf00 nop
  20939. 80287ec: 200029a4 .word 0x200029a4
  20940. 80287f0: 200029a8 .word 0x200029a8
  20941. 80287f4: 200028dc .word 0x200028dc
  20942. 80287f8: 200029ac .word 0x200029ac
  20943. 80287fc: 200028d8 .word 0x200028d8
  20944. 8028800: 200015d4 .word 0x200015d4
  20945. 8028804: 2000298c .word 0x2000298c
  20946. 8028808: 20002914 .word 0x20002914
  20947. 802880c: 20002910 .word 0x20002910
  20948. 8028810: 200029d0 .word 0x200029d0
  20949. 8028814: 200029cc .word 0x200029cc
  20950. 08028818 <xTaskResumeAll>:
  20951. #endif /* configUSE_TICKLESS_IDLE */
  20952. /*----------------------------------------------------------*/
  20953. BaseType_t xTaskResumeAll( void )
  20954. {
  20955. 8028818: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  20956. TCB_t *pxTCB;
  20957. BaseType_t xAlreadyYielded = pdFALSE;
  20958. /* If uxSchedulerSuspended is zero then this function does not match a
  20959. previous call to vTaskSuspendAll(). */
  20960. configASSERT( uxSchedulerSuspended );
  20961. 802881c: 4c2c ldr r4, [pc, #176] ; (80288d0 <xTaskResumeAll+0xb8>)
  20962. 802881e: 6823 ldr r3, [r4, #0]
  20963. 8028820: b913 cbnz r3, 8028828 <xTaskResumeAll+0x10>
  20964. 8028822: f000 fa7f bl 8028d24 <ulPortSetInterruptMask>
  20965. 8028826: e7fe b.n 8028826 <xTaskResumeAll+0xe>
  20966. /* It is possible that an ISR caused a task to be removed from an event
  20967. list while the scheduler was suspended. If this was the case then the
  20968. removed task will have been added to the xPendingReadyList. Once the
  20969. scheduler has been resumed it is safe to move all the pending ready
  20970. tasks from this list into their appropriate ready list. */
  20971. taskENTER_CRITICAL();
  20972. 8028828: f000 fa84 bl 8028d34 <vPortEnterCritical>
  20973. {
  20974. --uxSchedulerSuspended;
  20975. 802882c: 6823 ldr r3, [r4, #0]
  20976. 802882e: 3b01 subs r3, #1
  20977. 8028830: 6023 str r3, [r4, #0]
  20978. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  20979. 8028832: 6823 ldr r3, [r4, #0]
  20980. 8028834: b10b cbz r3, 802883a <xTaskResumeAll+0x22>
  20981. /*----------------------------------------------------------*/
  20982. BaseType_t xTaskResumeAll( void )
  20983. {
  20984. TCB_t *pxTCB;
  20985. BaseType_t xAlreadyYielded = pdFALSE;
  20986. 8028836: 2400 movs r4, #0
  20987. 8028838: e044 b.n 80288c4 <xTaskResumeAll+0xac>
  20988. {
  20989. --uxSchedulerSuspended;
  20990. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  20991. {
  20992. if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U )
  20993. 802883a: 4b26 ldr r3, [pc, #152] ; (80288d4 <xTaskResumeAll+0xbc>)
  20994. 802883c: 681b ldr r3, [r3, #0]
  20995. 802883e: bb0b cbnz r3, 8028884 <xTaskResumeAll+0x6c>
  20996. 8028840: e7f9 b.n 8028836 <xTaskResumeAll+0x1e>
  20997. {
  20998. /* Move any readied tasks from the pending list into the
  20999. appropriate ready list. */
  21000. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  21001. {
  21002. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );
  21003. 8028842: 68f3 ldr r3, [r6, #12]
  21004. 8028844: 68dc ldr r4, [r3, #12]
  21005. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  21006. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  21007. 8028846: f104 0804 add.w r8, r4, #4
  21008. /* Move any readied tasks from the pending list into the
  21009. appropriate ready list. */
  21010. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  21011. {
  21012. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );
  21013. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  21014. 802884a: f104 0018 add.w r0, r4, #24
  21015. 802884e: f7ff fadd bl 8027e0c <uxListRemove>
  21016. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  21017. 8028852: 4640 mov r0, r8
  21018. 8028854: f7ff fada bl 8027e0c <uxListRemove>
  21019. prvAddTaskToReadyList( pxTCB );
  21020. 8028858: 6ae3 ldr r3, [r4, #44] ; 0x2c
  21021. 802885a: 682a ldr r2, [r5, #0]
  21022. 802885c: 2701 movs r7, #1
  21023. 802885e: fa07 f103 lsl.w r1, r7, r3
  21024. 8028862: 2014 movs r0, #20
  21025. 8028864: 430a orrs r2, r1
  21026. 8028866: fb00 9003 mla r0, r0, r3, r9
  21027. 802886a: 4641 mov r1, r8
  21028. 802886c: 602a str r2, [r5, #0]
  21029. 802886e: f7ff faa9 bl 8027dc4 <vListInsertEnd>
  21030. /* If the moved task has a priority higher than the current
  21031. task then a yield must be performed. */
  21032. if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
  21033. 8028872: 4b19 ldr r3, [pc, #100] ; (80288d8 <xTaskResumeAll+0xc0>)
  21034. 8028874: 6ae2 ldr r2, [r4, #44] ; 0x2c
  21035. 8028876: 681b ldr r3, [r3, #0]
  21036. 8028878: 6adb ldr r3, [r3, #44] ; 0x2c
  21037. 802887a: 429a cmp r2, r3
  21038. 802887c: d306 bcc.n 802888c <xTaskResumeAll+0x74>
  21039. {
  21040. xYieldPending = pdTRUE;
  21041. 802887e: 4b17 ldr r3, [pc, #92] ; (80288dc <xTaskResumeAll+0xc4>)
  21042. 8028880: 601f str r7, [r3, #0]
  21043. 8028882: e003 b.n 802888c <xTaskResumeAll+0x74>
  21044. {
  21045. if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U )
  21046. {
  21047. /* Move any readied tasks from the pending list into the
  21048. appropriate ready list. */
  21049. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  21050. 8028884: 4e16 ldr r6, [pc, #88] ; (80288e0 <xTaskResumeAll+0xc8>)
  21051. {
  21052. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );
  21053. ( void ) uxListRemove( &( pxTCB->xEventListItem ) );
  21054. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  21055. prvAddTaskToReadyList( pxTCB );
  21056. 8028886: 4d17 ldr r5, [pc, #92] ; (80288e4 <xTaskResumeAll+0xcc>)
  21057. 8028888: f8df 9060 ldr.w r9, [pc, #96] ; 80288ec <xTaskResumeAll+0xd4>
  21058. {
  21059. if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U )
  21060. {
  21061. /* Move any readied tasks from the pending list into the
  21062. appropriate ready list. */
  21063. while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
  21064. 802888c: 6833 ldr r3, [r6, #0]
  21065. 802888e: 2b00 cmp r3, #0
  21066. 8028890: d1d7 bne.n 8028842 <xTaskResumeAll+0x2a>
  21067. /* If any ticks occurred while the scheduler was suspended then
  21068. they should be processed now. This ensures the tick count does
  21069. not slip, and that any delayed tasks are resumed at the correct
  21070. time. */
  21071. if( uxPendedTicks > ( UBaseType_t ) 0U )
  21072. 8028892: 4c15 ldr r4, [pc, #84] ; (80288e8 <xTaskResumeAll+0xd0>)
  21073. 8028894: 6823 ldr r3, [r4, #0]
  21074. 8028896: b96b cbnz r3, 80288b4 <xTaskResumeAll+0x9c>
  21075. else
  21076. {
  21077. mtCOVERAGE_TEST_MARKER();
  21078. }
  21079. if( xYieldPending == pdTRUE )
  21080. 8028898: 4b10 ldr r3, [pc, #64] ; (80288dc <xTaskResumeAll+0xc4>)
  21081. 802889a: 681c ldr r4, [r3, #0]
  21082. 802889c: 2c01 cmp r4, #1
  21083. 802889e: d1ca bne.n 8028836 <xTaskResumeAll+0x1e>
  21084. 80288a0: e00e b.n 80288c0 <xTaskResumeAll+0xa8>
  21085. time. */
  21086. if( uxPendedTicks > ( UBaseType_t ) 0U )
  21087. {
  21088. while( uxPendedTicks > ( UBaseType_t ) 0U )
  21089. {
  21090. if( xTaskIncrementTick() != pdFALSE )
  21091. 80288a2: f7ff ff2b bl 80286fc <xTaskIncrementTick>
  21092. 80288a6: b108 cbz r0, 80288ac <xTaskResumeAll+0x94>
  21093. {
  21094. xYieldPending = pdTRUE;
  21095. 80288a8: 2301 movs r3, #1
  21096. 80288aa: 6033 str r3, [r6, #0]
  21097. }
  21098. else
  21099. {
  21100. mtCOVERAGE_TEST_MARKER();
  21101. }
  21102. --uxPendedTicks;
  21103. 80288ac: 682b ldr r3, [r5, #0]
  21104. 80288ae: 3b01 subs r3, #1
  21105. 80288b0: 602b str r3, [r5, #0]
  21106. 80288b2: e001 b.n 80288b8 <xTaskResumeAll+0xa0>
  21107. {
  21108. while( uxPendedTicks > ( UBaseType_t ) 0U )
  21109. {
  21110. if( xTaskIncrementTick() != pdFALSE )
  21111. {
  21112. xYieldPending = pdTRUE;
  21113. 80288b4: 4e09 ldr r6, [pc, #36] ; (80288dc <xTaskResumeAll+0xc4>)
  21114. 80288b6: 4625 mov r5, r4
  21115. they should be processed now. This ensures the tick count does
  21116. not slip, and that any delayed tasks are resumed at the correct
  21117. time. */
  21118. if( uxPendedTicks > ( UBaseType_t ) 0U )
  21119. {
  21120. while( uxPendedTicks > ( UBaseType_t ) 0U )
  21121. 80288b8: 6823 ldr r3, [r4, #0]
  21122. 80288ba: 2b00 cmp r3, #0
  21123. 80288bc: d1f1 bne.n 80288a2 <xTaskResumeAll+0x8a>
  21124. 80288be: e7eb b.n 8028898 <xTaskResumeAll+0x80>
  21125. #if( configUSE_PREEMPTION != 0 )
  21126. {
  21127. xAlreadyYielded = pdTRUE;
  21128. }
  21129. #endif
  21130. taskYIELD_IF_USING_PREEMPTION();
  21131. 80288c0: f000 fa24 bl 8028d0c <vPortYield>
  21132. else
  21133. {
  21134. mtCOVERAGE_TEST_MARKER();
  21135. }
  21136. }
  21137. taskEXIT_CRITICAL();
  21138. 80288c4: f000 fa62 bl 8028d8c <vPortExitCritical>
  21139. return xAlreadyYielded;
  21140. }
  21141. 80288c8: 4620 mov r0, r4
  21142. 80288ca: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  21143. 80288ce: bf00 nop
  21144. 80288d0: 200029a4 .word 0x200029a4
  21145. 80288d4: 200029b4 .word 0x200029b4
  21146. 80288d8: 2000298c .word 0x2000298c
  21147. 80288dc: 200029d0 .word 0x200029d0
  21148. 80288e0: 20002990 .word 0x20002990
  21149. 80288e4: 200029cc .word 0x200029cc
  21150. 80288e8: 20002910 .word 0x20002910
  21151. 80288ec: 20002914 .word 0x20002914
  21152. 080288f0 <prvIdleTask>:
  21153. *
  21154. * void prvIdleTask( void *pvParameters );
  21155. *
  21156. */
  21157. static portTASK_FUNCTION( prvIdleTask, pvParameters )
  21158. {
  21159. 80288f0: b5f8 push {r3, r4, r5, r6, r7, lr}
  21160. {
  21161. BaseType_t xListIsEmpty;
  21162. /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called
  21163. too often in the idle task. */
  21164. while( uxTasksDeleted > ( UBaseType_t ) 0U )
  21165. 80288f2: 4c14 ldr r4, [pc, #80] ; (8028944 <prvIdleTask+0x54>)
  21166. {
  21167. vTaskSuspendAll();
  21168. {
  21169. xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination );
  21170. 80288f4: 4e14 ldr r6, [pc, #80] ; (8028948 <prvIdleTask+0x58>)
  21171. taskENTER_CRITICAL();
  21172. {
  21173. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );
  21174. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  21175. --uxCurrentNumberOfTasks;
  21176. 80288f6: 4f15 ldr r7, [pc, #84] ; (802894c <prvIdleTask+0x5c>)
  21177. {
  21178. BaseType_t xListIsEmpty;
  21179. /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called
  21180. too often in the idle task. */
  21181. while( uxTasksDeleted > ( UBaseType_t ) 0U )
  21182. 80288f8: 6823 ldr r3, [r4, #0]
  21183. 80288fa: b1e3 cbz r3, 8028936 <prvIdleTask+0x46>
  21184. {
  21185. vTaskSuspendAll();
  21186. 80288fc: f7ff fef0 bl 80286e0 <vTaskSuspendAll>
  21187. {
  21188. xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination );
  21189. 8028900: 6835 ldr r5, [r6, #0]
  21190. }
  21191. ( void ) xTaskResumeAll();
  21192. 8028902: f7ff ff89 bl 8028818 <xTaskResumeAll>
  21193. if( xListIsEmpty == pdFALSE )
  21194. 8028906: 2d00 cmp r5, #0
  21195. 8028908: d0f6 beq.n 80288f8 <prvIdleTask+0x8>
  21196. {
  21197. TCB_t *pxTCB;
  21198. taskENTER_CRITICAL();
  21199. 802890a: f000 fa13 bl 8028d34 <vPortEnterCritical>
  21200. {
  21201. pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );
  21202. 802890e: 68f3 ldr r3, [r6, #12]
  21203. 8028910: 68dd ldr r5, [r3, #12]
  21204. ( void ) uxListRemove( &( pxTCB->xGenericListItem ) );
  21205. 8028912: 1d28 adds r0, r5, #4
  21206. 8028914: f7ff fa7a bl 8027e0c <uxListRemove>
  21207. --uxCurrentNumberOfTasks;
  21208. 8028918: 683b ldr r3, [r7, #0]
  21209. 802891a: 3b01 subs r3, #1
  21210. 802891c: 603b str r3, [r7, #0]
  21211. --uxTasksDeleted;
  21212. 802891e: 6823 ldr r3, [r4, #0]
  21213. 8028920: 3b01 subs r3, #1
  21214. 8028922: 6023 str r3, [r4, #0]
  21215. }
  21216. taskEXIT_CRITICAL();
  21217. 8028924: f000 fa32 bl 8028d8c <vPortExitCritical>
  21218. vPortFreeAligned( pxTCB->pxStack );
  21219. }
  21220. }
  21221. #else
  21222. {
  21223. vPortFreeAligned( pxTCB->pxStack );
  21224. 8028928: 6b28 ldr r0, [r5, #48] ; 0x30
  21225. 802892a: f000 fb97 bl 802905c <vPortFree>
  21226. }
  21227. #endif
  21228. vPortFree( pxTCB );
  21229. 802892e: 4628 mov r0, r5
  21230. 8028930: f000 fb94 bl 802905c <vPortFree>
  21231. 8028934: e7e0 b.n 80288f8 <prvIdleTask+0x8>
  21232. A critical region is not required here as we are just reading from
  21233. the list, and an occasional incorrect value will not matter. If
  21234. the ready list at the idle priority contains more than one task
  21235. then a task other than the idle task is ready to execute. */
  21236. if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 )
  21237. 8028936: 4b06 ldr r3, [pc, #24] ; (8028950 <prvIdleTask+0x60>)
  21238. 8028938: 681b ldr r3, [r3, #0]
  21239. 802893a: 2b01 cmp r3, #1
  21240. 802893c: d9dc bls.n 80288f8 <prvIdleTask+0x8>
  21241. {
  21242. taskYIELD();
  21243. 802893e: f000 f9e5 bl 8028d0c <vPortYield>
  21244. 8028942: e7d9 b.n 80288f8 <prvIdleTask+0x8>
  21245. 8028944: 200028e4 .word 0x200028e4
  21246. 8028948: 20002978 .word 0x20002978
  21247. 802894c: 200029b4 .word 0x200029b4
  21248. 8028950: 20002914 .word 0x20002914
  21249. 08028954 <vTaskDelay>:
  21250. /*-----------------------------------------------------------*/
  21251. #if ( INCLUDE_vTaskDelay == 1 )
  21252. void vTaskDelay( const TickType_t xTicksToDelay )
  21253. {
  21254. 8028954: b538 push {r3, r4, r5, lr}
  21255. TickType_t xTimeToWake;
  21256. BaseType_t xAlreadyYielded = pdFALSE;
  21257. /* A delay time of zero just forces a reschedule. */
  21258. if( xTicksToDelay > ( TickType_t ) 0U )
  21259. 8028956: 4604 mov r4, r0
  21260. 8028958: b918 cbnz r0, 8028962 <vTaskDelay+0xe>
  21261. }
  21262. else
  21263. {
  21264. mtCOVERAGE_TEST_MARKER();
  21265. }
  21266. }
  21267. 802895a: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  21268. /* Force a reschedule if xTaskResumeAll has not already done so, we may
  21269. have put ourselves to sleep. */
  21270. if( xAlreadyYielded == pdFALSE )
  21271. {
  21272. portYIELD_WITHIN_API();
  21273. 802895e: f000 b9d5 b.w 8028d0c <vPortYield>
  21274. /* A delay time of zero just forces a reschedule. */
  21275. if( xTicksToDelay > ( TickType_t ) 0U )
  21276. {
  21277. configASSERT( uxSchedulerSuspended == 0 );
  21278. 8028962: 4b11 ldr r3, [pc, #68] ; (80289a8 <vTaskDelay+0x54>)
  21279. 8028964: 681b ldr r3, [r3, #0]
  21280. 8028966: b113 cbz r3, 802896e <vTaskDelay+0x1a>
  21281. 8028968: f000 f9dc bl 8028d24 <ulPortSetInterruptMask>
  21282. 802896c: e7fe b.n 802896c <vTaskDelay+0x18>
  21283. vTaskSuspendAll();
  21284. 802896e: f7ff feb7 bl 80286e0 <vTaskSuspendAll>
  21285. This task cannot be in an event list as it is the currently
  21286. executing task. */
  21287. /* Calculate the time to wake - this may overflow but this is
  21288. not a problem. */
  21289. xTimeToWake = xTickCount + xTicksToDelay;
  21290. 8028972: 4b0e ldr r3, [pc, #56] ; (80289ac <vTaskDelay+0x58>)
  21291. 8028974: 681d ldr r5, [r3, #0]
  21292. 8028976: 1965 adds r5, r4, r5
  21293. /* We must remove ourselves from the ready list before adding
  21294. ourselves to the blocked list as the same list item is used for
  21295. both lists. */
  21296. if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  21297. 8028978: 4c0d ldr r4, [pc, #52] ; (80289b0 <vTaskDelay+0x5c>)
  21298. 802897a: 6820 ldr r0, [r4, #0]
  21299. 802897c: 3004 adds r0, #4
  21300. 802897e: f7ff fa45 bl 8027e0c <uxListRemove>
  21301. 8028982: b948 cbnz r0, 8028998 <vTaskDelay+0x44>
  21302. {
  21303. /* The current task must be in a ready list, so there is
  21304. no need to check, and the port reset macro can be called
  21305. directly. */
  21306. portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority );
  21307. 8028984: 4b0b ldr r3, [pc, #44] ; (80289b4 <vTaskDelay+0x60>)
  21308. 8028986: 6819 ldr r1, [r3, #0]
  21309. 8028988: 6822 ldr r2, [r4, #0]
  21310. 802898a: 6ad2 ldr r2, [r2, #44] ; 0x2c
  21311. 802898c: 2001 movs r0, #1
  21312. 802898e: fa00 f202 lsl.w r2, r0, r2
  21313. 8028992: ea21 0202 bic.w r2, r1, r2
  21314. 8028996: 601a str r2, [r3, #0]
  21315. }
  21316. else
  21317. {
  21318. mtCOVERAGE_TEST_MARKER();
  21319. }
  21320. prvAddCurrentTaskToDelayedList( xTimeToWake );
  21321. 8028998: 4628 mov r0, r5
  21322. 802899a: f7ff fd1d bl 80283d8 <prvAddCurrentTaskToDelayedList>
  21323. }
  21324. xAlreadyYielded = xTaskResumeAll();
  21325. 802899e: f7ff ff3b bl 8028818 <xTaskResumeAll>
  21326. mtCOVERAGE_TEST_MARKER();
  21327. }
  21328. /* Force a reschedule if xTaskResumeAll has not already done so, we may
  21329. have put ourselves to sleep. */
  21330. if( xAlreadyYielded == pdFALSE )
  21331. 80289a2: 2800 cmp r0, #0
  21332. 80289a4: d0d9 beq.n 802895a <vTaskDelay+0x6>
  21333. }
  21334. else
  21335. {
  21336. mtCOVERAGE_TEST_MARKER();
  21337. }
  21338. }
  21339. 80289a6: bd38 pop {r3, r4, r5, pc}
  21340. 80289a8: 200029a4 .word 0x200029a4
  21341. 80289ac: 200029a8 .word 0x200029a8
  21342. 80289b0: 2000298c .word 0x2000298c
  21343. 80289b4: 200029cc .word 0x200029cc
  21344. 080289b8 <vTaskSwitchContext>:
  21345. #endif /* configUSE_APPLICATION_TASK_TAG */
  21346. /*-----------------------------------------------------------*/
  21347. void vTaskSwitchContext( void )
  21348. {
  21349. 80289b8: b508 push {r3, lr}
  21350. if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE )
  21351. 80289ba: 4b12 ldr r3, [pc, #72] ; (8028a04 <vTaskSwitchContext+0x4c>)
  21352. 80289bc: 681a ldr r2, [r3, #0]
  21353. 80289be: 4b12 ldr r3, [pc, #72] ; (8028a08 <vTaskSwitchContext+0x50>)
  21354. 80289c0: b10a cbz r2, 80289c6 <vTaskSwitchContext+0xe>
  21355. {
  21356. /* The scheduler is currently suspended - do not allow a context
  21357. switch. */
  21358. xYieldPending = pdTRUE;
  21359. 80289c2: 2201 movs r2, #1
  21360. 80289c4: e01c b.n 8028a00 <vTaskSwitchContext+0x48>
  21361. }
  21362. else
  21363. {
  21364. xYieldPending = pdFALSE;
  21365. 80289c6: 601a str r2, [r3, #0]
  21366. taskFIRST_CHECK_FOR_STACK_OVERFLOW();
  21367. taskSECOND_CHECK_FOR_STACK_OVERFLOW();
  21368. /* Select a new task to run using either the generic C or port
  21369. optimised asm code. */
  21370. taskSELECT_HIGHEST_PRIORITY_TASK();
  21371. 80289c8: 4b10 ldr r3, [pc, #64] ; (8028a0c <vTaskSwitchContext+0x54>)
  21372. 80289ca: 681a ldr r2, [r3, #0]
  21373. /* Generic helper function. */
  21374. __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap )
  21375. {
  21376. uint8_t ucReturn;
  21377. __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) );
  21378. 80289cc: fab2 f282 clz r2, r2
  21379. 80289d0: b2d2 uxtb r2, r2
  21380. 80289d2: 2314 movs r3, #20
  21381. 80289d4: f1c2 021f rsb r2, r2, #31
  21382. 80289d8: 490d ldr r1, [pc, #52] ; (8028a10 <vTaskSwitchContext+0x58>)
  21383. 80289da: 435a muls r2, r3
  21384. 80289dc: 188b adds r3, r1, r2
  21385. 80289de: 588a ldr r2, [r1, r2]
  21386. 80289e0: b912 cbnz r2, 80289e8 <vTaskSwitchContext+0x30>
  21387. 80289e2: f000 f99f bl 8028d24 <ulPortSetInterruptMask>
  21388. 80289e6: e7fe b.n 80289e6 <vTaskSwitchContext+0x2e>
  21389. 80289e8: 685a ldr r2, [r3, #4]
  21390. 80289ea: 6852 ldr r2, [r2, #4]
  21391. 80289ec: f103 0108 add.w r1, r3, #8
  21392. 80289f0: 428a cmp r2, r1
  21393. 80289f2: 605a str r2, [r3, #4]
  21394. 80289f4: bf04 itt eq
  21395. 80289f6: 6852 ldreq r2, [r2, #4]
  21396. 80289f8: 605a streq r2, [r3, #4]
  21397. 80289fa: 685b ldr r3, [r3, #4]
  21398. 80289fc: 68da ldr r2, [r3, #12]
  21399. 80289fe: 4b05 ldr r3, [pc, #20] ; (8028a14 <vTaskSwitchContext+0x5c>)
  21400. 8028a00: 601a str r2, [r3, #0]
  21401. 8028a02: bd08 pop {r3, pc}
  21402. 8028a04: 200029a4 .word 0x200029a4
  21403. 8028a08: 200029d0 .word 0x200029d0
  21404. 8028a0c: 200029cc .word 0x200029cc
  21405. 8028a10: 20002914 .word 0x20002914
  21406. 8028a14: 2000298c .word 0x2000298c
  21407. 08028a18 <vTaskPlaceOnEventList>:
  21408. }
  21409. }
  21410. /*-----------------------------------------------------------*/
  21411. void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait )
  21412. {
  21413. 8028a18: b538 push {r3, r4, r5, lr}
  21414. 8028a1a: 460d mov r5, r1
  21415. TickType_t xTimeToWake;
  21416. configASSERT( pxEventList );
  21417. 8028a1c: b910 cbnz r0, 8028a24 <vTaskPlaceOnEventList+0xc>
  21418. 8028a1e: f000 f981 bl 8028d24 <ulPortSetInterruptMask>
  21419. 8028a22: e7fe b.n 8028a22 <vTaskPlaceOnEventList+0xa>
  21420. /* Place the event list item of the TCB in the appropriate event list.
  21421. This is placed in the list in priority order so the highest priority task
  21422. is the first to be woken by the event. The queue that contains the event
  21423. list is locked, preventing simultaneous access from interrupts. */
  21424. vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) );
  21425. 8028a24: 4c12 ldr r4, [pc, #72] ; (8028a70 <vTaskPlaceOnEventList+0x58>)
  21426. 8028a26: 6821 ldr r1, [r4, #0]
  21427. 8028a28: 3118 adds r1, #24
  21428. 8028a2a: f7ff f9d7 bl 8027ddc <vListInsert>
  21429. /* The task must be removed from from the ready list before it is added to
  21430. the blocked list as the same list item is used for both lists. Exclusive
  21431. access to the ready lists guaranteed because the scheduler is locked. */
  21432. if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  21433. 8028a2e: 6820 ldr r0, [r4, #0]
  21434. 8028a30: 3004 adds r0, #4
  21435. 8028a32: f7ff f9eb bl 8027e0c <uxListRemove>
  21436. 8028a36: b948 cbnz r0, 8028a4c <vTaskPlaceOnEventList+0x34>
  21437. {
  21438. /* The current task must be in a ready list, so there is no need to
  21439. check, and the port reset macro can be called directly. */
  21440. portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority );
  21441. 8028a38: 4b0e ldr r3, [pc, #56] ; (8028a74 <vTaskPlaceOnEventList+0x5c>)
  21442. 8028a3a: 6819 ldr r1, [r3, #0]
  21443. 8028a3c: 6822 ldr r2, [r4, #0]
  21444. 8028a3e: 6ad2 ldr r2, [r2, #44] ; 0x2c
  21445. 8028a40: 2001 movs r0, #1
  21446. 8028a42: fa00 f202 lsl.w r2, r0, r2
  21447. 8028a46: ea21 0202 bic.w r2, r1, r2
  21448. 8028a4a: 601a str r2, [r3, #0]
  21449. mtCOVERAGE_TEST_MARKER();
  21450. }
  21451. #if ( INCLUDE_vTaskSuspend == 1 )
  21452. {
  21453. if( xTicksToWait == portMAX_DELAY )
  21454. 8028a4c: 1c69 adds r1, r5, #1
  21455. 8028a4e: d107 bne.n 8028a60 <vTaskPlaceOnEventList+0x48>
  21456. {
  21457. /* Add the task to the suspended task list instead of a delayed task
  21458. list to ensure the task is not woken by a timing event. It will
  21459. block indefinitely. */
  21460. vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  21461. 8028a50: 4b07 ldr r3, [pc, #28] ; (8028a70 <vTaskPlaceOnEventList+0x58>)
  21462. 8028a52: 4809 ldr r0, [pc, #36] ; (8028a78 <vTaskPlaceOnEventList+0x60>)
  21463. 8028a54: 6819 ldr r1, [r3, #0]
  21464. 8028a56: 3104 adds r1, #4
  21465. will handle it. */
  21466. xTimeToWake = xTickCount + xTicksToWait;
  21467. prvAddCurrentTaskToDelayedList( xTimeToWake );
  21468. }
  21469. #endif /* INCLUDE_vTaskSuspend */
  21470. }
  21471. 8028a58: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  21472. if( xTicksToWait == portMAX_DELAY )
  21473. {
  21474. /* Add the task to the suspended task list instead of a delayed task
  21475. list to ensure the task is not woken by a timing event. It will
  21476. block indefinitely. */
  21477. vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xGenericListItem ) );
  21478. 8028a5c: f7ff b9b2 b.w 8027dc4 <vListInsertEnd>
  21479. else
  21480. {
  21481. /* Calculate the time at which the task should be woken if the event
  21482. does not occur. This may overflow but this doesn't matter, the
  21483. scheduler will handle it. */
  21484. xTimeToWake = xTickCount + xTicksToWait;
  21485. 8028a60: 4b06 ldr r3, [pc, #24] ; (8028a7c <vTaskPlaceOnEventList+0x64>)
  21486. 8028a62: 6818 ldr r0, [r3, #0]
  21487. prvAddCurrentTaskToDelayedList( xTimeToWake );
  21488. 8028a64: 1828 adds r0, r5, r0
  21489. will handle it. */
  21490. xTimeToWake = xTickCount + xTicksToWait;
  21491. prvAddCurrentTaskToDelayedList( xTimeToWake );
  21492. }
  21493. #endif /* INCLUDE_vTaskSuspend */
  21494. }
  21495. 8028a66: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  21496. {
  21497. /* Calculate the time at which the task should be woken if the event
  21498. does not occur. This may overflow but this doesn't matter, the
  21499. scheduler will handle it. */
  21500. xTimeToWake = xTickCount + xTicksToWait;
  21501. prvAddCurrentTaskToDelayedList( xTimeToWake );
  21502. 8028a6a: f7ff bcb5 b.w 80283d8 <prvAddCurrentTaskToDelayedList>
  21503. 8028a6e: bf00 nop
  21504. 8028a70: 2000298c .word 0x2000298c
  21505. 8028a74: 200029cc .word 0x200029cc
  21506. 8028a78: 200029b8 .word 0x200029b8
  21507. 8028a7c: 200029a8 .word 0x200029a8
  21508. 08028a80 <xTaskRemoveFromEventList>:
  21509. #endif /* configUSE_TIMERS */
  21510. /*-----------------------------------------------------------*/
  21511. BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList )
  21512. {
  21513. 8028a80: b538 push {r3, r4, r5, lr}
  21514. get called - the lock count on the queue will get modified instead. This
  21515. means exclusive access to the event list is guaranteed here.
  21516. This function assumes that a check has already been made to ensure that
  21517. pxEventList is not empty. */
  21518. pxUnblockedTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList );
  21519. 8028a82: 68c3 ldr r3, [r0, #12]
  21520. 8028a84: 68dc ldr r4, [r3, #12]
  21521. configASSERT( pxUnblockedTCB );
  21522. 8028a86: b914 cbnz r4, 8028a8e <xTaskRemoveFromEventList+0xe>
  21523. 8028a88: f000 f94c bl 8028d24 <ulPortSetInterruptMask>
  21524. 8028a8c: e7fe b.n 8028a8c <xTaskRemoveFromEventList+0xc>
  21525. ( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) );
  21526. 8028a8e: f104 0518 add.w r5, r4, #24
  21527. 8028a92: 4628 mov r0, r5
  21528. 8028a94: f7ff f9ba bl 8027e0c <uxListRemove>
  21529. if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )
  21530. 8028a98: 4b11 ldr r3, [pc, #68] ; (8028ae0 <xTaskRemoveFromEventList+0x60>)
  21531. 8028a9a: 681b ldr r3, [r3, #0]
  21532. 8028a9c: b983 cbnz r3, 8028ac0 <xTaskRemoveFromEventList+0x40>
  21533. {
  21534. ( void ) uxListRemove( &( pxUnblockedTCB->xGenericListItem ) );
  21535. 8028a9e: 1d25 adds r5, r4, #4
  21536. 8028aa0: 4628 mov r0, r5
  21537. 8028aa2: f7ff f9b3 bl 8027e0c <uxListRemove>
  21538. prvAddTaskToReadyList( pxUnblockedTCB );
  21539. 8028aa6: 4a0f ldr r2, [pc, #60] ; (8028ae4 <xTaskRemoveFromEventList+0x64>)
  21540. 8028aa8: 6ae3 ldr r3, [r4, #44] ; 0x2c
  21541. 8028aaa: 6810 ldr r0, [r2, #0]
  21542. 8028aac: 2101 movs r1, #1
  21543. 8028aae: fa01 f103 lsl.w r1, r1, r3
  21544. 8028ab2: 4301 orrs r1, r0
  21545. 8028ab4: 6011 str r1, [r2, #0]
  21546. 8028ab6: 4a0c ldr r2, [pc, #48] ; (8028ae8 <xTaskRemoveFromEventList+0x68>)
  21547. 8028ab8: 2014 movs r0, #20
  21548. 8028aba: fb00 2003 mla r0, r0, r3, r2
  21549. 8028abe: e000 b.n 8028ac2 <xTaskRemoveFromEventList+0x42>
  21550. }
  21551. else
  21552. {
  21553. /* The delayed and ready lists cannot be accessed, so hold this task
  21554. pending until the scheduler is resumed. */
  21555. vListInsertEnd( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) );
  21556. 8028ac0: 480a ldr r0, [pc, #40] ; (8028aec <xTaskRemoveFromEventList+0x6c>)
  21557. 8028ac2: 4629 mov r1, r5
  21558. 8028ac4: f7ff f97e bl 8027dc4 <vListInsertEnd>
  21559. }
  21560. if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority )
  21561. 8028ac8: 4b09 ldr r3, [pc, #36] ; (8028af0 <xTaskRemoveFromEventList+0x70>)
  21562. 8028aca: 6ae2 ldr r2, [r4, #44] ; 0x2c
  21563. 8028acc: 681b ldr r3, [r3, #0]
  21564. 8028ace: 6adb ldr r3, [r3, #44] ; 0x2c
  21565. 8028ad0: 429a cmp r2, r3
  21566. 8028ad2: d903 bls.n 8028adc <xTaskRemoveFromEventList+0x5c>
  21567. it should force a context switch now. */
  21568. xReturn = pdTRUE;
  21569. /* Mark that a yield is pending in case the user is not using the
  21570. "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */
  21571. xYieldPending = pdTRUE;
  21572. 8028ad4: 4b07 ldr r3, [pc, #28] ; (8028af4 <xTaskRemoveFromEventList+0x74>)
  21573. 8028ad6: 2001 movs r0, #1
  21574. 8028ad8: 6018 str r0, [r3, #0]
  21575. 8028ada: bd38 pop {r3, r4, r5, pc}
  21576. }
  21577. else
  21578. {
  21579. xReturn = pdFALSE;
  21580. 8028adc: 2000 movs r0, #0
  21581. prvResetNextTaskUnblockTime();
  21582. }
  21583. #endif
  21584. return xReturn;
  21585. }
  21586. 8028ade: bd38 pop {r3, r4, r5, pc}
  21587. 8028ae0: 200029a4 .word 0x200029a4
  21588. 8028ae4: 200029cc .word 0x200029cc
  21589. 8028ae8: 20002914 .word 0x20002914
  21590. 8028aec: 20002990 .word 0x20002990
  21591. 8028af0: 2000298c .word 0x2000298c
  21592. 8028af4: 200029d0 .word 0x200029d0
  21593. 08028af8 <vTaskSetTimeOutState>:
  21594. return xReturn;
  21595. }
  21596. /*-----------------------------------------------------------*/
  21597. void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut )
  21598. {
  21599. 8028af8: b508 push {r3, lr}
  21600. configASSERT( pxTimeOut );
  21601. 8028afa: b910 cbnz r0, 8028b02 <vTaskSetTimeOutState+0xa>
  21602. 8028afc: f000 f912 bl 8028d24 <ulPortSetInterruptMask>
  21603. 8028b00: e7fe b.n 8028b00 <vTaskSetTimeOutState+0x8>
  21604. pxTimeOut->xOverflowCount = xNumOfOverflows;
  21605. 8028b02: 4b03 ldr r3, [pc, #12] ; (8028b10 <vTaskSetTimeOutState+0x18>)
  21606. 8028b04: 681b ldr r3, [r3, #0]
  21607. 8028b06: 6003 str r3, [r0, #0]
  21608. pxTimeOut->xTimeOnEntering = xTickCount;
  21609. 8028b08: 4b02 ldr r3, [pc, #8] ; (8028b14 <vTaskSetTimeOutState+0x1c>)
  21610. 8028b0a: 681b ldr r3, [r3, #0]
  21611. 8028b0c: 6043 str r3, [r0, #4]
  21612. 8028b0e: bd08 pop {r3, pc}
  21613. 8028b10: 200028d8 .word 0x200028d8
  21614. 8028b14: 200029a8 .word 0x200029a8
  21615. 08028b18 <xTaskCheckForTimeOut>:
  21616. }
  21617. /*-----------------------------------------------------------*/
  21618. BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait )
  21619. {
  21620. 8028b18: b538 push {r3, r4, r5, lr}
  21621. 8028b1a: 460d mov r5, r1
  21622. BaseType_t xReturn;
  21623. configASSERT( pxTimeOut );
  21624. 8028b1c: 4604 mov r4, r0
  21625. 8028b1e: b910 cbnz r0, 8028b26 <xTaskCheckForTimeOut+0xe>
  21626. 8028b20: f000 f900 bl 8028d24 <ulPortSetInterruptMask>
  21627. 8028b24: e7fe b.n 8028b24 <xTaskCheckForTimeOut+0xc>
  21628. configASSERT( pxTicksToWait );
  21629. 8028b26: b911 cbnz r1, 8028b2e <xTaskCheckForTimeOut+0x16>
  21630. 8028b28: f000 f8fc bl 8028d24 <ulPortSetInterruptMask>
  21631. 8028b2c: e7fe b.n 8028b2c <xTaskCheckForTimeOut+0x14>
  21632. taskENTER_CRITICAL();
  21633. 8028b2e: f000 f901 bl 8028d34 <vPortEnterCritical>
  21634. {
  21635. /* Minor optimisation. The tick count cannot change in this block. */
  21636. const TickType_t xConstTickCount = xTickCount;
  21637. 8028b32: 4b0e ldr r3, [pc, #56] ; (8028b6c <xTaskCheckForTimeOut+0x54>)
  21638. 8028b34: 681a ldr r2, [r3, #0]
  21639. #if ( INCLUDE_vTaskSuspend == 1 )
  21640. /* If INCLUDE_vTaskSuspend is set to 1 and the block time specified is
  21641. the maximum block time then the task should block indefinitely, and
  21642. therefore never time out. */
  21643. if( *pxTicksToWait == portMAX_DELAY )
  21644. 8028b36: 682b ldr r3, [r5, #0]
  21645. 8028b38: 1c59 adds r1, r3, #1
  21646. 8028b3a: d010 beq.n 8028b5e <xTaskCheckForTimeOut+0x46>
  21647. xReturn = pdFALSE;
  21648. }
  21649. else /* We are not blocking indefinitely, perform the checks below. */
  21650. #endif
  21651. if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */
  21652. 8028b3c: 490c ldr r1, [pc, #48] ; (8028b70 <xTaskCheckForTimeOut+0x58>)
  21653. 8028b3e: 6808 ldr r0, [r1, #0]
  21654. 8028b40: 6821 ldr r1, [r4, #0]
  21655. 8028b42: 4288 cmp r0, r1
  21656. 8028b44: 6861 ldr r1, [r4, #4]
  21657. 8028b46: d001 beq.n 8028b4c <xTaskCheckForTimeOut+0x34>
  21658. 8028b48: 428a cmp r2, r1
  21659. 8028b4a: d20a bcs.n 8028b62 <xTaskCheckForTimeOut+0x4a>
  21660. was called, but has also overflowed since vTaskSetTimeOut() was called.
  21661. It must have wrapped all the way around and gone past us again. This
  21662. passed since vTaskSetTimeout() was called. */
  21663. xReturn = pdTRUE;
  21664. }
  21665. else if( ( xConstTickCount - pxTimeOut->xTimeOnEntering ) < *pxTicksToWait )
  21666. 8028b4c: 1a50 subs r0, r2, r1
  21667. 8028b4e: 4298 cmp r0, r3
  21668. 8028b50: d207 bcs.n 8028b62 <xTaskCheckForTimeOut+0x4a>
  21669. {
  21670. /* Not a genuine timeout. Adjust parameters for time remaining. */
  21671. *pxTicksToWait -= ( xConstTickCount - pxTimeOut->xTimeOnEntering );
  21672. 8028b52: 1a8a subs r2, r1, r2
  21673. 8028b54: 18d3 adds r3, r2, r3
  21674. 8028b56: 602b str r3, [r5, #0]
  21675. vTaskSetTimeOutState( pxTimeOut );
  21676. 8028b58: 4620 mov r0, r4
  21677. 8028b5a: f7ff ffcd bl 8028af8 <vTaskSetTimeOutState>
  21678. /* If INCLUDE_vTaskSuspend is set to 1 and the block time specified is
  21679. the maximum block time then the task should block indefinitely, and
  21680. therefore never time out. */
  21681. if( *pxTicksToWait == portMAX_DELAY )
  21682. {
  21683. xReturn = pdFALSE;
  21684. 8028b5e: 2400 movs r4, #0
  21685. 8028b60: e000 b.n 8028b64 <xTaskCheckForTimeOut+0x4c>
  21686. {
  21687. /* The tick count is greater than the time at which vTaskSetTimeout()
  21688. was called, but has also overflowed since vTaskSetTimeOut() was called.
  21689. It must have wrapped all the way around and gone past us again. This
  21690. passed since vTaskSetTimeout() was called. */
  21691. xReturn = pdTRUE;
  21692. 8028b62: 2401 movs r4, #1
  21693. else
  21694. {
  21695. xReturn = pdTRUE;
  21696. }
  21697. }
  21698. taskEXIT_CRITICAL();
  21699. 8028b64: f000 f912 bl 8028d8c <vPortExitCritical>
  21700. return xReturn;
  21701. }
  21702. 8028b68: 4620 mov r0, r4
  21703. 8028b6a: bd38 pop {r3, r4, r5, pc}
  21704. 8028b6c: 200029a8 .word 0x200029a8
  21705. 8028b70: 200028d8 .word 0x200028d8
  21706. 08028b74 <vTaskMissedYield>:
  21707. /*-----------------------------------------------------------*/
  21708. void vTaskMissedYield( void )
  21709. {
  21710. xYieldPending = pdTRUE;
  21711. 8028b74: 4b01 ldr r3, [pc, #4] ; (8028b7c <vTaskMissedYield+0x8>)
  21712. 8028b76: 2201 movs r2, #1
  21713. 8028b78: 601a str r2, [r3, #0]
  21714. 8028b7a: 4770 bx lr
  21715. 8028b7c: 200029d0 .word 0x200029d0
  21716. 08028b80 <vTaskPriorityInherit>:
  21717. /*-----------------------------------------------------------*/
  21718. #if ( configUSE_MUTEXES == 1 )
  21719. void vTaskPriorityInherit( TaskHandle_t const pxMutexHolder )
  21720. {
  21721. 8028b80: b5f8 push {r3, r4, r5, r6, r7, lr}
  21722. TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;
  21723. /* If the mutex was given back by an interrupt while the queue was
  21724. locked then the mutex holder might now be NULL. */
  21725. if( pxMutexHolder != NULL )
  21726. 8028b82: 4604 mov r4, r0
  21727. 8028b84: 2800 cmp r0, #0
  21728. 8028b86: d040 beq.n 8028c0a <vTaskPriorityInherit+0x8a>
  21729. {
  21730. if( pxTCB->uxPriority < pxCurrentTCB->uxPriority )
  21731. 8028b88: 4a20 ldr r2, [pc, #128] ; (8028c0c <vTaskPriorityInherit+0x8c>)
  21732. 8028b8a: 6ac3 ldr r3, [r0, #44] ; 0x2c
  21733. 8028b8c: 6811 ldr r1, [r2, #0]
  21734. 8028b8e: 6ac9 ldr r1, [r1, #44] ; 0x2c
  21735. 8028b90: 428b cmp r3, r1
  21736. 8028b92: d23a bcs.n 8028c0a <vTaskPriorityInherit+0x8a>
  21737. {
  21738. /* Adjust the mutex holder state to account for its new
  21739. priority. Only reset the event list item value if the value is
  21740. not being used for anything else. */
  21741. if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL )
  21742. 8028b94: 6981 ldr r1, [r0, #24]
  21743. 8028b96: 2900 cmp r1, #0
  21744. 8028b98: db04 blt.n 8028ba4 <vTaskPriorityInherit+0x24>
  21745. {
  21746. 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. */
  21747. 8028b9a: 6812 ldr r2, [r2, #0]
  21748. 8028b9c: 6ad2 ldr r2, [r2, #44] ; 0x2c
  21749. 8028b9e: f1c2 0205 rsb r2, r2, #5
  21750. 8028ba2: 6182 str r2, [r0, #24]
  21751. mtCOVERAGE_TEST_MARKER();
  21752. }
  21753. /* If the task being modified is in the ready state it will need to
  21754. be moved into a new list. */
  21755. if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ) != pdFALSE )
  21756. 8028ba4: 4e1a ldr r6, [pc, #104] ; (8028c10 <vTaskPriorityInherit+0x90>)
  21757. 8028ba6: 6962 ldr r2, [r4, #20]
  21758. 8028ba8: 2714 movs r7, #20
  21759. 8028baa: fb07 6303 mla r3, r7, r3, r6
  21760. 8028bae: 429a cmp r2, r3
  21761. 8028bb0: d127 bne.n 8028c02 <vTaskPriorityInherit+0x82>
  21762. 8028bb2: e01f b.n 8028bf4 <vTaskPriorityInherit+0x74>
  21763. {
  21764. if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  21765. {
  21766. taskRESET_READY_PRIORITY( pxTCB->uxPriority );
  21767. 8028bb4: 6ae2 ldr r2, [r4, #44] ; 0x2c
  21768. 8028bb6: 4357 muls r7, r2
  21769. 8028bb8: 59f3 ldr r3, [r6, r7]
  21770. 8028bba: b93b cbnz r3, 8028bcc <vTaskPriorityInherit+0x4c>
  21771. 8028bbc: 4b15 ldr r3, [pc, #84] ; (8028c14 <vTaskPriorityInherit+0x94>)
  21772. 8028bbe: 2001 movs r0, #1
  21773. 8028bc0: 6819 ldr r1, [r3, #0]
  21774. 8028bc2: fa00 f202 lsl.w r2, r0, r2
  21775. 8028bc6: ea21 0202 bic.w r2, r1, r2
  21776. 8028bca: 601a str r2, [r3, #0]
  21777. {
  21778. mtCOVERAGE_TEST_MARKER();
  21779. }
  21780. /* Inherit the priority before being moved into the new list. */
  21781. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  21782. 8028bcc: 4b0f ldr r3, [pc, #60] ; (8028c0c <vTaskPriorityInherit+0x8c>)
  21783. prvAddTaskToReadyList( pxTCB );
  21784. 8028bce: 4a11 ldr r2, [pc, #68] ; (8028c14 <vTaskPriorityInherit+0x94>)
  21785. {
  21786. mtCOVERAGE_TEST_MARKER();
  21787. }
  21788. /* Inherit the priority before being moved into the new list. */
  21789. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  21790. 8028bd0: 681b ldr r3, [r3, #0]
  21791. prvAddTaskToReadyList( pxTCB );
  21792. 8028bd2: 6810 ldr r0, [r2, #0]
  21793. {
  21794. mtCOVERAGE_TEST_MARKER();
  21795. }
  21796. /* Inherit the priority before being moved into the new list. */
  21797. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  21798. 8028bd4: 6adb ldr r3, [r3, #44] ; 0x2c
  21799. prvAddTaskToReadyList( pxTCB );
  21800. 8028bd6: 2101 movs r1, #1
  21801. 8028bd8: fa01 f103 lsl.w r1, r1, r3
  21802. 8028bdc: 4301 orrs r1, r0
  21803. 8028bde: 6011 str r1, [r2, #0]
  21804. 8028be0: 4a0b ldr r2, [pc, #44] ; (8028c10 <vTaskPriorityInherit+0x90>)
  21805. {
  21806. mtCOVERAGE_TEST_MARKER();
  21807. }
  21808. /* Inherit the priority before being moved into the new list. */
  21809. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  21810. 8028be2: 62e3 str r3, [r4, #44] ; 0x2c
  21811. prvAddTaskToReadyList( pxTCB );
  21812. 8028be4: 2014 movs r0, #20
  21813. 8028be6: fb00 2003 mla r0, r0, r3, r2
  21814. 8028bea: 4629 mov r1, r5
  21815. }
  21816. else
  21817. {
  21818. mtCOVERAGE_TEST_MARKER();
  21819. }
  21820. }
  21821. 8028bec: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr}
  21822. mtCOVERAGE_TEST_MARKER();
  21823. }
  21824. /* Inherit the priority before being moved into the new list. */
  21825. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  21826. prvAddTaskToReadyList( pxTCB );
  21827. 8028bf0: f7ff b8e8 b.w 8027dc4 <vListInsertEnd>
  21828. /* If the task being modified is in the ready state it will need to
  21829. be moved into a new list. */
  21830. if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ) != pdFALSE )
  21831. {
  21832. if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  21833. 8028bf4: 1d25 adds r5, r4, #4
  21834. 8028bf6: 4628 mov r0, r5
  21835. 8028bf8: f7ff f908 bl 8027e0c <uxListRemove>
  21836. 8028bfc: 2800 cmp r0, #0
  21837. 8028bfe: d0d9 beq.n 8028bb4 <vTaskPriorityInherit+0x34>
  21838. 8028c00: e7e4 b.n 8028bcc <vTaskPriorityInherit+0x4c>
  21839. prvAddTaskToReadyList( pxTCB );
  21840. }
  21841. else
  21842. {
  21843. /* Just inherit the priority. */
  21844. pxTCB->uxPriority = pxCurrentTCB->uxPriority;
  21845. 8028c02: 4b02 ldr r3, [pc, #8] ; (8028c0c <vTaskPriorityInherit+0x8c>)
  21846. 8028c04: 681b ldr r3, [r3, #0]
  21847. 8028c06: 6adb ldr r3, [r3, #44] ; 0x2c
  21848. 8028c08: 62e3 str r3, [r4, #44] ; 0x2c
  21849. 8028c0a: bdf8 pop {r3, r4, r5, r6, r7, pc}
  21850. 8028c0c: 2000298c .word 0x2000298c
  21851. 8028c10: 20002914 .word 0x20002914
  21852. 8028c14: 200029cc .word 0x200029cc
  21853. 08028c18 <xTaskPriorityDisinherit>:
  21854. /*-----------------------------------------------------------*/
  21855. #if ( configUSE_MUTEXES == 1 )
  21856. BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder )
  21857. {
  21858. 8028c18: b538 push {r3, r4, r5, lr}
  21859. TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;
  21860. BaseType_t xReturn = pdFALSE;
  21861. if( pxMutexHolder != NULL )
  21862. 8028c1a: 4604 mov r4, r0
  21863. 8028c1c: b908 cbnz r0, 8028c22 <xTaskPriorityDisinherit+0xa>
  21864. #if ( configUSE_MUTEXES == 1 )
  21865. BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder )
  21866. {
  21867. TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;
  21868. BaseType_t xReturn = pdFALSE;
  21869. 8028c1e: 2000 movs r0, #0
  21870. 8028c20: bd38 pop {r3, r4, r5, pc}
  21871. if( pxMutexHolder != NULL )
  21872. {
  21873. configASSERT( pxTCB->uxMutexesHeld );
  21874. 8028c22: 6d03 ldr r3, [r0, #80] ; 0x50
  21875. 8028c24: b913 cbnz r3, 8028c2c <xTaskPriorityDisinherit+0x14>
  21876. 8028c26: f000 f87d bl 8028d24 <ulPortSetInterruptMask>
  21877. 8028c2a: e7fe b.n 8028c2a <xTaskPriorityDisinherit+0x12>
  21878. ( pxTCB->uxMutexesHeld )--;
  21879. if( pxTCB->uxPriority != pxTCB->uxBasePriority )
  21880. 8028c2c: 6ac1 ldr r1, [r0, #44] ; 0x2c
  21881. 8028c2e: 6cc2 ldr r2, [r0, #76] ; 0x4c
  21882. BaseType_t xReturn = pdFALSE;
  21883. if( pxMutexHolder != NULL )
  21884. {
  21885. configASSERT( pxTCB->uxMutexesHeld );
  21886. ( pxTCB->uxMutexesHeld )--;
  21887. 8028c30: 3b01 subs r3, #1
  21888. if( pxTCB->uxPriority != pxTCB->uxBasePriority )
  21889. 8028c32: 4291 cmp r1, r2
  21890. BaseType_t xReturn = pdFALSE;
  21891. if( pxMutexHolder != NULL )
  21892. {
  21893. configASSERT( pxTCB->uxMutexesHeld );
  21894. ( pxTCB->uxMutexesHeld )--;
  21895. 8028c34: 6503 str r3, [r0, #80] ; 0x50
  21896. if( pxTCB->uxPriority != pxTCB->uxBasePriority )
  21897. 8028c36: d0f2 beq.n 8028c1e <xTaskPriorityDisinherit+0x6>
  21898. {
  21899. /* Only disinherit if no other mutexes are held. */
  21900. if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 )
  21901. 8028c38: 2b00 cmp r3, #0
  21902. 8028c3a: d1f0 bne.n 8028c1e <xTaskPriorityDisinherit+0x6>
  21903. /* A task can only have an inhertied priority if it holds
  21904. the mutex. If the mutex is held by a task then it cannot be
  21905. given from an interrupt, and if a mutex is given by the
  21906. holding task then it must be the running state task. Remove
  21907. the holding task from the ready list. */
  21908. if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )
  21909. 8028c3c: 1d05 adds r5, r0, #4
  21910. 8028c3e: 4628 mov r0, r5
  21911. 8028c40: f7ff f8e4 bl 8027e0c <uxListRemove>
  21912. 8028c44: b968 cbnz r0, 8028c62 <xTaskPriorityDisinherit+0x4a>
  21913. {
  21914. taskRESET_READY_PRIORITY( pxTCB->uxPriority );
  21915. 8028c46: 6ae2 ldr r2, [r4, #44] ; 0x2c
  21916. 8028c48: 4910 ldr r1, [pc, #64] ; (8028c8c <xTaskPriorityDisinherit+0x74>)
  21917. 8028c4a: 2314 movs r3, #20
  21918. 8028c4c: 4353 muls r3, r2
  21919. 8028c4e: 58cb ldr r3, [r1, r3]
  21920. 8028c50: b93b cbnz r3, 8028c62 <xTaskPriorityDisinherit+0x4a>
  21921. 8028c52: 4b0f ldr r3, [pc, #60] ; (8028c90 <xTaskPriorityDisinherit+0x78>)
  21922. 8028c54: 2001 movs r0, #1
  21923. 8028c56: 6819 ldr r1, [r3, #0]
  21924. 8028c58: fa00 f202 lsl.w r2, r0, r2
  21925. 8028c5c: ea21 0202 bic.w r2, r1, r2
  21926. 8028c60: 601a str r2, [r3, #0]
  21927. }
  21928. /* Disinherit the priority before adding the task into the
  21929. new ready list. */
  21930. traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority );
  21931. pxTCB->uxPriority = pxTCB->uxBasePriority;
  21932. 8028c62: 6ce3 ldr r3, [r4, #76] ; 0x4c
  21933. /* Reset the event list item value. It cannot be in use for
  21934. any other purpose if this task is running, and it must be
  21935. running to give back the mutex. */
  21936. 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. */
  21937. 8028c64: f1c3 0205 rsb r2, r3, #5
  21938. 8028c68: 61a2 str r2, [r4, #24]
  21939. prvAddTaskToReadyList( pxTCB );
  21940. 8028c6a: 4a09 ldr r2, [pc, #36] ; (8028c90 <xTaskPriorityDisinherit+0x78>)
  21941. }
  21942. /* Disinherit the priority before adding the task into the
  21943. new ready list. */
  21944. traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority );
  21945. pxTCB->uxPriority = pxTCB->uxBasePriority;
  21946. 8028c6c: 62e3 str r3, [r4, #44] ; 0x2c
  21947. /* Reset the event list item value. It cannot be in use for
  21948. any other purpose if this task is running, and it must be
  21949. running to give back the mutex. */
  21950. 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. */
  21951. prvAddTaskToReadyList( pxTCB );
  21952. 8028c6e: 6811 ldr r1, [r2, #0]
  21953. 8028c70: 2401 movs r4, #1
  21954. 8028c72: fa04 f003 lsl.w r0, r4, r3
  21955. 8028c76: 4301 orrs r1, r0
  21956. 8028c78: 6011 str r1, [r2, #0]
  21957. 8028c7a: 4a04 ldr r2, [pc, #16] ; (8028c8c <xTaskPriorityDisinherit+0x74>)
  21958. 8028c7c: 2014 movs r0, #20
  21959. 8028c7e: fb00 2003 mla r0, r0, r3, r2
  21960. 8028c82: 4629 mov r1, r5
  21961. 8028c84: f7ff f89e bl 8027dc4 <vListInsertEnd>
  21962. in an order different to that in which they were taken.
  21963. If a context switch did not occur when the first mutex was
  21964. returned, even if a task was waiting on it, then a context
  21965. switch should occur when the last mutex is returned whether
  21966. a task is waiting on it or not. */
  21967. xReturn = pdTRUE;
  21968. 8028c88: 4620 mov r0, r4
  21969. {
  21970. mtCOVERAGE_TEST_MARKER();
  21971. }
  21972. return xReturn;
  21973. }
  21974. 8028c8a: bd38 pop {r3, r4, r5, pc}
  21975. 8028c8c: 20002914 .word 0x20002914
  21976. 8028c90: 200029cc .word 0x200029cc
  21977. 08028c94 <pvTaskIncrementMutexHeldCount>:
  21978. void *pvTaskIncrementMutexHeldCount( void )
  21979. {
  21980. /* If xSemaphoreCreateMutex() is called before any tasks have been created
  21981. then pxCurrentTCB will be NULL. */
  21982. if( pxCurrentTCB != NULL )
  21983. 8028c94: 4b04 ldr r3, [pc, #16] ; (8028ca8 <pvTaskIncrementMutexHeldCount+0x14>)
  21984. 8028c96: 681a ldr r2, [r3, #0]
  21985. 8028c98: b11a cbz r2, 8028ca2 <pvTaskIncrementMutexHeldCount+0xe>
  21986. {
  21987. ( pxCurrentTCB->uxMutexesHeld )++;
  21988. 8028c9a: 681a ldr r2, [r3, #0]
  21989. 8028c9c: 6d11 ldr r1, [r2, #80] ; 0x50
  21990. 8028c9e: 3101 adds r1, #1
  21991. 8028ca0: 6511 str r1, [r2, #80] ; 0x50
  21992. }
  21993. return pxCurrentTCB;
  21994. 8028ca2: 6818 ldr r0, [r3, #0]
  21995. }
  21996. 8028ca4: 4770 bx lr
  21997. 8028ca6: bf00 nop
  21998. 8028ca8: 2000298c .word 0x2000298c
  21999. 08028cac <prvPortStartFirstTask>:
  22000. }
  22001. /*-----------------------------------------------------------*/
  22002. static void prvPortStartFirstTask( void )
  22003. {
  22004. __asm volatile(
  22005. 8028cac: 4806 ldr r0, [pc, #24] ; (8028cc8 <prvPortStartFirstTask+0x1c>)
  22006. 8028cae: 6800 ldr r0, [r0, #0]
  22007. 8028cb0: 6800 ldr r0, [r0, #0]
  22008. 8028cb2: f380 8808 msr MSP, r0
  22009. 8028cb6: b662 cpsie i
  22010. 8028cb8: b661 cpsie f
  22011. 8028cba: f3bf 8f4f dsb sy
  22012. 8028cbe: f3bf 8f6f isb sy
  22013. 8028cc2: df00 svc 0
  22014. 8028cc4: bf00 nop
  22015. 8028cc6: 0000 .short 0x0000
  22016. 8028cc8: e000ed08 .word 0xe000ed08
  22017. 08028ccc <pxPortInitialiseStack>:
  22018. StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
  22019. {
  22020. /* Simulate the stack frame as it would be created by a context switch
  22021. interrupt. */
  22022. pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
  22023. *pxTopOfStack = portINITIAL_XPSR; /* xPSR */
  22024. 8028ccc: f04f 7380 mov.w r3, #16777216 ; 0x1000000
  22025. pxTopOfStack--;
  22026. *pxTopOfStack = ( StackType_t ) pxCode; /* PC */
  22027. 8028cd0: e900 000a stmdb r0, {r1, r3}
  22028. pxTopOfStack--;
  22029. *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */
  22030. 8028cd4: 4b03 ldr r3, [pc, #12] ; (8028ce4 <pxPortInitialiseStack+0x18>)
  22031. pxTopOfStack -= 5; /* R12, R3, R2 and R1. */
  22032. *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
  22033. 8028cd6: f840 2c20 str.w r2, [r0, #-32]
  22034. pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
  22035. *pxTopOfStack = portINITIAL_XPSR; /* xPSR */
  22036. pxTopOfStack--;
  22037. *pxTopOfStack = ( StackType_t ) pxCode; /* PC */
  22038. pxTopOfStack--;
  22039. *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */
  22040. 8028cda: f840 3c0c str.w r3, [r0, #-12]
  22041. pxTopOfStack -= 5; /* R12, R3, R2 and R1. */
  22042. *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
  22043. pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */
  22044. return pxTopOfStack;
  22045. }
  22046. 8028cde: 3840 subs r0, #64 ; 0x40
  22047. 8028ce0: 4770 bx lr
  22048. 8028ce2: bf00 nop
  22049. 8028ce4: 08028d69 .word 0x08028d69
  22050. 08028ce8 <SVC_Handler>:
  22051. }
  22052. /*-----------------------------------------------------------*/
  22053. void vPortSVCHandler( void )
  22054. {
  22055. __asm volatile (
  22056. 8028ce8: 4b07 ldr r3, [pc, #28] ; (8028d08 <pxCurrentTCBConst2>)
  22057. 8028cea: 6819 ldr r1, [r3, #0]
  22058. 8028cec: 6808 ldr r0, [r1, #0]
  22059. 8028cee: e8b0 0ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp}
  22060. 8028cf2: f380 8809 msr PSP, r0
  22061. 8028cf6: f3bf 8f6f isb sy
  22062. 8028cfa: f04f 0000 mov.w r0, #0
  22063. 8028cfe: f380 8811 msr BASEPRI, r0
  22064. 8028d02: f04e 0e0d orr.w lr, lr, #13
  22065. 8028d06: 4770 bx lr
  22066. 08028d08 <pxCurrentTCBConst2>:
  22067. 8028d08: 2000298c .word 0x2000298c
  22068. 08028d0c <vPortYield>:
  22069. /*-----------------------------------------------------------*/
  22070. void vPortYield( void )
  22071. {
  22072. /* Set a PendSV to request a context switch. */
  22073. portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
  22074. 8028d0c: 4b04 ldr r3, [pc, #16] ; (8028d20 <vPortYield+0x14>)
  22075. 8028d0e: f04f 5280 mov.w r2, #268435456 ; 0x10000000
  22076. 8028d12: 601a str r2, [r3, #0]
  22077. /* Barriers are normally not required but do ensure the code is completely
  22078. within the specified behaviour for the architecture. */
  22079. __asm volatile( "dsb" );
  22080. 8028d14: f3bf 8f4f dsb sy
  22081. __asm volatile( "isb" );
  22082. 8028d18: f3bf 8f6f isb sy
  22083. 8028d1c: 4770 bx lr
  22084. 8028d1e: bf00 nop
  22085. 8028d20: e000ed04 .word 0xe000ed04
  22086. 08028d24 <ulPortSetInterruptMask>:
  22087. }
  22088. /*-----------------------------------------------------------*/
  22089. __attribute__(( naked )) uint32_t ulPortSetInterruptMask( void )
  22090. {
  22091. __asm volatile \
  22092. 8028d24: f3ef 8011 mrs r0, BASEPRI
  22093. 8028d28: f04f 0150 mov.w r1, #80 ; 0x50
  22094. 8028d2c: f381 8811 msr BASEPRI, r1
  22095. 8028d30: 4770 bx lr
  22096. );
  22097. /* This return will not be reached but is necessary to prevent compiler
  22098. warnings. */
  22099. return 0;
  22100. }
  22101. 8028d32: 2000 movs r0, #0
  22102. 08028d34 <vPortEnterCritical>:
  22103. __asm volatile( "isb" );
  22104. }
  22105. /*-----------------------------------------------------------*/
  22106. void vPortEnterCritical( void )
  22107. {
  22108. 8028d34: b508 push {r3, lr}
  22109. portDISABLE_INTERRUPTS();
  22110. 8028d36: f7ff fff5 bl 8028d24 <ulPortSetInterruptMask>
  22111. uxCriticalNesting++;
  22112. 8028d3a: 4a09 ldr r2, [pc, #36] ; (8028d60 <vPortEnterCritical+0x2c>)
  22113. 8028d3c: 6813 ldr r3, [r2, #0]
  22114. 8028d3e: 3301 adds r3, #1
  22115. 8028d40: 6013 str r3, [r2, #0]
  22116. __asm volatile( "dsb" );
  22117. 8028d42: f3bf 8f4f dsb sy
  22118. __asm volatile( "isb" );
  22119. 8028d46: f3bf 8f6f isb sy
  22120. /* This is not the interrupt safe version of the enter critical function so
  22121. assert() if it is being called from an interrupt context. Only API
  22122. functions that end in "FromISR" can be used in an interrupt. Only assert if
  22123. the critical nesting count is 1 to protect against recursive calls if the
  22124. assert function also uses a critical section. */
  22125. if( uxCriticalNesting == 1 )
  22126. 8028d4a: 2b01 cmp r3, #1
  22127. 8028d4c: d107 bne.n 8028d5e <vPortEnterCritical+0x2a>
  22128. {
  22129. configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
  22130. 8028d4e: 4b05 ldr r3, [pc, #20] ; (8028d64 <vPortEnterCritical+0x30>)
  22131. 8028d50: 681b ldr r3, [r3, #0]
  22132. 8028d52: f013 0fff tst.w r3, #255 ; 0xff
  22133. 8028d56: d002 beq.n 8028d5e <vPortEnterCritical+0x2a>
  22134. 8028d58: f7ff ffe4 bl 8028d24 <ulPortSetInterruptMask>
  22135. 8028d5c: e7fe b.n 8028d5c <vPortEnterCritical+0x28>
  22136. 8028d5e: bd08 pop {r3, pc}
  22137. 8028d60: 200015d8 .word 0x200015d8
  22138. 8028d64: e000ed04 .word 0xe000ed04
  22139. 08028d68 <prvTaskExitError>:
  22140. return pxTopOfStack;
  22141. }
  22142. /*-----------------------------------------------------------*/
  22143. static void prvTaskExitError( void )
  22144. {
  22145. 8028d68: b508 push {r3, lr}
  22146. its caller as there is nothing to return to. If a task wants to exit it
  22147. should instead call vTaskDelete( NULL ).
  22148. Artificially force an assert() to be triggered if configASSERT() is
  22149. defined, then stop here so application writers can catch the error. */
  22150. configASSERT( uxCriticalNesting == ~0UL );
  22151. 8028d6a: 4b05 ldr r3, [pc, #20] ; (8028d80 <prvTaskExitError+0x18>)
  22152. 8028d6c: 681b ldr r3, [r3, #0]
  22153. 8028d6e: 3301 adds r3, #1
  22154. 8028d70: d002 beq.n 8028d78 <prvTaskExitError+0x10>
  22155. 8028d72: f7ff ffd7 bl 8028d24 <ulPortSetInterruptMask>
  22156. 8028d76: e7fe b.n 8028d76 <prvTaskExitError+0xe>
  22157. portDISABLE_INTERRUPTS();
  22158. 8028d78: f7ff ffd4 bl 8028d24 <ulPortSetInterruptMask>
  22159. 8028d7c: e7fe b.n 8028d7c <prvTaskExitError+0x14>
  22160. 8028d7e: bf00 nop
  22161. 8028d80: 200015d8 .word 0x200015d8
  22162. 08028d84 <vPortClearInterruptMask>:
  22163. }
  22164. /*-----------------------------------------------------------*/
  22165. __attribute__(( naked )) void vPortClearInterruptMask( uint32_t ulNewMaskValue )
  22166. {
  22167. __asm volatile \
  22168. 8028d84: f380 8811 msr BASEPRI, r0
  22169. 8028d88: 4770 bx lr
  22170. 8028d8a: 0000 movs r0, r0
  22171. 08028d8c <vPortExitCritical>:
  22172. }
  22173. }
  22174. /*-----------------------------------------------------------*/
  22175. void vPortExitCritical( void )
  22176. {
  22177. 8028d8c: b508 push {r3, lr}
  22178. configASSERT( uxCriticalNesting );
  22179. 8028d8e: 4b07 ldr r3, [pc, #28] ; (8028dac <vPortExitCritical+0x20>)
  22180. 8028d90: 6818 ldr r0, [r3, #0]
  22181. 8028d92: b910 cbnz r0, 8028d9a <vPortExitCritical+0xe>
  22182. 8028d94: f7ff ffc6 bl 8028d24 <ulPortSetInterruptMask>
  22183. 8028d98: e7fe b.n 8028d98 <vPortExitCritical+0xc>
  22184. uxCriticalNesting--;
  22185. 8028d9a: 3801 subs r0, #1
  22186. 8028d9c: 6018 str r0, [r3, #0]
  22187. if( uxCriticalNesting == 0 )
  22188. 8028d9e: b918 cbnz r0, 8028da8 <vPortExitCritical+0x1c>
  22189. {
  22190. portENABLE_INTERRUPTS();
  22191. }
  22192. }
  22193. 8028da0: e8bd 4008 ldmia.w sp!, {r3, lr}
  22194. {
  22195. configASSERT( uxCriticalNesting );
  22196. uxCriticalNesting--;
  22197. if( uxCriticalNesting == 0 )
  22198. {
  22199. portENABLE_INTERRUPTS();
  22200. 8028da4: f7ff bfee b.w 8028d84 <vPortClearInterruptMask>
  22201. 8028da8: bd08 pop {r3, pc}
  22202. 8028daa: bf00 nop
  22203. 8028dac: 200015d8 .word 0x200015d8
  22204. 08028db0 <PendSV_Handler>:
  22205. void xPortPendSVHandler( void )
  22206. {
  22207. /* This is a naked function. */
  22208. __asm volatile
  22209. 8028db0: f3ef 8009 mrs r0, PSP
  22210. 8028db4: f3bf 8f6f isb sy
  22211. 8028db8: 4b0d ldr r3, [pc, #52] ; (8028df0 <pxCurrentTCBConst>)
  22212. 8028dba: 681a ldr r2, [r3, #0]
  22213. 8028dbc: e920 0ff0 stmdb r0!, {r4, r5, r6, r7, r8, r9, sl, fp}
  22214. 8028dc0: 6010 str r0, [r2, #0]
  22215. 8028dc2: e92d 4008 stmdb sp!, {r3, lr}
  22216. 8028dc6: f04f 0050 mov.w r0, #80 ; 0x50
  22217. 8028dca: f380 8811 msr BASEPRI, r0
  22218. 8028dce: f7ff fdf3 bl 80289b8 <vTaskSwitchContext>
  22219. 8028dd2: f04f 0000 mov.w r0, #0
  22220. 8028dd6: f380 8811 msr BASEPRI, r0
  22221. 8028dda: e8bd 4008 ldmia.w sp!, {r3, lr}
  22222. 8028dde: 6819 ldr r1, [r3, #0]
  22223. 8028de0: 6808 ldr r0, [r1, #0]
  22224. 8028de2: e8b0 0ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp}
  22225. 8028de6: f380 8809 msr PSP, r0
  22226. 8028dea: f3bf 8f6f isb sy
  22227. 8028dee: 4770 bx lr
  22228. 08028df0 <pxCurrentTCBConst>:
  22229. 8028df0: 2000298c .word 0x2000298c
  22230. 08028df4 <SysTick_Handler>:
  22231. );
  22232. }
  22233. /*-----------------------------------------------------------*/
  22234. void xPortSysTickHandler( void )
  22235. {
  22236. 8028df4: b508 push {r3, lr}
  22237. /* The SysTick runs at the lowest interrupt priority, so when this interrupt
  22238. executes all interrupts must be unmasked. There is therefore no need to
  22239. save and then restore the interrupt mask value as its value is already
  22240. known. */
  22241. ( void ) portSET_INTERRUPT_MASK_FROM_ISR();
  22242. 8028df6: f7ff ff95 bl 8028d24 <ulPortSetInterruptMask>
  22243. {
  22244. /* Increment the RTOS tick. */
  22245. if( xTaskIncrementTick() != pdFALSE )
  22246. 8028dfa: f7ff fc7f bl 80286fc <xTaskIncrementTick>
  22247. 8028dfe: b118 cbz r0, 8028e08 <SysTick_Handler+0x14>
  22248. {
  22249. /* A context switch is required. Context switching is performed in
  22250. the PendSV interrupt. Pend the PendSV interrupt. */
  22251. portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
  22252. 8028e00: 4b04 ldr r3, [pc, #16] ; (8028e14 <SysTick_Handler+0x20>)
  22253. 8028e02: f04f 5280 mov.w r2, #268435456 ; 0x10000000
  22254. 8028e06: 601a str r2, [r3, #0]
  22255. }
  22256. }
  22257. portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );
  22258. 8028e08: 2000 movs r0, #0
  22259. }
  22260. 8028e0a: e8bd 4008 ldmia.w sp!, {r3, lr}
  22261. /* A context switch is required. Context switching is performed in
  22262. the PendSV interrupt. Pend the PendSV interrupt. */
  22263. portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
  22264. }
  22265. }
  22266. portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );
  22267. 8028e0e: f7ff bfb9 b.w 8028d84 <vPortClearInterruptMask>
  22268. 8028e12: bf00 nop
  22269. 8028e14: e000ed04 .word 0xe000ed04
  22270. 08028e18 <vPortSetupTimerInterrupt>:
  22271. ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );
  22272. }
  22273. #endif /* configUSE_TICKLESS_IDLE */
  22274. /* Configure SysTick to interrupt at the requested rate. */
  22275. portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
  22276. 8028e18: 4b06 ldr r3, [pc, #24] ; (8028e34 <vPortSetupTimerInterrupt+0x1c>)
  22277. 8028e1a: 681a ldr r2, [r3, #0]
  22278. 8028e1c: f44f 737a mov.w r3, #1000 ; 0x3e8
  22279. 8028e20: fbb2 f2f3 udiv r2, r2, r3
  22280. 8028e24: 4b04 ldr r3, [pc, #16] ; (8028e38 <vPortSetupTimerInterrupt+0x20>)
  22281. 8028e26: 3a01 subs r2, #1
  22282. 8028e28: 601a str r2, [r3, #0]
  22283. portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );
  22284. 8028e2a: 2207 movs r2, #7
  22285. 8028e2c: f843 2c04 str.w r2, [r3, #-4]
  22286. 8028e30: 4770 bx lr
  22287. 8028e32: bf00 nop
  22288. 8028e34: 200005bc .word 0x200005bc
  22289. 8028e38: e000e014 .word 0xe000e014
  22290. 08028e3c <xPortStartScheduler>:
  22291. /*
  22292. * See header file for description.
  22293. */
  22294. BaseType_t xPortStartScheduler( void )
  22295. {
  22296. 8028e3c: b507 push {r0, r1, r2, lr}
  22297. functions can be called. ISR safe functions are those that end in
  22298. "FromISR". FreeRTOS maintains separate thread and ISR API functions to
  22299. ensure interrupt entry is as fast and simple as possible.
  22300. Save the interrupt priority value that is about to be clobbered. */
  22301. ulOriginalPriority = *pucFirstUserPriorityRegister;
  22302. 8028e3e: 4b1d ldr r3, [pc, #116] ; (8028eb4 <xPortStartScheduler+0x78>)
  22303. 8028e40: 781a ldrb r2, [r3, #0]
  22304. 8028e42: 9201 str r2, [sp, #4]
  22305. /* Determine the number of priority bits available. First write to all
  22306. possible bits. */
  22307. *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
  22308. 8028e44: 22ff movs r2, #255 ; 0xff
  22309. 8028e46: 701a strb r2, [r3, #0]
  22310. /* Read the value back to see how many bits stuck. */
  22311. ucMaxPriorityValue = *pucFirstUserPriorityRegister;
  22312. 8028e48: 781b ldrb r3, [r3, #0]
  22313. 8028e4a: f88d 3003 strb.w r3, [sp, #3]
  22314. /* Use the same mask on the maximum system call priority. */
  22315. ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
  22316. 8028e4e: f89d 2003 ldrb.w r2, [sp, #3]
  22317. 8028e52: 4b19 ldr r3, [pc, #100] ; (8028eb8 <xPortStartScheduler+0x7c>)
  22318. 8028e54: f002 0250 and.w r2, r2, #80 ; 0x50
  22319. 8028e58: 701a strb r2, [r3, #0]
  22320. /* Calculate the maximum acceptable priority group value for the number
  22321. of bits read back. */
  22322. ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
  22323. 8028e5a: 4a18 ldr r2, [pc, #96] ; (8028ebc <xPortStartScheduler+0x80>)
  22324. 8028e5c: 2307 movs r3, #7
  22325. 8028e5e: 6013 str r3, [r2, #0]
  22326. while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
  22327. 8028e60: e005 b.n 8028e6e <xPortStartScheduler+0x32>
  22328. {
  22329. ulMaxPRIGROUPValue--;
  22330. ucMaxPriorityValue <<= ( uint8_t ) 0x01;
  22331. 8028e62: f89d 3003 ldrb.w r3, [sp, #3]
  22332. 8028e66: 005b lsls r3, r3, #1
  22333. 8028e68: f88d 3003 strb.w r3, [sp, #3]
  22334. 8028e6c: 460b mov r3, r1
  22335. ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
  22336. /* Calculate the maximum acceptable priority group value for the number
  22337. of bits read back. */
  22338. ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
  22339. while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
  22340. 8028e6e: f89d 2003 ldrb.w r2, [sp, #3]
  22341. 8028e72: 1e59 subs r1, r3, #1
  22342. 8028e74: 0612 lsls r2, r2, #24
  22343. 8028e76: d4f4 bmi.n 8028e62 <xPortStartScheduler+0x26>
  22344. }
  22345. /* Shift the priority group value back to its position within the AIRCR
  22346. register. */
  22347. ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
  22348. ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
  22349. 8028e78: 4a10 ldr r2, [pc, #64] ; (8028ebc <xPortStartScheduler+0x80>)
  22350. ucMaxPriorityValue <<= ( uint8_t ) 0x01;
  22351. }
  22352. /* Shift the priority group value back to its position within the AIRCR
  22353. register. */
  22354. ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
  22355. 8028e7a: 021b lsls r3, r3, #8
  22356. ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
  22357. 8028e7c: f403 63e0 and.w r3, r3, #1792 ; 0x700
  22358. 8028e80: 6013 str r3, [r2, #0]
  22359. /* Restore the clobbered interrupt priority register to its original
  22360. value. */
  22361. *pucFirstUserPriorityRegister = ulOriginalPriority;
  22362. 8028e82: 4b0c ldr r3, [pc, #48] ; (8028eb4 <xPortStartScheduler+0x78>)
  22363. 8028e84: 9a01 ldr r2, [sp, #4]
  22364. 8028e86: 701a strb r2, [r3, #0]
  22365. }
  22366. #endif /* conifgASSERT_DEFINED */
  22367. /* Make PendSV and SysTick the lowest priority interrupts. */
  22368. portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
  22369. 8028e88: f8d3 2920 ldr.w r2, [r3, #2336] ; 0x920
  22370. 8028e8c: f442 0270 orr.w r2, r2, #15728640 ; 0xf00000
  22371. 8028e90: f8c3 2920 str.w r2, [r3, #2336] ; 0x920
  22372. portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
  22373. 8028e94: f8d3 2920 ldr.w r2, [r3, #2336] ; 0x920
  22374. 8028e98: f042 4270 orr.w r2, r2, #4026531840 ; 0xf0000000
  22375. 8028e9c: f8c3 2920 str.w r2, [r3, #2336] ; 0x920
  22376. /* Start the timer that generates the tick ISR. Interrupts are disabled
  22377. here already. */
  22378. vPortSetupTimerInterrupt();
  22379. 8028ea0: f7ff ffba bl 8028e18 <vPortSetupTimerInterrupt>
  22380. /* Initialise the critical nesting count ready for the first task. */
  22381. uxCriticalNesting = 0;
  22382. 8028ea4: 4b06 ldr r3, [pc, #24] ; (8028ec0 <xPortStartScheduler+0x84>)
  22383. 8028ea6: 2200 movs r2, #0
  22384. 8028ea8: 601a str r2, [r3, #0]
  22385. /* Start the first task. */
  22386. prvPortStartFirstTask();
  22387. 8028eaa: f7ff feff bl 8028cac <prvPortStartFirstTask>
  22388. /* Should never get here as the tasks will now be executing! Call the task
  22389. exit error function to prevent compiler warnings about a static function
  22390. not being called in the case that the application writer overrides this
  22391. functionality by defining configTASK_RETURN_ADDRESS. */
  22392. prvTaskExitError();
  22393. 8028eae: f7ff ff5b bl 8028d68 <prvTaskExitError>
  22394. 8028eb2: bf00 nop
  22395. 8028eb4: e000e400 .word 0xe000e400
  22396. 8028eb8: 200029d4 .word 0x200029d4
  22397. 8028ebc: 200029d8 .word 0x200029d8
  22398. 8028ec0: 200015d8 .word 0x200015d8
  22399. 08028ec4 <vPortValidateInterruptPriority>:
  22400. /*-----------------------------------------------------------*/
  22401. #if( configASSERT_DEFINED == 1 )
  22402. void vPortValidateInterruptPriority( void )
  22403. {
  22404. 8028ec4: b508 push {r3, lr}
  22405. uint32_t ulCurrentInterrupt;
  22406. uint8_t ucCurrentPriority;
  22407. /* Obtain the number of the currently executing interrupt. */
  22408. __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) );
  22409. 8028ec6: f3ef 8305 mrs r3, IPSR
  22410. /* Is the interrupt number a user defined interrupt? */
  22411. if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
  22412. 8028eca: 2b0f cmp r3, #15
  22413. 8028ecc: d908 bls.n 8028ee0 <vPortValidateInterruptPriority+0x1c>
  22414. {
  22415. /* Look up the interrupt's priority. */
  22416. ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];
  22417. 8028ece: 4a0a ldr r2, [pc, #40] ; (8028ef8 <vPortValidateInterruptPriority+0x34>)
  22418. 8028ed0: 5c9b ldrb r3, [r3, r2]
  22419. interrupt entry is as fast and simple as possible.
  22420. The following links provide detailed information:
  22421. http://www.freertos.org/RTOS-Cortex-M3-M4.html
  22422. http://www.freertos.org/FAQHelp.html */
  22423. configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
  22424. 8028ed2: 4a0a ldr r2, [pc, #40] ; (8028efc <vPortValidateInterruptPriority+0x38>)
  22425. 8028ed4: 7812 ldrb r2, [r2, #0]
  22426. 8028ed6: 429a cmp r2, r3
  22427. 8028ed8: d902 bls.n 8028ee0 <vPortValidateInterruptPriority+0x1c>
  22428. 8028eda: f7ff ff23 bl 8028d24 <ulPortSetInterruptMask>
  22429. 8028ede: e7fe b.n 8028ede <vPortValidateInterruptPriority+0x1a>
  22430. configuration then the correct setting can be achieved on all Cortex-M
  22431. devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
  22432. scheduler. Note however that some vendor specific peripheral libraries
  22433. assume a non-zero priority group setting, in which cases using a value
  22434. of zero will result in unpredicable behaviour. */
  22435. configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
  22436. 8028ee0: 4b07 ldr r3, [pc, #28] ; (8028f00 <vPortValidateInterruptPriority+0x3c>)
  22437. 8028ee2: 681a ldr r2, [r3, #0]
  22438. 8028ee4: 4b07 ldr r3, [pc, #28] ; (8028f04 <vPortValidateInterruptPriority+0x40>)
  22439. 8028ee6: 681b ldr r3, [r3, #0]
  22440. 8028ee8: f402 62e0 and.w r2, r2, #1792 ; 0x700
  22441. 8028eec: 429a cmp r2, r3
  22442. 8028eee: d902 bls.n 8028ef6 <vPortValidateInterruptPriority+0x32>
  22443. 8028ef0: f7ff ff18 bl 8028d24 <ulPortSetInterruptMask>
  22444. 8028ef4: e7fe b.n 8028ef4 <vPortValidateInterruptPriority+0x30>
  22445. 8028ef6: bd08 pop {r3, pc}
  22446. 8028ef8: e000e3f0 .word 0xe000e3f0
  22447. 8028efc: 200029d4 .word 0x200029d4
  22448. 8028f00: e000ed0c .word 0xe000ed0c
  22449. 8028f04: 200029d8 .word 0x200029d8
  22450. 08028f08 <prvInsertBlockIntoFreeList>:
  22451. xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 );
  22452. }
  22453. /*-----------------------------------------------------------*/
  22454. static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert )
  22455. {
  22456. 8028f08: b510 push {r4, lr}
  22457. BlockLink_t *pxIterator;
  22458. uint8_t *puc;
  22459. /* Iterate through the list until a block is found that has a higher address
  22460. than the block being inserted. */
  22461. for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )
  22462. 8028f0a: 4b0f ldr r3, [pc, #60] ; (8028f48 <prvInsertBlockIntoFreeList+0x40>)
  22463. 8028f0c: e000 b.n 8028f10 <prvInsertBlockIntoFreeList+0x8>
  22464. 8028f0e: 4613 mov r3, r2
  22465. 8028f10: 681a ldr r2, [r3, #0]
  22466. 8028f12: 4282 cmp r2, r0
  22467. 8028f14: d3fb bcc.n 8028f0e <prvInsertBlockIntoFreeList+0x6>
  22468. }
  22469. /* Do the block being inserted, and the block it is being inserted after
  22470. make a contiguous block of memory? */
  22471. puc = ( uint8_t * ) pxIterator;
  22472. if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
  22473. 8028f16: 6859 ldr r1, [r3, #4]
  22474. 8028f18: 185c adds r4, r3, r1
  22475. 8028f1a: 4284 cmp r4, r0
  22476. 8028f1c: d103 bne.n 8028f26 <prvInsertBlockIntoFreeList+0x1e>
  22477. {
  22478. pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
  22479. 8028f1e: 6840 ldr r0, [r0, #4]
  22480. 8028f20: 1841 adds r1, r0, r1
  22481. 8028f22: 6059 str r1, [r3, #4]
  22482. 8028f24: 4618 mov r0, r3
  22483. }
  22484. /* Do the block being inserted, and the block it is being inserted before
  22485. make a contiguous block of memory? */
  22486. puc = ( uint8_t * ) pxBlockToInsert;
  22487. if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
  22488. 8028f26: 6841 ldr r1, [r0, #4]
  22489. 8028f28: 1844 adds r4, r0, r1
  22490. 8028f2a: 4294 cmp r4, r2
  22491. 8028f2c: d106 bne.n 8028f3c <prvInsertBlockIntoFreeList+0x34>
  22492. {
  22493. if( pxIterator->pxNextFreeBlock != pxEnd )
  22494. 8028f2e: 4c07 ldr r4, [pc, #28] ; (8028f4c <prvInsertBlockIntoFreeList+0x44>)
  22495. 8028f30: 6824 ldr r4, [r4, #0]
  22496. 8028f32: 42a2 cmp r2, r4
  22497. 8028f34: d002 beq.n 8028f3c <prvInsertBlockIntoFreeList+0x34>
  22498. {
  22499. /* Form one big block from the two blocks. */
  22500. pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
  22501. pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;
  22502. 8028f36: ca14 ldmia r2, {r2, r4}
  22503. if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
  22504. {
  22505. if( pxIterator->pxNextFreeBlock != pxEnd )
  22506. {
  22507. /* Form one big block from the two blocks. */
  22508. pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
  22509. 8028f38: 1861 adds r1, r4, r1
  22510. 8028f3a: 6041 str r1, [r0, #4]
  22511. /* If the block being inserted plugged a gab, so was merged with the block
  22512. before and the block after, then it's pxNextFreeBlock pointer will have
  22513. already been set, and should not be set here as that would make it point
  22514. to itself. */
  22515. if( pxIterator != pxBlockToInsert )
  22516. 8028f3c: 4283 cmp r3, r0
  22517. pxBlockToInsert->pxNextFreeBlock = pxEnd;
  22518. }
  22519. }
  22520. else
  22521. {
  22522. pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;
  22523. 8028f3e: 6002 str r2, [r0, #0]
  22524. before and the block after, then it's pxNextFreeBlock pointer will have
  22525. already been set, and should not be set here as that would make it point
  22526. to itself. */
  22527. if( pxIterator != pxBlockToInsert )
  22528. {
  22529. pxIterator->pxNextFreeBlock = pxBlockToInsert;
  22530. 8028f40: bf18 it ne
  22531. 8028f42: 6018 strne r0, [r3, #0]
  22532. 8028f44: bd10 pop {r4, pc}
  22533. 8028f46: bf00 nop
  22534. 8028f48: 200029e4 .word 0x200029e4
  22535. 8028f4c: 200029e0 .word 0x200029e0
  22536. 08028f50 <pvPortMalloc>:
  22537. static size_t xBlockAllocatedBit = 0;
  22538. /*-----------------------------------------------------------*/
  22539. void *pvPortMalloc( size_t xWantedSize )
  22540. {
  22541. 8028f50: b5f8 push {r3, r4, r5, r6, r7, lr}
  22542. 8028f52: 4605 mov r5, r0
  22543. BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
  22544. void *pvReturn = NULL;
  22545. vTaskSuspendAll();
  22546. 8028f54: f7ff fbc4 bl 80286e0 <vTaskSuspendAll>
  22547. {
  22548. /* If this is the first call to malloc then the heap will require
  22549. initialisation to setup the list of free blocks. */
  22550. if( pxEnd == NULL )
  22551. 8028f58: 4b3a ldr r3, [pc, #232] ; (8029044 <pvPortMalloc+0xf4>)
  22552. 8028f5a: 681b ldr r3, [r3, #0]
  22553. 8028f5c: bb1b cbnz r3, 8028fa6 <pvPortMalloc+0x56>
  22554. uint8_t *pucAlignedHeap;
  22555. uint32_t ulAddress;
  22556. size_t xTotalHeapSize = configTOTAL_HEAP_SIZE;
  22557. /* Ensure the heap starts on a correctly aligned boundary. */
  22558. ulAddress = ( uint32_t ) ucHeap;
  22559. 8028f5e: 4a3a ldr r2, [pc, #232] ; (8029048 <pvPortMalloc+0xf8>)
  22560. if( ( ulAddress & portBYTE_ALIGNMENT_MASK ) != 0 )
  22561. 8028f60: 0756 lsls r6, r2, #29
  22562. 8028f62: d007 beq.n 8028f74 <pvPortMalloc+0x24>
  22563. {
  22564. ulAddress += ( portBYTE_ALIGNMENT - 1 );
  22565. 8028f64: 1dd3 adds r3, r2, #7
  22566. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  22567. 8028f66: f023 0307 bic.w r3, r3, #7
  22568. xTotalHeapSize -= ulAddress - ( uint32_t ) ucHeap;
  22569. 8028f6a: f502 4270 add.w r2, r2, #61440 ; 0xf000
  22570. 8028f6e: 1ad1 subs r1, r2, r3
  22571. ulAddress = ( uint32_t ) ucHeap;
  22572. if( ( ulAddress & portBYTE_ALIGNMENT_MASK ) != 0 )
  22573. {
  22574. ulAddress += ( portBYTE_ALIGNMENT - 1 );
  22575. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  22576. 8028f70: 461a mov r2, r3
  22577. 8028f72: e001 b.n 8028f78 <pvPortMalloc+0x28>
  22578. static void prvHeapInit( void )
  22579. {
  22580. BlockLink_t *pxFirstFreeBlock;
  22581. uint8_t *pucAlignedHeap;
  22582. uint32_t ulAddress;
  22583. size_t xTotalHeapSize = configTOTAL_HEAP_SIZE;
  22584. 8028f74: f44f 4170 mov.w r1, #61440 ; 0xf000
  22585. xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
  22586. xStart.xBlockSize = ( size_t ) 0;
  22587. /* pxEnd is used to mark the end of the list of free blocks and is inserted
  22588. at the end of the heap space. */
  22589. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  22590. 8028f78: 1851 adds r1, r2, r1
  22591. ulAddress -= xHeapStructSize;
  22592. 8028f7a: 3908 subs r1, #8
  22593. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  22594. 8028f7c: f021 0107 bic.w r1, r1, #7
  22595. pucAlignedHeap = ( uint8_t * ) ulAddress;
  22596. /* xStart is used to hold a pointer to the first item in the list of free
  22597. blocks. The void cast is used to prevent compiler warnings. */
  22598. xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
  22599. 8028f80: 4832 ldr r0, [pc, #200] ; (802904c <pvPortMalloc+0xfc>)
  22600. xStart.xBlockSize = ( size_t ) 0;
  22601. 8028f82: 2300 movs r3, #0
  22602. 8028f84: e880 000c stmia.w r0, {r2, r3}
  22603. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  22604. ulAddress -= xHeapStructSize;
  22605. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  22606. pxEnd = ( void * ) ulAddress;
  22607. pxEnd->xBlockSize = 0;
  22608. pxEnd->pxNextFreeBlock = NULL;
  22609. 8028f88: 600b str r3, [r1, #0]
  22610. at the end of the heap space. */
  22611. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  22612. ulAddress -= xHeapStructSize;
  22613. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  22614. pxEnd = ( void * ) ulAddress;
  22615. pxEnd->xBlockSize = 0;
  22616. 8028f8a: 604b str r3, [r1, #4]
  22617. pxEnd->pxNextFreeBlock = NULL;
  22618. /* To start with there is a single free block that is sized to take up the
  22619. entire heap space, minus the space taken by pxEnd. */
  22620. pxFirstFreeBlock = ( void * ) pucAlignedHeap;
  22621. pxFirstFreeBlock->xBlockSize = ulAddress - ( uint32_t ) pxFirstFreeBlock;
  22622. 8028f8c: 1a8b subs r3, r1, r2
  22623. pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
  22624. 8028f8e: e882 000a stmia.w r2, {r1, r3}
  22625. /* Only one block exists - and it covers the entire usable heap space. */
  22626. xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  22627. 8028f92: 4a2f ldr r2, [pc, #188] ; (8029050 <pvPortMalloc+0x100>)
  22628. /* pxEnd is used to mark the end of the list of free blocks and is inserted
  22629. at the end of the heap space. */
  22630. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  22631. ulAddress -= xHeapStructSize;
  22632. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  22633. pxEnd = ( void * ) ulAddress;
  22634. 8028f94: 482b ldr r0, [pc, #172] ; (8029044 <pvPortMalloc+0xf4>)
  22635. pxFirstFreeBlock = ( void * ) pucAlignedHeap;
  22636. pxFirstFreeBlock->xBlockSize = ulAddress - ( uint32_t ) pxFirstFreeBlock;
  22637. pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
  22638. /* Only one block exists - and it covers the entire usable heap space. */
  22639. xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  22640. 8028f96: 6013 str r3, [r2, #0]
  22641. xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  22642. 8028f98: 4a2e ldr r2, [pc, #184] ; (8029054 <pvPortMalloc+0x104>)
  22643. /* pxEnd is used to mark the end of the list of free blocks and is inserted
  22644. at the end of the heap space. */
  22645. ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize;
  22646. ulAddress -= xHeapStructSize;
  22647. ulAddress &= ~portBYTE_ALIGNMENT_MASK;
  22648. pxEnd = ( void * ) ulAddress;
  22649. 8028f9a: 6001 str r1, [r0, #0]
  22650. pxFirstFreeBlock->xBlockSize = ulAddress - ( uint32_t ) pxFirstFreeBlock;
  22651. pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
  22652. /* Only one block exists - and it covers the entire usable heap space. */
  22653. xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  22654. xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
  22655. 8028f9c: 6013 str r3, [r2, #0]
  22656. /* Work out the position of the top bit in a size_t variable. */
  22657. xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 );
  22658. 8028f9e: 4b2e ldr r3, [pc, #184] ; (8029058 <pvPortMalloc+0x108>)
  22659. 8028fa0: f04f 4200 mov.w r2, #2147483648 ; 0x80000000
  22660. 8028fa4: 601a str r2, [r3, #0]
  22661. /* Check the requested block size is not so large that the top bit is
  22662. set. The top bit of the block size member of the BlockLink_t structure
  22663. is used to determine who owns the block - the application or the
  22664. kernel, so it must be free. */
  22665. if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
  22666. 8028fa6: 4b2c ldr r3, [pc, #176] ; (8029058 <pvPortMalloc+0x108>)
  22667. 8028fa8: 681e ldr r6, [r3, #0]
  22668. 8028faa: 4235 tst r5, r6
  22669. 8028fac: d140 bne.n 8029030 <pvPortMalloc+0xe0>
  22670. {
  22671. /* The wanted size is increased so it can contain a BlockLink_t
  22672. structure in addition to the requested amount of bytes. */
  22673. if( xWantedSize > 0 )
  22674. 8028fae: 2d00 cmp r5, #0
  22675. 8028fb0: d03f beq.n 8029032 <pvPortMalloc+0xe2>
  22676. {
  22677. xWantedSize += xHeapStructSize;
  22678. 8028fb2: f105 0308 add.w r3, r5, #8
  22679. /* Ensure that blocks are always aligned to the required number
  22680. of bytes. */
  22681. if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 )
  22682. 8028fb6: 0758 lsls r0, r3, #29
  22683. {
  22684. /* Byte alignment required. */
  22685. xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );
  22686. 8028fb8: bf1c itt ne
  22687. 8028fba: f023 0307 bicne.w r3, r3, #7
  22688. 8028fbe: 3308 addne r3, #8
  22689. else
  22690. {
  22691. mtCOVERAGE_TEST_MARKER();
  22692. }
  22693. if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
  22694. 8028fc0: 2b00 cmp r3, #0
  22695. 8028fc2: d033 beq.n 802902c <pvPortMalloc+0xdc>
  22696. 8028fc4: 4a23 ldr r2, [pc, #140] ; (8029054 <pvPortMalloc+0x104>)
  22697. 8028fc6: 6817 ldr r7, [r2, #0]
  22698. 8028fc8: 42bb cmp r3, r7
  22699. 8028fca: d831 bhi.n 8029030 <pvPortMalloc+0xe0>
  22700. {
  22701. /* Traverse the list from the start (lowest address) block until
  22702. one of adequate size is found. */
  22703. pxPreviousBlock = &xStart;
  22704. pxBlock = xStart.pxNextFreeBlock;
  22705. 8028fcc: 4a1f ldr r2, [pc, #124] ; (802904c <pvPortMalloc+0xfc>)
  22706. 8028fce: 6814 ldr r4, [r2, #0]
  22707. while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
  22708. 8028fd0: e001 b.n 8028fd6 <pvPortMalloc+0x86>
  22709. 8028fd2: 4622 mov r2, r4
  22710. {
  22711. pxPreviousBlock = pxBlock;
  22712. pxBlock = pxBlock->pxNextFreeBlock;
  22713. 8028fd4: 4604 mov r4, r0
  22714. {
  22715. /* Traverse the list from the start (lowest address) block until
  22716. one of adequate size is found. */
  22717. pxPreviousBlock = &xStart;
  22718. pxBlock = xStart.pxNextFreeBlock;
  22719. while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
  22720. 8028fd6: 6861 ldr r1, [r4, #4]
  22721. 8028fd8: 4299 cmp r1, r3
  22722. 8028fda: d304 bcc.n 8028fe6 <pvPortMalloc+0x96>
  22723. pxBlock = pxBlock->pxNextFreeBlock;
  22724. }
  22725. /* If the end marker was reached then a block of adequate size
  22726. was not found. */
  22727. if( pxBlock != pxEnd )
  22728. 8028fdc: 4819 ldr r0, [pc, #100] ; (8029044 <pvPortMalloc+0xf4>)
  22729. 8028fde: 6800 ldr r0, [r0, #0]
  22730. 8028fe0: 4284 cmp r4, r0
  22731. 8028fe2: d104 bne.n 8028fee <pvPortMalloc+0x9e>
  22732. 8028fe4: e024 b.n 8029030 <pvPortMalloc+0xe0>
  22733. {
  22734. /* Traverse the list from the start (lowest address) block until
  22735. one of adequate size is found. */
  22736. pxPreviousBlock = &xStart;
  22737. pxBlock = xStart.pxNextFreeBlock;
  22738. while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
  22739. 8028fe6: 6820 ldr r0, [r4, #0]
  22740. 8028fe8: 2800 cmp r0, #0
  22741. 8028fea: d1f2 bne.n 8028fd2 <pvPortMalloc+0x82>
  22742. 8028fec: e7f6 b.n 8028fdc <pvPortMalloc+0x8c>
  22743. BlockLink_t structure at its start. */
  22744. pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
  22745. /* This block is being returned for use so must be taken out
  22746. of the list of free blocks. */
  22747. pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
  22748. 8028fee: 6820 ldr r0, [r4, #0]
  22749. was not found. */
  22750. if( pxBlock != pxEnd )
  22751. {
  22752. /* Return the memory space pointed to - jumping over the
  22753. BlockLink_t structure at its start. */
  22754. pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
  22755. 8028ff0: 6815 ldr r5, [r2, #0]
  22756. /* This block is being returned for use so must be taken out
  22757. of the list of free blocks. */
  22758. pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
  22759. 8028ff2: 6010 str r0, [r2, #0]
  22760. /* If the block is larger than required it can be split into
  22761. two. */
  22762. if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE )
  22763. 8028ff4: 1aca subs r2, r1, r3
  22764. was not found. */
  22765. if( pxBlock != pxEnd )
  22766. {
  22767. /* Return the memory space pointed to - jumping over the
  22768. BlockLink_t structure at its start. */
  22769. pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
  22770. 8028ff6: 3508 adds r5, #8
  22771. of the list of free blocks. */
  22772. pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
  22773. /* If the block is larger than required it can be split into
  22774. two. */
  22775. if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE )
  22776. 8028ff8: 2a10 cmp r2, #16
  22777. 8028ffa: d909 bls.n 8029010 <pvPortMalloc+0xc0>
  22778. {
  22779. /* This block is to be split into two. Create a new
  22780. block following the number of bytes requested. The void
  22781. cast is used to prevent byte alignment warnings from the
  22782. compiler. */
  22783. pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
  22784. 8028ffc: 18e0 adds r0, r4, r3
  22785. configASSERT( ( ( ( uint32_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 );
  22786. 8028ffe: 0741 lsls r1, r0, #29
  22787. 8029000: d002 beq.n 8029008 <pvPortMalloc+0xb8>
  22788. 8029002: f7ff fe8f bl 8028d24 <ulPortSetInterruptMask>
  22789. 8029006: e7fe b.n 8029006 <pvPortMalloc+0xb6>
  22790. /* Calculate the sizes of two blocks split from the
  22791. single block. */
  22792. pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
  22793. 8029008: 6042 str r2, [r0, #4]
  22794. pxBlock->xBlockSize = xWantedSize;
  22795. 802900a: 6063 str r3, [r4, #4]
  22796. /* Insert the new block into the list of free blocks. */
  22797. prvInsertBlockIntoFreeList( ( pxNewBlockLink ) );
  22798. 802900c: f7ff ff7c bl 8028f08 <prvInsertBlockIntoFreeList>
  22799. else
  22800. {
  22801. mtCOVERAGE_TEST_MARKER();
  22802. }
  22803. xFreeBytesRemaining -= pxBlock->xBlockSize;
  22804. 8029010: 6862 ldr r2, [r4, #4]
  22805. 8029012: 4910 ldr r1, [pc, #64] ; (8029054 <pvPortMalloc+0x104>)
  22806. 8029014: 1abb subs r3, r7, r2
  22807. 8029016: 600b str r3, [r1, #0]
  22808. if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
  22809. 8029018: 490d ldr r1, [pc, #52] ; (8029050 <pvPortMalloc+0x100>)
  22810. 802901a: 6808 ldr r0, [r1, #0]
  22811. 802901c: 4283 cmp r3, r0
  22812. {
  22813. xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
  22814. 802901e: bf38 it cc
  22815. 8029020: 600b strcc r3, [r1, #0]
  22816. mtCOVERAGE_TEST_MARKER();
  22817. }
  22818. /* The block is being returned - it is allocated and owned
  22819. by the application and has no "next" block. */
  22820. pxBlock->xBlockSize |= xBlockAllocatedBit;
  22821. 8029022: 4316 orrs r6, r2
  22822. pxBlock->pxNextFreeBlock = NULL;
  22823. 8029024: 2300 movs r3, #0
  22824. 8029026: e884 0048 stmia.w r4, {r3, r6}
  22825. 802902a: e002 b.n 8029032 <pvPortMalloc+0xe2>
  22826. /*-----------------------------------------------------------*/
  22827. void *pvPortMalloc( size_t xWantedSize )
  22828. {
  22829. BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
  22830. void *pvReturn = NULL;
  22831. 802902c: 461d mov r5, r3
  22832. 802902e: e000 b.n 8029032 <pvPortMalloc+0xe2>
  22833. 8029030: 2500 movs r5, #0
  22834. mtCOVERAGE_TEST_MARKER();
  22835. }
  22836. traceMALLOC( pvReturn, xWantedSize );
  22837. }
  22838. ( void ) xTaskResumeAll();
  22839. 8029032: f7ff fbf1 bl 8028818 <xTaskResumeAll>
  22840. mtCOVERAGE_TEST_MARKER();
  22841. }
  22842. }
  22843. #endif
  22844. configASSERT( ( ( ( uint32_t ) pvReturn ) & portBYTE_ALIGNMENT_MASK ) == 0 );
  22845. 8029036: 076b lsls r3, r5, #29
  22846. 8029038: d002 beq.n 8029040 <pvPortMalloc+0xf0>
  22847. 802903a: f7ff fe73 bl 8028d24 <ulPortSetInterruptMask>
  22848. 802903e: e7fe b.n 802903e <pvPortMalloc+0xee>
  22849. return pvReturn;
  22850. }
  22851. 8029040: 4628 mov r0, r5
  22852. 8029042: bdf8 pop {r3, r4, r5, r6, r7, pc}
  22853. 8029044: 200029e0 .word 0x200029e0
  22854. 8029048: 10000000 .word 0x10000000
  22855. 802904c: 200029e4 .word 0x200029e4
  22856. 8029050: 200029ec .word 0x200029ec
  22857. 8029054: 200029dc .word 0x200029dc
  22858. 8029058: 200029f0 .word 0x200029f0
  22859. 0802905c <vPortFree>:
  22860. /*-----------------------------------------------------------*/
  22861. void vPortFree( void *pv )
  22862. {
  22863. 802905c: b510 push {r4, lr}
  22864. uint8_t *puc = ( uint8_t * ) pv;
  22865. BlockLink_t *pxLink;
  22866. if( pv != NULL )
  22867. 802905e: 4604 mov r4, r0
  22868. 8029060: b310 cbz r0, 80290a8 <vPortFree+0x4c>
  22869. /* This casting is to keep the compiler from issuing warnings. */
  22870. pxLink = ( void * ) puc;
  22871. /* Check the block is actually allocated. */
  22872. configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
  22873. 8029062: 4a12 ldr r2, [pc, #72] ; (80290ac <vPortFree+0x50>)
  22874. 8029064: f850 3c04 ldr.w r3, [r0, #-4]
  22875. 8029068: 6812 ldr r2, [r2, #0]
  22876. 802906a: 421a tst r2, r3
  22877. 802906c: d102 bne.n 8029074 <vPortFree+0x18>
  22878. 802906e: f7ff fe59 bl 8028d24 <ulPortSetInterruptMask>
  22879. 8029072: e7fe b.n 8029072 <vPortFree+0x16>
  22880. configASSERT( pxLink->pxNextFreeBlock == NULL );
  22881. 8029074: f850 1c08 ldr.w r1, [r0, #-8]
  22882. 8029078: b111 cbz r1, 8029080 <vPortFree+0x24>
  22883. 802907a: f7ff fe53 bl 8028d24 <ulPortSetInterruptMask>
  22884. 802907e: e7fe b.n 802907e <vPortFree+0x22>
  22885. {
  22886. if( pxLink->pxNextFreeBlock == NULL )
  22887. {
  22888. /* The block is being returned to the heap - it is no longer
  22889. allocated. */
  22890. pxLink->xBlockSize &= ~xBlockAllocatedBit;
  22891. 8029080: ea23 0302 bic.w r3, r3, r2
  22892. 8029084: f840 3c04 str.w r3, [r0, #-4]
  22893. vTaskSuspendAll();
  22894. 8029088: f7ff fb2a bl 80286e0 <vTaskSuspendAll>
  22895. {
  22896. /* Add this block to the list of free blocks. */
  22897. xFreeBytesRemaining += pxLink->xBlockSize;
  22898. 802908c: 4b08 ldr r3, [pc, #32] ; (80290b0 <vPortFree+0x54>)
  22899. 802908e: f854 1c04 ldr.w r1, [r4, #-4]
  22900. 8029092: 681a ldr r2, [r3, #0]
  22901. traceFREE( pv, pxLink->xBlockSize );
  22902. prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
  22903. 8029094: f1a4 0008 sub.w r0, r4, #8
  22904. pxLink->xBlockSize &= ~xBlockAllocatedBit;
  22905. vTaskSuspendAll();
  22906. {
  22907. /* Add this block to the list of free blocks. */
  22908. xFreeBytesRemaining += pxLink->xBlockSize;
  22909. 8029098: 188a adds r2, r1, r2
  22910. 802909a: 601a str r2, [r3, #0]
  22911. traceFREE( pv, pxLink->xBlockSize );
  22912. prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
  22913. 802909c: f7ff ff34 bl 8028f08 <prvInsertBlockIntoFreeList>
  22914. else
  22915. {
  22916. mtCOVERAGE_TEST_MARKER();
  22917. }
  22918. }
  22919. }
  22920. 80290a0: e8bd 4010 ldmia.w sp!, {r4, lr}
  22921. /* Add this block to the list of free blocks. */
  22922. xFreeBytesRemaining += pxLink->xBlockSize;
  22923. traceFREE( pv, pxLink->xBlockSize );
  22924. prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
  22925. }
  22926. ( void ) xTaskResumeAll();
  22927. 80290a4: f7ff bbb8 b.w 8028818 <xTaskResumeAll>
  22928. 80290a8: bd10 pop {r4, pc}
  22929. 80290aa: bf00 nop
  22930. 80290ac: 200029f0 .word 0x200029f0
  22931. 80290b0: 200029dc .word 0x200029dc
  22932. 080290b4 <fs_open>:
  22933. * @param name : pointer to a file name
  22934. * @param file : pointer to a fs_file structure
  22935. * @retval 1 if success, 0 if fail
  22936. */
  22937. static int fs_open(char *name, struct fs_file *file)
  22938. {
  22939. 80290b4: b570 push {r4, r5, r6, lr}
  22940. struct fsdata_file_noconst *f;
  22941. for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)
  22942. 80290b6: 4c09 ldr r4, [pc, #36] ; (80290dc <fs_open+0x28>)
  22943. * @param name : pointer to a file name
  22944. * @param file : pointer to a fs_file structure
  22945. * @retval 1 if success, 0 if fail
  22946. */
  22947. static int fs_open(char *name, struct fs_file *file)
  22948. {
  22949. 80290b8: 4606 mov r6, r0
  22950. 80290ba: 460d mov r5, r1
  22951. struct fsdata_file_noconst *f;
  22952. for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)
  22953. {
  22954. if (!strcmp(name, f->name))
  22955. 80290bc: 4630 mov r0, r6
  22956. 80290be: 6861 ldr r1, [r4, #4]
  22957. 80290c0: f7f8 fc06 bl 80218d0 <strcmp>
  22958. 80290c4: b928 cbnz r0, 80290d2 <fs_open+0x1e>
  22959. {
  22960. file->data = f->data;
  22961. 80290c6: 68a3 ldr r3, [r4, #8]
  22962. 80290c8: 602b str r3, [r5, #0]
  22963. file->len = f->len;
  22964. 80290ca: 68e3 ldr r3, [r4, #12]
  22965. return 1;
  22966. 80290cc: 2001 movs r0, #1
  22967. for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)
  22968. {
  22969. if (!strcmp(name, f->name))
  22970. {
  22971. file->data = f->data;
  22972. file->len = f->len;
  22973. 80290ce: 606b str r3, [r5, #4]
  22974. return 1;
  22975. 80290d0: bd70 pop {r4, r5, r6, pc}
  22976. */
  22977. static int fs_open(char *name, struct fs_file *file)
  22978. {
  22979. struct fsdata_file_noconst *f;
  22980. for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)
  22981. 80290d2: 6824 ldr r4, [r4, #0]
  22982. 80290d4: 2c00 cmp r4, #0
  22983. 80290d6: d1f1 bne.n 80290bc <fs_open+0x8>
  22984. file->data = f->data;
  22985. file->len = f->len;
  22986. return 1;
  22987. }
  22988. }
  22989. return 0;
  22990. 80290d8: 4620 mov r0, r4
  22991. }
  22992. 80290da: bd70 pop {r4, r5, r6, pc}
  22993. 80290dc: 08037274 .word 0x08037274
  22994. 080290e0 <http_accept>:
  22995. * @param pcb: pointer to a tcp_pcb structure
  22996. * &param err: Lwip stack error code
  22997. * @retval err
  22998. */
  22999. static err_t http_accept(void *arg, struct tcp_pcb *pcb, err_t err)
  23000. {
  23001. 80290e0: b538 push {r3, r4, r5, lr}
  23002. struct http_state *hs;
  23003. /* Allocate memory for the structure that holds the state of the connection */
  23004. hs = mem_malloc(sizeof(struct http_state));
  23005. 80290e2: 2008 movs r0, #8
  23006. * @param pcb: pointer to a tcp_pcb structure
  23007. * &param err: Lwip stack error code
  23008. * @retval err
  23009. */
  23010. static err_t http_accept(void *arg, struct tcp_pcb *pcb, err_t err)
  23011. {
  23012. 80290e4: 460c mov r4, r1
  23013. struct http_state *hs;
  23014. /* Allocate memory for the structure that holds the state of the connection */
  23015. hs = mem_malloc(sizeof(struct http_state));
  23016. 80290e6: f001 ff09 bl 802aefc <mem_malloc>
  23017. if (hs == NULL)
  23018. 80290ea: 4601 mov r1, r0
  23019. 80290ec: b1a0 cbz r0, 8029118 <http_accept+0x38>
  23020. {
  23021. return ERR_MEM;
  23022. }
  23023. /* Initialize the structure. */
  23024. hs->file = NULL;
  23025. 80290ee: 2500 movs r5, #0
  23026. 80290f0: 6005 str r5, [r0, #0]
  23027. hs->left = 0;
  23028. 80290f2: 6045 str r5, [r0, #4]
  23029. /* Tell TCP that this is the structure we wish to be passed for our
  23030. callbacks. */
  23031. tcp_arg(pcb, hs);
  23032. 80290f4: 4620 mov r0, r4
  23033. 80290f6: f002 fb6f bl 802b7d8 <tcp_arg>
  23034. /* Tell TCP that we wish to be informed of incoming data by a call
  23035. to the http_recv() function. */
  23036. tcp_recv(pcb, http_recv);
  23037. 80290fa: 4620 mov r0, r4
  23038. 80290fc: 4908 ldr r1, [pc, #32] ; (8029120 <http_accept+0x40>)
  23039. 80290fe: f002 fb6d bl 802b7dc <tcp_recv>
  23040. tcp_err(pcb, conn_err);
  23041. 8029102: 4620 mov r0, r4
  23042. 8029104: 4907 ldr r1, [pc, #28] ; (8029124 <http_accept+0x44>)
  23043. 8029106: f002 fb6d bl 802b7e4 <tcp_err>
  23044. tcp_poll(pcb, http_poll, 10);
  23045. 802910a: 4620 mov r0, r4
  23046. 802910c: 4906 ldr r1, [pc, #24] ; (8029128 <http_accept+0x48>)
  23047. 802910e: 220a movs r2, #10
  23048. 8029110: f002 fb6d bl 802b7ee <tcp_poll>
  23049. return ERR_OK;
  23050. 8029114: 4628 mov r0, r5
  23051. 8029116: e000 b.n 802911a <http_accept+0x3a>
  23052. /* Allocate memory for the structure that holds the state of the connection */
  23053. hs = mem_malloc(sizeof(struct http_state));
  23054. if (hs == NULL)
  23055. {
  23056. return ERR_MEM;
  23057. 8029118: 20ff movs r0, #255 ; 0xff
  23058. tcp_err(pcb, conn_err);
  23059. tcp_poll(pcb, http_poll, 10);
  23060. return ERR_OK;
  23061. }
  23062. 802911a: b240 sxtb r0, r0
  23063. 802911c: bd38 pop {r3, r4, r5, pc}
  23064. 802911e: bf00 nop
  23065. 8029120: 08029675 .word 0x08029675
  23066. 8029124: 0802916f .word 0x0802916f
  23067. 8029128: 08029157 .word 0x08029157
  23068. 0802912c <send_data>:
  23069. * @param pcb: pointer to a tcp_pcb struct
  23070. * @param hs: pointer to a http_state struct
  23071. * @retval none
  23072. */
  23073. static void send_data(struct tcp_pcb *pcb, struct http_state *hs)
  23074. {
  23075. 802912c: b538 push {r3, r4, r5, lr}
  23076. err_t err;
  23077. u16_t len;
  23078. /* We cannot send more data than space available in the send
  23079. buffer */
  23080. if (tcp_sndbuf(pcb) < hs->left)
  23081. 802912e: 684b ldr r3, [r1, #4]
  23082. 8029130: f8b0 5066 ldrh.w r5, [r0, #102] ; 0x66
  23083. 8029134: 429d cmp r5, r3
  23084. {
  23085. len = tcp_sndbuf(pcb);
  23086. }
  23087. else
  23088. {
  23089. len = hs->left;
  23090. 8029136: bf28 it cs
  23091. 8029138: b29d uxthcs r5, r3
  23092. * @param pcb: pointer to a tcp_pcb struct
  23093. * @param hs: pointer to a http_state struct
  23094. * @retval none
  23095. */
  23096. static void send_data(struct tcp_pcb *pcb, struct http_state *hs)
  23097. {
  23098. 802913a: 460c mov r4, r1
  23099. }
  23100. else
  23101. {
  23102. len = hs->left;
  23103. }
  23104. err = tcp_write(pcb, hs->file, len, 0);
  23105. 802913c: 462a mov r2, r5
  23106. 802913e: 6809 ldr r1, [r1, #0]
  23107. 8029140: 2300 movs r3, #0
  23108. 8029142: f003 feae bl 802cea2 <tcp_write>
  23109. if (err == ERR_OK)
  23110. 8029146: b928 cbnz r0, 8029154 <send_data+0x28>
  23111. {
  23112. hs->file += len;
  23113. 8029148: 6823 ldr r3, [r4, #0]
  23114. 802914a: 195b adds r3, r3, r5
  23115. 802914c: 6023 str r3, [r4, #0]
  23116. hs->left -= len;
  23117. 802914e: 6863 ldr r3, [r4, #4]
  23118. 8029150: 1b5d subs r5, r3, r5
  23119. 8029152: 6065 str r5, [r4, #4]
  23120. 8029154: bd38 pop {r3, r4, r5, pc}
  23121. 08029156 <http_poll>:
  23122. * @param arg: pointer to an argument to be passed to callback function
  23123. * @param pcb: pointer on tcp_pcb structure
  23124. * @retval err_t
  23125. */
  23126. static err_t http_poll(void *arg, struct tcp_pcb *pcb)
  23127. {
  23128. 8029156: b508 push {r3, lr}
  23129. if (arg == NULL)
  23130. 8029158: 4603 mov r3, r0
  23131. {
  23132. tcp_close(pcb);
  23133. 802915a: 4608 mov r0, r1
  23134. * @param pcb: pointer on tcp_pcb structure
  23135. * @retval err_t
  23136. */
  23137. static err_t http_poll(void *arg, struct tcp_pcb *pcb)
  23138. {
  23139. if (arg == NULL)
  23140. 802915c: b913 cbnz r3, 8029164 <http_poll+0xe>
  23141. {
  23142. tcp_close(pcb);
  23143. 802915e: f002 fdd9 bl 802bd14 <tcp_close>
  23144. 8029162: e002 b.n 802916a <http_poll+0x14>
  23145. }
  23146. else
  23147. {
  23148. send_data(pcb, (struct http_state *)arg);
  23149. 8029164: 4619 mov r1, r3
  23150. 8029166: f7ff ffe1 bl 802912c <send_data>
  23151. }
  23152. return ERR_OK;
  23153. }
  23154. 802916a: 2000 movs r0, #0
  23155. 802916c: bd08 pop {r3, pc}
  23156. 0802916e <conn_err>:
  23157. static void conn_err(void *arg, err_t err)
  23158. {
  23159. struct http_state *hs;
  23160. hs = arg;
  23161. mem_free(hs);
  23162. 802916e: f001 bdfd b.w 802ad6c <mem_free>
  23163. 08029172 <close_conn>:
  23164. * @param pcb: pointer to a tcp_pcb struct
  23165. * @param hs: pointer to a http_state struct
  23166. * @retval
  23167. */
  23168. static void close_conn(struct tcp_pcb *pcb, struct http_state *hs)
  23169. {
  23170. 8029172: b538 push {r3, r4, r5, lr}
  23171. 8029174: 4604 mov r4, r0
  23172. 8029176: 460d mov r5, r1
  23173. tcp_arg(pcb, NULL);
  23174. 8029178: 2100 movs r1, #0
  23175. 802917a: f002 fb2d bl 802b7d8 <tcp_arg>
  23176. tcp_sent(pcb, NULL);
  23177. 802917e: 4620 mov r0, r4
  23178. 8029180: 2100 movs r1, #0
  23179. 8029182: f002 fb2d bl 802b7e0 <tcp_sent>
  23180. tcp_recv(pcb, NULL);
  23181. 8029186: 4620 mov r0, r4
  23182. 8029188: 2100 movs r1, #0
  23183. 802918a: f002 fb27 bl 802b7dc <tcp_recv>
  23184. mem_free(hs);
  23185. 802918e: 4628 mov r0, r5
  23186. 8029190: f001 fdec bl 802ad6c <mem_free>
  23187. tcp_close(pcb);
  23188. 8029194: 4620 mov r0, r4
  23189. }
  23190. 8029196: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  23191. {
  23192. tcp_arg(pcb, NULL);
  23193. tcp_sent(pcb, NULL);
  23194. tcp_recv(pcb, NULL);
  23195. mem_free(hs);
  23196. tcp_close(pcb);
  23197. 802919a: f002 bdbb b.w 802bd14 <tcp_close>
  23198. 0802919e <http_sent>:
  23199. * @param pcb: pointer on tcp_pcb structure
  23200. * @param len
  23201. * @retval err : LwIP error code
  23202. */
  23203. static err_t http_sent(void *arg, struct tcp_pcb *pcb, u16_t len)
  23204. {
  23205. 802919e: b508 push {r3, lr}
  23206. 80291a0: 4603 mov r3, r0
  23207. 80291a2: 4608 mov r0, r1
  23208. struct http_state *hs;
  23209. hs = arg;
  23210. if (hs->left > 0)
  23211. 80291a4: 685a ldr r2, [r3, #4]
  23212. {
  23213. send_data(pcb, hs);
  23214. 80291a6: 4619 mov r1, r3
  23215. {
  23216. struct http_state *hs;
  23217. hs = arg;
  23218. if (hs->left > 0)
  23219. 80291a8: b112 cbz r2, 80291b0 <http_sent+0x12>
  23220. {
  23221. send_data(pcb, hs);
  23222. 80291aa: f7ff ffbf bl 802912c <send_data>
  23223. 80291ae: e001 b.n 80291b4 <http_sent+0x16>
  23224. }
  23225. else
  23226. {
  23227. close_conn(pcb, hs);
  23228. 80291b0: f7ff ffdf bl 8029172 <close_conn>
  23229. }
  23230. return ERR_OK;
  23231. }
  23232. 80291b4: 2000 movs r0, #0
  23233. 80291b6: bd08 pop {r3, pc}
  23234. 080291b8 <HTTP_Init>:
  23235. * @brief Initialize the HTTP server (start its thread)
  23236. * @param none
  23237. * @retval None
  23238. */
  23239. void HTTP_Init()
  23240. {
  23241. 80291b8: b510 push {r4, lr}
  23242. //sys_thread_new("HTTP", http_server_netconn_thread, NULL, 3000, 2);
  23243. struct tcp_pcb *pcb;
  23244. /*create new pcb*/
  23245. pcb = tcp_new();
  23246. 80291ba: f002 fed9 bl 802bf70 <tcp_new>
  23247. /* bind HTTP traffic to pcb */
  23248. tcp_bind(pcb, IP_ADDR_ANY, 80);
  23249. 80291be: 2250 movs r2, #80 ; 0x50
  23250. void HTTP_Init()
  23251. {
  23252. //sys_thread_new("HTTP", http_server_netconn_thread, NULL, 3000, 2);
  23253. struct tcp_pcb *pcb;
  23254. /*create new pcb*/
  23255. pcb = tcp_new();
  23256. 80291c0: 4604 mov r4, r0
  23257. /* bind HTTP traffic to pcb */
  23258. tcp_bind(pcb, IP_ADDR_ANY, 80);
  23259. 80291c2: 4906 ldr r1, [pc, #24] ; (80291dc <HTTP_Init+0x24>)
  23260. 80291c4: f002 fa36 bl 802b634 <tcp_bind>
  23261. /* start listening on port 80 */
  23262. pcb = tcp_listen(pcb);
  23263. 80291c8: 21ff movs r1, #255 ; 0xff
  23264. 80291ca: 4620 mov r0, r4
  23265. 80291cc: f002 fa6a bl 802b6a4 <tcp_listen_with_backlog>
  23266. /* define callback function for TCP connection setup */
  23267. tcp_accept(pcb, http_accept);
  23268. 80291d0: 4903 ldr r1, [pc, #12] ; (80291e0 <HTTP_Init+0x28>)
  23269. }
  23270. 80291d2: e8bd 4010 ldmia.w sp!, {r4, lr}
  23271. /* bind HTTP traffic to pcb */
  23272. tcp_bind(pcb, IP_ADDR_ANY, 80);
  23273. /* start listening on port 80 */
  23274. pcb = tcp_listen(pcb);
  23275. /* define callback function for TCP connection setup */
  23276. tcp_accept(pcb, http_accept);
  23277. 80291d6: f002 bb08 b.w 802b7ea <tcp_accept>
  23278. 80291da: bf00 nop
  23279. 80291dc: 0803abfc .word 0x0803abfc
  23280. 80291e0: 080290e1 .word 0x080290e1
  23281. 080291e4 <HTTP_Progon>:
  23282. /**
  23283. * @brief Возвращает uptime, freq, dutycicle
  23284. */
  23285. void HTTP_Progon(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  23286. {
  23287. 80291e4: b538 push {r3, r4, r5, lr}
  23288. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  23289. 80291e6: f44f 62fa mov.w r2, #2000 ; 0x7d0
  23290. /**
  23291. * @brief Возвращает uptime, freq, dutycicle
  23292. */
  23293. void HTTP_Progon(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  23294. {
  23295. 80291ea: 460c mov r4, r1
  23296. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  23297. 80291ec: 4608 mov r0, r1
  23298. 80291ee: 2100 movs r1, #0
  23299. /**
  23300. * @brief Возвращает uptime, freq, dutycicle
  23301. */
  23302. void HTTP_Progon(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  23303. {
  23304. 80291f0: 461d mov r5, r3
  23305. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  23306. 80291f2: f7f8 fae1 bl 80217b8 <memset>
  23307. HTTP_GetProgonParams(bufOut);
  23308. 80291f6: 4620 mov r0, r4
  23309. 80291f8: f000 fe0c bl 8029e14 <HTTP_GetProgonParams>
  23310. *lenBufOut = strlen(bufOut);
  23311. 80291fc: 4620 mov r0, r4
  23312. 80291fe: f7f8 fcb3 bl 8021b68 <strlen>
  23313. 8029202: 8028 strh r0, [r5, #0]
  23314. 8029204: bd38 pop {r3, r4, r5, pc}
  23315. 8029206: 0000 movs r0, r0
  23316. 08029208 <GetParamValue>:
  23317. /**
  23318. * @brief
  23319. * @retval None
  23320. */
  23321. uint8_t GetParamValue(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen)
  23322. {
  23323. 8029208: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  23324. 802920c: 4690 mov r8, r2
  23325. 802920e: 461f mov r7, r3
  23326. char *beginValue = 0;
  23327. char *endValue = 0;
  23328. int len = 0;
  23329. char *strPtr = 0;
  23330. strPtr = strstr(inStr, paramName);
  23331. 8029210: f7f8 ff2a bl 8022068 <strstr>
  23332. if (strPtr != 0)
  23333. 8029214: 4605 mov r5, r0
  23334. 8029216: b1e0 cbz r0, 8029252 <GetParamValue+0x4a>
  23335. {
  23336. beginValue = strpbrk(strPtr,"=");
  23337. 8029218: 490f ldr r1, [pc, #60] ; (8029258 <GetParamValue+0x50>)
  23338. 802921a: f7f8 fd8f bl 8021d3c <strpbrk>
  23339. endValue = strpbrk(strPtr,"&");
  23340. 802921e: 490f ldr r1, [pc, #60] ; (802925c <GetParamValue+0x54>)
  23341. strPtr = strstr(inStr, paramName);
  23342. if (strPtr != 0)
  23343. {
  23344. beginValue = strpbrk(strPtr,"=");
  23345. 8029220: 4606 mov r6, r0
  23346. endValue = strpbrk(strPtr,"&");
  23347. 8029222: 4628 mov r0, r5
  23348. 8029224: f7f8 fd8a bl 8021d3c <strpbrk>
  23349. if (endValue == 0)
  23350. 8029228: 4604 mov r4, r0
  23351. 802922a: b920 cbnz r0, 8029236 <GetParamValue+0x2e>
  23352. endValue = strpbrk(strPtr," ");
  23353. 802922c: 4628 mov r0, r5
  23354. 802922e: 490c ldr r1, [pc, #48] ; (8029260 <GetParamValue+0x58>)
  23355. 8029230: f7f8 fd84 bl 8021d3c <strpbrk>
  23356. 8029234: 4604 mov r4, r0
  23357. len = endValue - beginValue - 1;
  23358. 8029236: 1ba5 subs r5, r4, r6
  23359. 8029238: 3d01 subs r5, #1
  23360. strncpy(paramValue, beginValue + 1, len);
  23361. 802923a: 4640 mov r0, r8
  23362. 802923c: 1c71 adds r1, r6, #1
  23363. 802923e: 462a mov r2, r5
  23364. 8029240: f7f8 fd4a bl 8021cd8 <strncpy>
  23365. *endValue = '0';
  23366. 8029244: 2330 movs r3, #48 ; 0x30
  23367. 8029246: 7023 strb r3, [r4, #0]
  23368. *beginValue = '0';
  23369. *paramLen = len;
  23370. return 1;
  23371. 8029248: 2001 movs r0, #1
  23372. if (endValue == 0)
  23373. endValue = strpbrk(strPtr," ");
  23374. len = endValue - beginValue - 1;
  23375. strncpy(paramValue, beginValue + 1, len);
  23376. *endValue = '0';
  23377. *beginValue = '0';
  23378. 802924a: 7033 strb r3, [r6, #0]
  23379. *paramLen = len;
  23380. 802924c: 703d strb r5, [r7, #0]
  23381. return 1;
  23382. 802924e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  23383. }
  23384. else
  23385. {
  23386. *paramLen = 0;
  23387. 8029252: 7038 strb r0, [r7, #0]
  23388. return 0;
  23389. }
  23390. }
  23391. 8029254: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  23392. 8029258: 080370e1 .word 0x080370e1
  23393. 802925c: 08037091 .word 0x08037091
  23394. 8029260: 08033ec0 .word 0x08033ec0
  23395. 08029264 <HTTP_ConfirmBootPwd>:
  23396. /**
  23397. * @brief Проверка пароля для перехода в режим bootloader
  23398. * @retval None
  23399. */
  23400. void HTTP_ConfirmBootPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  23401. {
  23402. 8029264: b530 push {r4, r5, lr}
  23403. 8029266: 4602 mov r2, r0
  23404. 8029268: b095 sub sp, #84 ; 0x54
  23405. 802926a: 460c mov r4, r1
  23406. char tempStr[50];
  23407. strncpy(tempStr, bufIn, 50);
  23408. 802926c: a807 add r0, sp, #28
  23409. 802926e: 4611 mov r1, r2
  23410. 8029270: 2232 movs r2, #50 ; 0x32
  23411. /**
  23412. * @brief Проверка пароля для перехода в режим bootloader
  23413. * @retval None
  23414. */
  23415. void HTTP_ConfirmBootPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  23416. {
  23417. 8029272: 461d mov r5, r3
  23418. char tempStr[50];
  23419. strncpy(tempStr, bufIn, 50);
  23420. 8029274: f7f8 fd30 bl 8021cd8 <strncpy>
  23421. char value[20];
  23422. uint8_t valueLen;
  23423. memset(value, 0, 20);
  23424. 8029278: 2100 movs r1, #0
  23425. 802927a: 2214 movs r2, #20
  23426. 802927c: a802 add r0, sp, #8
  23427. 802927e: f7f8 fa9b bl 80217b8 <memset>
  23428. if (GetParamValue(tempStr, "password=", value, &valueLen))
  23429. 8029282: a807 add r0, sp, #28
  23430. 8029284: 490b ldr r1, [pc, #44] ; (80292b4 <HTTP_ConfirmBootPwd+0x50>)
  23431. 8029286: aa02 add r2, sp, #8
  23432. 8029288: f10d 0307 add.w r3, sp, #7
  23433. 802928c: f7ff ffbc bl 8029208 <GetParamValue>
  23434. 8029290: b170 cbz r0, 80292b0 <HTTP_ConfirmBootPwd+0x4c>
  23435. {
  23436. if (strcmp(BOOTLOADER_PASWORD, value) == 0)
  23437. 8029292: 4809 ldr r0, [pc, #36] ; (80292b8 <HTTP_ConfirmBootPwd+0x54>)
  23438. 8029294: a902 add r1, sp, #8
  23439. 8029296: f7f8 fb1b bl 80218d0 <strcmp>
  23440. 802929a: b928 cbnz r0, 80292a8 <HTTP_ConfirmBootPwd+0x44>
  23441. {
  23442. *bufOut = '1';
  23443. 802929c: 2331 movs r3, #49 ; 0x31
  23444. 802929e: 7023 strb r3, [r4, #0]
  23445. /* Запускаем задачу отложенной перезагрузки. Контроллер должен успеть
  23446. отправить ответ серверу о статусе пароля */
  23447. HTTP_StartResetTask(true);
  23448. 80292a0: 2001 movs r0, #1
  23449. 80292a2: f000 fdfb bl 8029e9c <HTTP_StartResetTask>
  23450. 80292a6: e001 b.n 80292ac <HTTP_ConfirmBootPwd+0x48>
  23451. }
  23452. else
  23453. *bufOut = '0';
  23454. 80292a8: 2330 movs r3, #48 ; 0x30
  23455. 80292aa: 7023 strb r3, [r4, #0]
  23456. *lenBufOut = 1;
  23457. 80292ac: 2301 movs r3, #1
  23458. 80292ae: 802b strh r3, [r5, #0]
  23459. }
  23460. }
  23461. 80292b0: b015 add sp, #84 ; 0x54
  23462. 80292b2: bd30 pop {r4, r5, pc}
  23463. 80292b4: 08037093 .word 0x08037093
  23464. 80292b8: 0803709d .word 0x0803709d
  23465. 080292bc <ClearParamString>:
  23466. }
  23467. }
  23468. */
  23469. void ClearParamString(char *inBuf)
  23470. {
  23471. 80292bc: b510 push {r4, lr}
  23472. uint16_t len;
  23473. char *str;
  23474. str = strstr(inBuf, "HTTP");
  23475. 80292be: 4908 ldr r1, [pc, #32] ; (80292e0 <ClearParamString+0x24>)
  23476. }
  23477. }
  23478. */
  23479. void ClearParamString(char *inBuf)
  23480. {
  23481. 80292c0: 4604 mov r4, r0
  23482. uint16_t len;
  23483. char *str;
  23484. str = strstr(inBuf, "HTTP");
  23485. 80292c2: f7f8 fed1 bl 8022068 <strstr>
  23486. if (str != 0)
  23487. 80292c6: b148 cbz r0, 80292dc <ClearParamString+0x20>
  23488. {
  23489. len = str - inBuf;
  23490. 80292c8: 1b02 subs r2, r0, r4
  23491. memset(str, 0, RECIVE_BUF_MAX_LEN - len - 1);
  23492. 80292ca: b292 uxth r2, r2
  23493. 80292cc: f5c2 62bb rsb r2, r2, #1496 ; 0x5d8
  23494. 80292d0: 2100 movs r1, #0
  23495. 80292d2: 3203 adds r2, #3
  23496. }
  23497. }
  23498. 80292d4: e8bd 4010 ldmia.w sp!, {r4, lr}
  23499. str = strstr(inBuf, "HTTP");
  23500. if (str != 0)
  23501. {
  23502. len = str - inBuf;
  23503. memset(str, 0, RECIVE_BUF_MAX_LEN - len - 1);
  23504. 80292d8: f7f8 ba6e b.w 80217b8 <memset>
  23505. 80292dc: bd10 pop {r4, pc}
  23506. 80292de: bf00 nop
  23507. 80292e0: 080370a6 .word 0x080370a6
  23508. 080292e4 <HTTP_SetSettings>:
  23509. /**
  23510. * @brief
  23511. * @retval None
  23512. */
  23513. void HTTP_SetSettings(char *buf, uint16_t lenBuf)
  23514. {
  23515. 80292e4: b530 push {r4, r5, lr}
  23516. 80292e6: b087 sub sp, #28
  23517. uint8_t valueLen = 0;
  23518. 80292e8: 2400 movs r4, #0
  23519. /**
  23520. * @brief
  23521. * @retval None
  23522. */
  23523. void HTTP_SetSettings(char *buf, uint16_t lenBuf)
  23524. {
  23525. 80292ea: 4605 mov r5, r0
  23526. uint8_t valueLen = 0;
  23527. 80292ec: f88d 4003 strb.w r4, [sp, #3]
  23528. const uint8_t len = 20;
  23529. char value[20];
  23530. //printf(buf);
  23531. ClearParamString(buf);
  23532. 80292f0: f7ff ffe4 bl 80292bc <ClearParamString>
  23533. memset(value, 0, len);
  23534. 80292f4: 4621 mov r1, r4
  23535. 80292f6: 2214 movs r2, #20
  23536. 80292f8: a801 add r0, sp, #4
  23537. 80292fa: f7f8 fa5d bl 80217b8 <memset>
  23538. /* SNMP */
  23539. GetParamValue(buf, "read_community=", value, &valueLen);
  23540. 80292fe: f10d 0303 add.w r3, sp, #3
  23541. 8029302: 4956 ldr r1, [pc, #344] ; (802945c <HTTP_SetSettings+0x178>)
  23542. 8029304: aa01 add r2, sp, #4
  23543. 8029306: 4628 mov r0, r5
  23544. 8029308: f7ff ff7e bl 8029208 <GetParamValue>
  23545. SetReadCommunity(value);
  23546. 802930c: a801 add r0, sp, #4
  23547. 802930e: f7fe f977 bl 8027600 <SetReadCommunity>
  23548. memset(value, 0, len);
  23549. 8029312: 4621 mov r1, r4
  23550. 8029314: 2214 movs r2, #20
  23551. 8029316: a801 add r0, sp, #4
  23552. 8029318: f7f8 fa4e bl 80217b8 <memset>
  23553. GetParamValue(buf, "write_community=", value, &valueLen);
  23554. 802931c: f10d 0303 add.w r3, sp, #3
  23555. 8029320: 494f ldr r1, [pc, #316] ; (8029460 <HTTP_SetSettings+0x17c>)
  23556. 8029322: aa01 add r2, sp, #4
  23557. 8029324: 4628 mov r0, r5
  23558. 8029326: f7ff ff6f bl 8029208 <GetParamValue>
  23559. SetWriteCommunity(value);
  23560. 802932a: a801 add r0, sp, #4
  23561. 802932c: f7fe f96e bl 802760c <SetWriteCommunity>
  23562. memset(value, 0, len);
  23563. 8029330: 4621 mov r1, r4
  23564. 8029332: 2214 movs r2, #20
  23565. 8029334: a801 add r0, sp, #4
  23566. 8029336: f7f8 fa3f bl 80217b8 <memset>
  23567. GetParamValue(buf, "managerIP=", value, &valueLen);
  23568. 802933a: f10d 0303 add.w r3, sp, #3
  23569. 802933e: 4949 ldr r1, [pc, #292] ; (8029464 <HTTP_SetSettings+0x180>)
  23570. 8029340: aa01 add r2, sp, #4
  23571. 8029342: 4628 mov r0, r5
  23572. 8029344: f7ff ff60 bl 8029208 <GetParamValue>
  23573. SetManagerIp(value);
  23574. 8029348: a801 add r0, sp, #4
  23575. 802934a: f7fe f965 bl 8027618 <SetManagerIp>
  23576. memset(value, 0, len);
  23577. 802934e: 4621 mov r1, r4
  23578. 8029350: 2214 movs r2, #20
  23579. 8029352: a801 add r0, sp, #4
  23580. 8029354: f7f8 fa30 bl 80217b8 <memset>
  23581. GetParamValue(buf, "managerIP2=", value, &valueLen);
  23582. 8029358: f10d 0303 add.w r3, sp, #3
  23583. 802935c: 4942 ldr r1, [pc, #264] ; (8029468 <HTTP_SetSettings+0x184>)
  23584. 802935e: aa01 add r2, sp, #4
  23585. 8029360: 4628 mov r0, r5
  23586. 8029362: f7ff ff51 bl 8029208 <GetParamValue>
  23587. SetManagerIp2(value);
  23588. 8029366: a801 add r0, sp, #4
  23589. 8029368: f7fe f964 bl 8027634 <SetManagerIp2>
  23590. memset(value, 0, len);
  23591. 802936c: 4621 mov r1, r4
  23592. 802936e: 2214 movs r2, #20
  23593. 8029370: a801 add r0, sp, #4
  23594. 8029372: f7f8 fa21 bl 80217b8 <memset>
  23595. GetParamValue(buf, "managerIP3=", value, &valueLen);
  23596. 8029376: f10d 0303 add.w r3, sp, #3
  23597. 802937a: 493c ldr r1, [pc, #240] ; (802946c <HTTP_SetSettings+0x188>)
  23598. 802937c: aa01 add r2, sp, #4
  23599. 802937e: 4628 mov r0, r5
  23600. 8029380: f7ff ff42 bl 8029208 <GetParamValue>
  23601. SetManagerIp3(value);
  23602. 8029384: a801 add r0, sp, #4
  23603. 8029386: f7fe f963 bl 8027650 <SetManagerIp3>
  23604. memset(value, 0, len);
  23605. 802938a: 4621 mov r1, r4
  23606. 802938c: 2214 movs r2, #20
  23607. 802938e: a801 add r0, sp, #4
  23608. 8029390: f7f8 fa12 bl 80217b8 <memset>
  23609. /* Сетевые параметры */
  23610. GetParamValue(buf, "dhcp=", value, &valueLen);
  23611. 8029394: 4936 ldr r1, [pc, #216] ; (8029470 <HTTP_SetSettings+0x18c>)
  23612. 8029396: aa01 add r2, sp, #4
  23613. 8029398: f10d 0303 add.w r3, sp, #3
  23614. 802939c: 4628 mov r0, r5
  23615. 802939e: f7ff ff33 bl 8029208 <GetParamValue>
  23616. SetDhcpStateStr(value);
  23617. 80293a2: a801 add r0, sp, #4
  23618. 80293a4: f7fe f91a bl 80275dc <SetDhcpStateStr>
  23619. if (strncmp(value, "on", 2) != 0) // Если dhcp off устанавливаем параметры
  23620. 80293a8: a801 add r0, sp, #4
  23621. 80293aa: 4932 ldr r1, [pc, #200] ; (8029474 <HTTP_SetSettings+0x190>)
  23622. 80293ac: 2202 movs r2, #2
  23623. 80293ae: f7f8 fc3d bl 8021c2c <strncmp>
  23624. 80293b2: 2800 cmp r0, #0
  23625. 80293b4: d031 beq.n 802941a <HTTP_SetSettings+0x136>
  23626. {
  23627. memset(value, 0, len);
  23628. 80293b6: 4621 mov r1, r4
  23629. 80293b8: 2214 movs r2, #20
  23630. 80293ba: a801 add r0, sp, #4
  23631. 80293bc: f7f8 f9fc bl 80217b8 <memset>
  23632. GetParamValue(buf, "ipaddr=", value, &valueLen);
  23633. 80293c0: f10d 0303 add.w r3, sp, #3
  23634. 80293c4: 492c ldr r1, [pc, #176] ; (8029478 <HTTP_SetSettings+0x194>)
  23635. 80293c6: aa01 add r2, sp, #4
  23636. 80293c8: 4628 mov r0, r5
  23637. 80293ca: f7ff ff1d bl 8029208 <GetParamValue>
  23638. SetIPStr(value);
  23639. 80293ce: a801 add r0, sp, #4
  23640. 80293d0: f7fe f8f2 bl 80275b8 <SetIPStr>
  23641. memset(value, 0, len);
  23642. 80293d4: 4621 mov r1, r4
  23643. 80293d6: 2214 movs r2, #20
  23644. 80293d8: a801 add r0, sp, #4
  23645. 80293da: f7f8 f9ed bl 80217b8 <memset>
  23646. GetParamValue(buf, "gw=", value, &valueLen);
  23647. 80293de: f10d 0303 add.w r3, sp, #3
  23648. 80293e2: 4926 ldr r1, [pc, #152] ; (802947c <HTTP_SetSettings+0x198>)
  23649. 80293e4: aa01 add r2, sp, #4
  23650. 80293e6: 4628 mov r0, r5
  23651. 80293e8: f7ff ff0e bl 8029208 <GetParamValue>
  23652. SetGatewayStr(value);
  23653. 80293ec: a801 add r0, sp, #4
  23654. 80293ee: f7fe f8e9 bl 80275c4 <SetGatewayStr>
  23655. memset(value, 0, len);
  23656. 80293f2: 4621 mov r1, r4
  23657. 80293f4: 2214 movs r2, #20
  23658. 80293f6: a801 add r0, sp, #4
  23659. 80293f8: f7f8 f9de bl 80217b8 <memset>
  23660. GetParamValue(buf, "mask=", value, &valueLen);
  23661. 80293fc: 4920 ldr r1, [pc, #128] ; (8029480 <HTTP_SetSettings+0x19c>)
  23662. 80293fe: aa01 add r2, sp, #4
  23663. 8029400: f10d 0303 add.w r3, sp, #3
  23664. 8029404: 4628 mov r0, r5
  23665. 8029406: f7ff feff bl 8029208 <GetParamValue>
  23666. SetMaskStr(value);
  23667. 802940a: a801 add r0, sp, #4
  23668. 802940c: f7fe f8e0 bl 80275d0 <SetMaskStr>
  23669. memset(value, 0, len);
  23670. 8029410: a801 add r0, sp, #4
  23671. 8029412: 4621 mov r1, r4
  23672. 8029414: 2214 movs r2, #20
  23673. 8029416: f7f8 f9cf bl 80217b8 <memset>
  23674. }
  23675. memset(value, 0, len);
  23676. 802941a: 2100 movs r1, #0
  23677. 802941c: 2214 movs r2, #20
  23678. 802941e: a801 add r0, sp, #4
  23679. 8029420: f7f8 f9ca bl 80217b8 <memset>
  23680. /* Если параметры WEB изменились выставляем флаг, сохраняем настройки и перезагружаемся */
  23681. if (GetStateWebReinit() == true)
  23682. 8029424: f009 fd2c bl 8032e80 <GetStateWebReinit>
  23683. 8029428: b1a0 cbz r0, 8029454 <HTTP_SetSettings+0x170>
  23684. {
  23685. SetWebReinitFlag(true);
  23686. 802942a: 2001 movs r0, #1
  23687. 802942c: f7fe f8b8 bl 80275a0 <SetWebReinitFlag>
  23688. HTTP_SaveSettings();
  23689. 8029430: f000 fd2b bl 8029e8a <HTTP_SaveSettings>
  23690. /* Блокируем управление ключем на тау секунд*/
  23691. //IO_KeyBlockOn();
  23692. vTaskDelay(1010);
  23693. 8029434: f240 30f2 movw r0, #1010 ; 0x3f2
  23694. 8029438: f7ff fa8c bl 8028954 <vTaskDelay>
  23695. 802943c: f3bf 8f4f dsb sy
  23696. (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
  23697. 8029440: 4a10 ldr r2, [pc, #64] ; (8029484 <HTTP_SetSettings+0x1a0>)
  23698. 8029442: 4b11 ldr r3, [pc, #68] ; (8029488 <HTTP_SetSettings+0x1a4>)
  23699. 8029444: 68d1 ldr r1, [r2, #12]
  23700. 8029446: f401 61e0 and.w r1, r1, #1792 ; 0x700
  23701. 802944a: 430b orrs r3, r1
  23702. __STATIC_INLINE void NVIC_SystemReset(void)
  23703. //static inline void NVIC_SystemReset(void)
  23704. {
  23705. __DSB(); /* Ensure all outstanding memory accesses included
  23706. buffered write are completed before reset */
  23707. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  23708. 802944c: 60d3 str r3, [r2, #12]
  23709. 802944e: f3bf 8f4f dsb sy
  23710. 8029452: e7fe b.n 8029452 <HTTP_SetSettings+0x16e>
  23711. NVIC_SystemReset();
  23712. }
  23713. HTTP_SaveSettings();
  23714. 8029454: f000 fd19 bl 8029e8a <HTTP_SaveSettings>
  23715. }
  23716. 8029458: b007 add sp, #28
  23717. 802945a: bd30 pop {r4, r5, pc}
  23718. 802945c: 080370ab .word 0x080370ab
  23719. 8029460: 080370bb .word 0x080370bb
  23720. 8029464: 080370cc .word 0x080370cc
  23721. 8029468: 080370d7 .word 0x080370d7
  23722. 802946c: 080370e3 .word 0x080370e3
  23723. 8029470: 080370ef .word 0x080370ef
  23724. 8029474: 08033e52 .word 0x08033e52
  23725. 8029478: 080370f5 .word 0x080370f5
  23726. 802947c: 080370fd .word 0x080370fd
  23727. 8029480: 08037101 .word 0x08037101
  23728. 8029484: e000ed00 .word 0xe000ed00
  23729. 8029488: 05fa0004 .word 0x05fa0004
  23730. 0802948c <HTTP_SettingsPage>:
  23731. /**
  23732. * @brief
  23733. * @retval None
  23734. */
  23735. int HTTP_SettingsPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  23736. {
  23737. 802948c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  23738. 8029490: 4606 mov r6, r0
  23739. 8029492: b088 sub sp, #32
  23740. 8029494: 460c mov r4, r1
  23741. 8029496: 4690 mov r8, r2
  23742. char tempStr[30];
  23743. strncpy(tempStr, bufIn, 30);
  23744. 8029498: 4631 mov r1, r6
  23745. 802949a: 221e movs r2, #30
  23746. 802949c: 4668 mov r0, sp
  23747. /**
  23748. * @brief
  23749. * @retval None
  23750. */
  23751. int HTTP_SettingsPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  23752. {
  23753. 802949e: 461f mov r7, r3
  23754. char tempStr[30];
  23755. strncpy(tempStr, bufIn, 30);
  23756. 80294a0: f7f8 fc1a bl 8021cd8 <strncpy>
  23757. /* В запросе нет параметров, нужно формировать JSON ответ */
  23758. if (strpbrk(tempStr,"?") == 0)
  23759. 80294a4: 4668 mov r0, sp
  23760. 80294a6: 490e ldr r1, [pc, #56] ; (80294e0 <HTTP_SettingsPage+0x54>)
  23761. 80294a8: f7f8 fc48 bl 8021d3c <strpbrk>
  23762. 80294ac: 4605 mov r5, r0
  23763. 80294ae: b970 cbnz r0, 80294ce <HTTP_SettingsPage+0x42>
  23764. {
  23765. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  23766. 80294b0: 4629 mov r1, r5
  23767. 80294b2: f44f 62fa mov.w r2, #2000 ; 0x7d0
  23768. 80294b6: 4620 mov r0, r4
  23769. 80294b8: f7f8 f97e bl 80217b8 <memset>
  23770. HTTP_GetSettings(bufOut);
  23771. 80294bc: 4620 mov r0, r4
  23772. 80294be: f000 fb31 bl 8029b24 <HTTP_GetSettings>
  23773. //printf(bufOut);
  23774. *lenBufOut = strlen(bufOut);
  23775. 80294c2: 4620 mov r0, r4
  23776. 80294c4: f7f8 fb50 bl 8021b68 <strlen>
  23777. 80294c8: 8038 strh r0, [r7, #0]
  23778. return SEND_REQUIRED_YES;
  23779. 80294ca: 4628 mov r0, r5
  23780. 80294cc: e004 b.n 80294d8 <HTTP_SettingsPage+0x4c>
  23781. }
  23782. /* В запросе есть параметры, нужно парсить и сохранять настройки */
  23783. else
  23784. {
  23785. HTTP_SetSettings(bufIn, lenBufIn);
  23786. 80294ce: 4630 mov r0, r6
  23787. 80294d0: 4641 mov r1, r8
  23788. 80294d2: f7ff ff07 bl 80292e4 <HTTP_SetSettings>
  23789. return SEND_REQUIRED_NO;
  23790. 80294d6: 2001 movs r0, #1
  23791. }
  23792. }
  23793. 80294d8: b008 add sp, #32
  23794. 80294da: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  23795. 80294de: bf00 nop
  23796. 80294e0: 08037107 .word 0x08037107
  23797. 080294e4 <HTTP_Prodate>:
  23798. /**
  23799. * @brief Установка даты производства
  23800. */
  23801. // TODO Убрать заглушку!
  23802. void HTTP_Prodate(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  23803. {
  23804. 80294e4: b5f0 push {r4, r5, r6, r7, lr}
  23805. uint8_t valueLen = 0;
  23806. 80294e6: 2500 movs r5, #0
  23807. /**
  23808. * @brief Установка даты производства
  23809. */
  23810. // TODO Убрать заглушку!
  23811. void HTTP_Prodate(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  23812. {
  23813. 80294e8: b087 sub sp, #28
  23814. 80294ea: 4606 mov r6, r0
  23815. 80294ec: 460c mov r4, r1
  23816. uint8_t valueLen = 0;
  23817. char value[20];
  23818. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  23819. 80294ee: f44f 62fa mov.w r2, #2000 ; 0x7d0
  23820. 80294f2: 4608 mov r0, r1
  23821. 80294f4: 4629 mov r1, r5
  23822. /**
  23823. * @brief Установка даты производства
  23824. */
  23825. // TODO Убрать заглушку!
  23826. void HTTP_Prodate(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  23827. {
  23828. 80294f6: 461f mov r7, r3
  23829. uint8_t valueLen = 0;
  23830. 80294f8: f88d 5003 strb.w r5, [sp, #3]
  23831. char value[20];
  23832. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  23833. 80294fc: f7f8 f95c bl 80217b8 <memset>
  23834. ClearParamString(bufIn);
  23835. 8029500: 4630 mov r0, r6
  23836. 8029502: f7ff fedb bl 80292bc <ClearParamString>
  23837. memset(value, 0, 20);
  23838. 8029506: 4629 mov r1, r5
  23839. 8029508: 2214 movs r2, #20
  23840. 802950a: a801 add r0, sp, #4
  23841. 802950c: f7f8 f954 bl 80217b8 <memset>
  23842. GetParamValue(bufIn, "prodate=", value, &valueLen);
  23843. 8029510: aa01 add r2, sp, #4
  23844. 8029512: f10d 0303 add.w r3, sp, #3
  23845. 8029516: 490b ldr r1, [pc, #44] ; (8029544 <HTTP_Prodate+0x60>)
  23846. 8029518: 4630 mov r0, r6
  23847. 802951a: f7ff fe75 bl 8029208 <GetParamValue>
  23848. printf(value);
  23849. printf("\r\n");
  23850. */
  23851. /* Устанавливаем дату производства */
  23852. SETTINGS_SetProDate(value, valueLen);
  23853. 802951e: f89d 1003 ldrb.w r1, [sp, #3]
  23854. 8029522: a801 add r0, sp, #4
  23855. 8029524: f7fe fa44 bl 80279b0 <SETTINGS_SetProDate>
  23856. /* Устанавливаем дату следующей профилактики +1 год */
  23857. RTC_SetProfTime(value);
  23858. 8029528: a801 add r0, sp, #4
  23859. 802952a: f7fc fea9 bl 8026280 <RTC_SetProfTime>
  23860. /* Пока отправляем true */
  23861. strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\nTrue");
  23862. 802952e: 4906 ldr r1, [pc, #24] ; (8029548 <HTTP_Prodate+0x64>)
  23863. 8029530: 4620 mov r0, r4
  23864. 8029532: f7f8 fabb bl 8021aac <strcpy>
  23865. *lenBufOut = strlen(bufOut);
  23866. 8029536: 4620 mov r0, r4
  23867. 8029538: f7f8 fb16 bl 8021b68 <strlen>
  23868. 802953c: 8038 strh r0, [r7, #0]
  23869. // TEST_SetServerFlag();
  23870. }
  23871. 802953e: b007 add sp, #28
  23872. 8029540: bdf0 pop {r4, r5, r6, r7, pc}
  23873. 8029542: bf00 nop
  23874. 8029544: 08037109 .word 0x08037109
  23875. 8029548: 08037112 .word 0x08037112
  23876. 0802954c <HTTP_ReplaceSimbol>:
  23877. * @param *str - входная строка
  23878. * @param sim1 - символ который надо заменить
  23879. * @param sim2 - символ на который надо заменить
  23880. */
  23881. void HTTP_ReplaceSimbol(char *str, char sim1, char sim2)
  23882. {
  23883. 802954c: b570 push {r4, r5, r6, lr}
  23884. 802954e: 4604 mov r4, r0
  23885. 8029550: 460d mov r5, r1
  23886. 8029552: 4616 mov r6, r2
  23887. uint16_t len = strlen(str);
  23888. 8029554: f7f8 fb08 bl 8021b68 <strlen>
  23889. for (uint16_t i = 0; i < len; i++)
  23890. 8029558: 4623 mov r3, r4
  23891. * @param sim1 - символ который надо заменить
  23892. * @param sim2 - символ на который надо заменить
  23893. */
  23894. void HTTP_ReplaceSimbol(char *str, char sim1, char sim2)
  23895. {
  23896. uint16_t len = strlen(str);
  23897. 802955a: b280 uxth r0, r0
  23898. for (uint16_t i = 0; i < len; i++)
  23899. 802955c: e005 b.n 802956a <HTTP_ReplaceSimbol+0x1e>
  23900. {
  23901. if (*str == sim1)
  23902. 802955e: f813 2b01 ldrb.w r2, [r3], #1
  23903. 8029562: 42aa cmp r2, r5
  23904. *str = sim2;
  23905. 8029564: bf08 it eq
  23906. 8029566: f803 6c01 strbeq.w r6, [r3, #-1]
  23907. */
  23908. void HTTP_ReplaceSimbol(char *str, char sim1, char sim2)
  23909. {
  23910. uint16_t len = strlen(str);
  23911. for (uint16_t i = 0; i < len; i++)
  23912. 802956a: 1b1a subs r2, r3, r4
  23913. 802956c: b292 uxth r2, r2
  23914. 802956e: 4282 cmp r2, r0
  23915. 8029570: d3f5 bcc.n 802955e <HTTP_ReplaceSimbol+0x12>
  23916. {
  23917. if (*str == sim1)
  23918. *str = sim2;
  23919. str++;
  23920. }
  23921. }
  23922. 8029572: bd70 pop {r4, r5, r6, pc}
  23923. 08029574 <HTTP_SetInfo>:
  23924. /**
  23925. * @brief
  23926. * @retval None
  23927. */
  23928. void HTTP_SetInfo(char *buf, uint16_t lenBuf)
  23929. {
  23930. 8029574: b530 push {r4, r5, lr}
  23931. 8029576: b09f sub sp, #124 ; 0x7c
  23932. uint8_t valueLen = 0;
  23933. 8029578: 2400 movs r4, #0
  23934. /**
  23935. * @brief
  23936. * @retval None
  23937. */
  23938. void HTTP_SetInfo(char *buf, uint16_t lenBuf)
  23939. {
  23940. 802957a: 4605 mov r5, r0
  23941. uint8_t valueLen = 0;
  23942. 802957c: f88d 4007 strb.w r4, [sp, #7]
  23943. const uint8_t len = 110;
  23944. char value[110];
  23945. ClearParamString(buf);
  23946. 8029580: f7ff fe9c bl 80292bc <ClearParamString>
  23947. memset(value, 0, len);
  23948. 8029584: 4621 mov r1, r4
  23949. 8029586: 226e movs r2, #110 ; 0x6e
  23950. 8029588: a802 add r0, sp, #8
  23951. 802958a: f7f8 f915 bl 80217b8 <memset>
  23952. /* Владелец */
  23953. GetParamValue(buf, "owner=", value, &valueLen);
  23954. 802958e: f10d 0307 add.w r3, sp, #7
  23955. 8029592: aa02 add r2, sp, #8
  23956. 8029594: 4628 mov r0, r5
  23957. 8029596: 491e ldr r1, [pc, #120] ; (8029610 <HTTP_SetInfo+0x9c>)
  23958. 8029598: f7ff fe36 bl 8029208 <GetParamValue>
  23959. HTTP_ReplaceSimbol(value, '+', ' ');
  23960. 802959c: 212b movs r1, #43 ; 0x2b
  23961. 802959e: 2220 movs r2, #32
  23962. 80295a0: a802 add r0, sp, #8
  23963. 80295a2: f7ff ffd3 bl 802954c <HTTP_ReplaceSimbol>
  23964. SetOwner(value);
  23965. 80295a6: a802 add r0, sp, #8
  23966. 80295a8: f7fe f860 bl 802766c <SetOwner>
  23967. memset(value, 0, len);
  23968. 80295ac: 4621 mov r1, r4
  23969. 80295ae: 226e movs r2, #110 ; 0x6e
  23970. 80295b0: a802 add r0, sp, #8
  23971. 80295b2: f7f8 f901 bl 80217b8 <memset>
  23972. /* Владелец */
  23973. GetParamValue(buf, "sysLocation=", value, &valueLen);
  23974. 80295b6: f10d 0307 add.w r3, sp, #7
  23975. 80295ba: aa02 add r2, sp, #8
  23976. 80295bc: 4628 mov r0, r5
  23977. 80295be: 4915 ldr r1, [pc, #84] ; (8029614 <HTTP_SetInfo+0xa0>)
  23978. 80295c0: f7ff fe22 bl 8029208 <GetParamValue>
  23979. HTTP_ReplaceSimbol(value, '+', ' ');
  23980. 80295c4: 212b movs r1, #43 ; 0x2b
  23981. 80295c6: 2220 movs r2, #32
  23982. 80295c8: a802 add r0, sp, #8
  23983. 80295ca: f7ff ffbf bl 802954c <HTTP_ReplaceSimbol>
  23984. SetLocation(value);
  23985. 80295ce: a802 add r0, sp, #8
  23986. 80295d0: f7fe f85c bl 802768c <SetLocation>
  23987. memset(value, 0, len);
  23988. 80295d4: 4621 mov r1, r4
  23989. 80295d6: 226e movs r2, #110 ; 0x6e
  23990. 80295d8: a802 add r0, sp, #8
  23991. 80295da: f7f8 f8ed bl 80217b8 <memset>
  23992. /* Комментарий */
  23993. GetParamValue(buf, "comment=", value, &valueLen);
  23994. 80295de: f10d 0307 add.w r3, sp, #7
  23995. 80295e2: aa02 add r2, sp, #8
  23996. 80295e4: 4628 mov r0, r5
  23997. 80295e6: 490c ldr r1, [pc, #48] ; (8029618 <HTTP_SetInfo+0xa4>)
  23998. 80295e8: f7ff fe0e bl 8029208 <GetParamValue>
  23999. HTTP_ReplaceSimbol(value, '+', ' ');
  24000. 80295ec: 212b movs r1, #43 ; 0x2b
  24001. 80295ee: 2220 movs r2, #32
  24002. 80295f0: a802 add r0, sp, #8
  24003. 80295f2: f7ff ffab bl 802954c <HTTP_ReplaceSimbol>
  24004. SetComment(value);
  24005. 80295f6: a802 add r0, sp, #8
  24006. 80295f8: f7fe f856 bl 80276a8 <SetComment>
  24007. memset(value, 0, len);
  24008. 80295fc: 4621 mov r1, r4
  24009. 80295fe: 226e movs r2, #110 ; 0x6e
  24010. 8029600: a802 add r0, sp, #8
  24011. 8029602: f7f8 f8d9 bl 80217b8 <memset>
  24012. HTTP_SaveSettings();
  24013. 8029606: f000 fc40 bl 8029e8a <HTTP_SaveSettings>
  24014. }
  24015. 802960a: b01f add sp, #124 ; 0x7c
  24016. 802960c: bd30 pop {r4, r5, pc}
  24017. 802960e: bf00 nop
  24018. 8029610: 08037142 .word 0x08037142
  24019. 8029614: 08037149 .word 0x08037149
  24020. 8029618: 08037156 .word 0x08037156
  24021. 0802961c <HTTP_InfoPage>:
  24022. /**
  24023. * @brief
  24024. * @retval None
  24025. */
  24026. int HTTP_InfoPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  24027. {
  24028. 802961c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  24029. 8029620: 4606 mov r6, r0
  24030. 8029622: b088 sub sp, #32
  24031. 8029624: 460c mov r4, r1
  24032. 8029626: 4690 mov r8, r2
  24033. char tempStr[30];
  24034. strncpy(tempStr, bufIn, 30);
  24035. 8029628: 4631 mov r1, r6
  24036. 802962a: 221e movs r2, #30
  24037. 802962c: 4668 mov r0, sp
  24038. /**
  24039. * @brief
  24040. * @retval None
  24041. */
  24042. int HTTP_InfoPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  24043. {
  24044. 802962e: 461f mov r7, r3
  24045. char tempStr[30];
  24046. strncpy(tempStr, bufIn, 30);
  24047. 8029630: f7f8 fb52 bl 8021cd8 <strncpy>
  24048. /* В запросе нет параметров, нужно формировать JSON ответ */
  24049. if (strpbrk(tempStr,"?") == 0)
  24050. 8029634: 4668 mov r0, sp
  24051. 8029636: 490e ldr r1, [pc, #56] ; (8029670 <HTTP_InfoPage+0x54>)
  24052. 8029638: f7f8 fb80 bl 8021d3c <strpbrk>
  24053. 802963c: 4605 mov r5, r0
  24054. 802963e: b970 cbnz r0, 802965e <HTTP_InfoPage+0x42>
  24055. {
  24056. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  24057. 8029640: 4629 mov r1, r5
  24058. 8029642: f44f 62fa mov.w r2, #2000 ; 0x7d0
  24059. 8029646: 4620 mov r0, r4
  24060. 8029648: f7f8 f8b6 bl 80217b8 <memset>
  24061. HTTP_GetInfo(bufOut);
  24062. 802964c: 4620 mov r0, r4
  24063. 802964e: f000 fb25 bl 8029c9c <HTTP_GetInfo>
  24064. *lenBufOut = strlen(bufOut);
  24065. 8029652: 4620 mov r0, r4
  24066. 8029654: f7f8 fa88 bl 8021b68 <strlen>
  24067. 8029658: 8038 strh r0, [r7, #0]
  24068. return SEND_REQUIRED_YES;
  24069. 802965a: 4628 mov r0, r5
  24070. 802965c: e004 b.n 8029668 <HTTP_InfoPage+0x4c>
  24071. }
  24072. /* В запросе есть параметры, нужно парсить и сохранять настройки */
  24073. else
  24074. {
  24075. HTTP_SetInfo(bufIn, lenBufIn);
  24076. 802965e: 4630 mov r0, r6
  24077. 8029660: 4641 mov r1, r8
  24078. 8029662: f7ff ff87 bl 8029574 <HTTP_SetInfo>
  24079. return SEND_REQUIRED_NO;
  24080. 8029666: 2001 movs r0, #1
  24081. /*
  24082. HTTP_SetSettings(bufIn, lenBufIn);
  24083. return SEND_REQUIRED_NO;
  24084. */
  24085. }
  24086. }
  24087. 8029668: b008 add sp, #32
  24088. 802966a: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  24089. 802966e: bf00 nop
  24090. 8029670: 08037107 .word 0x08037107
  24091. 08029674 <http_recv>:
  24092. * @param p: pointer to a packet buffer
  24093. * @param err: LwIP error code
  24094. * @retval err
  24095. */
  24096. static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
  24097. {
  24098. 8029674: e92d 41f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, lr}
  24099. 8029678: 4617 mov r7, r2
  24100. char *data;
  24101. struct http_state *hs;
  24102. struct fs_file file = {0, 0};
  24103. 802967a: 2200 movs r2, #0
  24104. * @param p: pointer to a packet buffer
  24105. * @param err: LwIP error code
  24106. * @retval err
  24107. */
  24108. static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
  24109. {
  24110. 802967c: 4604 mov r4, r0
  24111. 802967e: 460d mov r5, r1
  24112. char *data;
  24113. struct http_state *hs;
  24114. struct fs_file file = {0, 0};
  24115. 8029680: 9200 str r2, [sp, #0]
  24116. 8029682: 9201 str r2, [sp, #4]
  24117. hs = arg;
  24118. if (err == ERR_OK && p != NULL)
  24119. 8029684: 2b00 cmp r3, #0
  24120. 8029686: f040 80e7 bne.w 8029858 <http_recv+0x1e4>
  24121. {
  24122. tcp_recved(pcb, p->tot_len);
  24123. 802968a: 4608 mov r0, r1
  24124. struct http_state *hs;
  24125. struct fs_file file = {0, 0};
  24126. hs = arg;
  24127. if (err == ERR_OK && p != NULL)
  24128. 802968c: 2f00 cmp r7, #0
  24129. 802968e: f000 80e0 beq.w 8029852 <http_recv+0x1de>
  24130. {
  24131. tcp_recved(pcb, p->tot_len);
  24132. 8029692: 8939 ldrh r1, [r7, #8]
  24133. 8029694: f002 f86e bl 802b774 <tcp_recved>
  24134. if (hs->file == NULL)
  24135. 8029698: 6823 ldr r3, [r4, #0]
  24136. 802969a: 2b00 cmp r3, #0
  24137. 802969c: f040 80d5 bne.w 802984a <http_recv+0x1d6>
  24138. {
  24139. data = p->payload;
  24140. 80296a0: 687e ldr r6, [r7, #4]
  24141. /*
  24142. printLen = p->tot_len;
  24143. memcpy(printBuf, p->payload , printLen);
  24144. printf(printBuf);
  24145. */
  24146. receivedBufLen = p->tot_len;
  24147. 80296a2: 893a ldrh r2, [r7, #8]
  24148. 80296a4: 4b6e ldr r3, [pc, #440] ; (8029860 <http_recv+0x1ec>)
  24149. memcpy(receiveBuf, p->payload , receivedBufLen);
  24150. 80296a6: 486f ldr r0, [pc, #444] ; (8029864 <http_recv+0x1f0>)
  24151. /*
  24152. printLen = p->tot_len;
  24153. memcpy(printBuf, p->payload , printLen);
  24154. printf(printBuf);
  24155. */
  24156. receivedBufLen = p->tot_len;
  24157. 80296a8: 801a strh r2, [r3, #0]
  24158. memcpy(receiveBuf, p->payload , receivedBufLen);
  24159. 80296aa: 4631 mov r1, r6
  24160. 80296ac: f7f7 ffca bl 8021644 <memcpy>
  24161. if (strncmp(data, "GET /main.css", 13) == 0) // +
  24162. 80296b0: 4630 mov r0, r6
  24163. 80296b2: 496d ldr r1, [pc, #436] ; (8029868 <http_recv+0x1f4>)
  24164. 80296b4: 220d movs r2, #13
  24165. 80296b6: f7f8 fab9 bl 8021c2c <strncmp>
  24166. 80296ba: b908 cbnz r0, 80296c0 <http_recv+0x4c>
  24167. {
  24168. fs_open("/main.css", &file);
  24169. 80296bc: 486b ldr r0, [pc, #428] ; (802986c <http_recv+0x1f8>)
  24170. 80296be: e0b5 b.n 802982c <http_recv+0x1b8>
  24171. hs->file = file.data;
  24172. hs->left = file.len;
  24173. send_data(pcb, hs);
  24174. tcp_sent(pcb, http_sent);
  24175. }
  24176. else if (strncmp(data, "GET /rotek.png", 14) == 0) // +
  24177. 80296c0: 4630 mov r0, r6
  24178. 80296c2: 496b ldr r1, [pc, #428] ; (8029870 <http_recv+0x1fc>)
  24179. 80296c4: 220e movs r2, #14
  24180. 80296c6: f7f8 fab1 bl 8021c2c <strncmp>
  24181. 80296ca: b908 cbnz r0, 80296d0 <http_recv+0x5c>
  24182. {
  24183. fs_open("/rotek.png", &file);
  24184. 80296cc: 4869 ldr r0, [pc, #420] ; (8029874 <http_recv+0x200>)
  24185. 80296ce: e0ad b.n 802982c <http_recv+0x1b8>
  24186. hs->file = file.data;
  24187. hs->left = file.len;
  24188. send_data(pcb, hs);
  24189. tcp_sent(pcb, http_sent);
  24190. }
  24191. else if (strncmp(data, "GET /favicon.ico", 16) == 0) // ?
  24192. 80296d0: 4630 mov r0, r6
  24193. 80296d2: 4969 ldr r1, [pc, #420] ; (8029878 <http_recv+0x204>)
  24194. 80296d4: 2210 movs r2, #16
  24195. 80296d6: f7f8 faa9 bl 8021c2c <strncmp>
  24196. 80296da: b908 cbnz r0, 80296e0 <http_recv+0x6c>
  24197. {
  24198. fs_open("/favicon.ico", &file);
  24199. 80296dc: 4867 ldr r0, [pc, #412] ; (802987c <http_recv+0x208>)
  24200. 80296de: e0a5 b.n 802982c <http_recv+0x1b8>
  24201. hs->file = file.data;
  24202. hs->left = file.len;
  24203. send_data(pcb, hs);
  24204. tcp_sent(pcb, http_sent);
  24205. }
  24206. else if (strncmp(data, "GET /main.js", 12) == 0) // +
  24207. 80296e0: 4630 mov r0, r6
  24208. 80296e2: 4967 ldr r1, [pc, #412] ; (8029880 <http_recv+0x20c>)
  24209. 80296e4: 220c movs r2, #12
  24210. 80296e6: f7f8 faa1 bl 8021c2c <strncmp>
  24211. 80296ea: b908 cbnz r0, 80296f0 <http_recv+0x7c>
  24212. {
  24213. fs_open("/main.js", &file);
  24214. 80296ec: 4865 ldr r0, [pc, #404] ; (8029884 <http_recv+0x210>)
  24215. 80296ee: e09d b.n 802982c <http_recv+0x1b8>
  24216. hs->left = file.len;
  24217. send_data(pcb, hs);
  24218. tcp_sent(pcb, http_sent);
  24219. }
  24220. else if (strncmp(data, "GET /settings.html", 18) == 0) // +
  24221. 80296f0: 4630 mov r0, r6
  24222. 80296f2: 4965 ldr r1, [pc, #404] ; (8029888 <http_recv+0x214>)
  24223. 80296f4: 2212 movs r2, #18
  24224. 80296f6: f7f8 fa99 bl 8021c2c <strncmp>
  24225. 80296fa: b900 cbnz r0, 80296fe <http_recv+0x8a>
  24226. 80296fc: e049 b.n 8029792 <http_recv+0x11e>
  24227. hs->file = file.data;
  24228. hs->left = file.len;
  24229. send_data(pcb, hs);
  24230. tcp_sent(pcb, http_sent);
  24231. }
  24232. else if (strncmp(data, "GET /info.html", 14) == 0) // +
  24233. 80296fe: 4630 mov r0, r6
  24234. 8029700: 4962 ldr r1, [pc, #392] ; (802988c <http_recv+0x218>)
  24235. 8029702: 220e movs r2, #14
  24236. 8029704: f7f8 fa92 bl 8021c2c <strncmp>
  24237. 8029708: b900 cbnz r0, 802970c <http_recv+0x98>
  24238. 802970a: e036 b.n 802977a <http_recv+0x106>
  24239. hs->file = file.data;
  24240. hs->left = file.len;
  24241. send_data(pcb, hs);
  24242. tcp_sent(pcb, http_sent);
  24243. }
  24244. else if (strncmp(data, "GET /getJson.cgi", 16) == 0) // +
  24245. 802970c: 4630 mov r0, r6
  24246. 802970e: 4960 ldr r1, [pc, #384] ; (8029890 <http_recv+0x21c>)
  24247. 8029710: 2210 movs r2, #16
  24248. 8029712: f7f8 fa8b bl 8021c2c <strncmp>
  24249. 8029716: b948 cbnz r0, 802972c <http_recv+0xb8>
  24250. {
  24251. HTTP_GetParamsPage1(sendBuf);
  24252. 8029718: 4e5e ldr r6, [pc, #376] ; (8029894 <http_recv+0x220>)
  24253. 802971a: 4630 mov r0, r6
  24254. 802971c: f000 f8fc bl 8029918 <HTTP_GetParamsPage1>
  24255. hs->file = sendBuf;
  24256. 8029720: 6026 str r6, [r4, #0]
  24257. hs->left = strlen(sendBuf);
  24258. 8029722: 4630 mov r0, r6
  24259. 8029724: f7f8 fa20 bl 8021b68 <strlen>
  24260. 8029728: 6060 str r0, [r4, #4]
  24261. 802972a: e086 b.n 802983a <http_recv+0x1c6>
  24262. send_data(pcb, hs);
  24263. tcp_sent(pcb, http_sent);
  24264. }
  24265. else if (strncmp(data, "GET /settings.cgi", 17) == 0) // +
  24266. 802972c: 4630 mov r0, r6
  24267. 802972e: 495a ldr r1, [pc, #360] ; (8029898 <http_recv+0x224>)
  24268. 8029730: 2211 movs r2, #17
  24269. 8029732: f7f8 fa7b bl 8021c2c <strncmp>
  24270. 8029736: b970 cbnz r0, 8029756 <http_recv+0xe2>
  24271. {
  24272. SET_PAGE = SET_PAGE_PAGE2;
  24273. 8029738: 4b58 ldr r3, [pc, #352] ; (802989c <http_recv+0x228>)
  24274. if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)
  24275. 802973a: f8df 8158 ldr.w r8, [pc, #344] ; 8029894 <http_recv+0x220>
  24276. 802973e: 4e58 ldr r6, [pc, #352] ; (80298a0 <http_recv+0x22c>)
  24277. 8029740: 4848 ldr r0, [pc, #288] ; (8029864 <http_recv+0x1f0>)
  24278. send_data(pcb, hs);
  24279. tcp_sent(pcb, http_sent);
  24280. }
  24281. else if (strncmp(data, "GET /settings.cgi", 17) == 0) // +
  24282. {
  24283. SET_PAGE = SET_PAGE_PAGE2;
  24284. 8029742: 2202 movs r2, #2
  24285. 8029744: 701a strb r2, [r3, #0]
  24286. if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)
  24287. 8029746: 4b46 ldr r3, [pc, #280] ; (8029860 <http_recv+0x1ec>)
  24288. 8029748: 4641 mov r1, r8
  24289. 802974a: 881a ldrh r2, [r3, #0]
  24290. 802974c: 4633 mov r3, r6
  24291. 802974e: f7ff fe9d bl 802948c <HTTP_SettingsPage>
  24292. 8029752: b9f0 cbnz r0, 8029792 <http_recv+0x11e>
  24293. 8029754: e065 b.n 8029822 <http_recv+0x1ae>
  24294. hs->left = file.len;
  24295. send_data(pcb, hs);
  24296. tcp_sent(pcb, http_sent);
  24297. }
  24298. }
  24299. else if (strncmp(data, "GET /info.cgi", 13) == 0) // +
  24300. 8029756: 4630 mov r0, r6
  24301. 8029758: 4952 ldr r1, [pc, #328] ; (80298a4 <http_recv+0x230>)
  24302. 802975a: 220d movs r2, #13
  24303. 802975c: f7f8 fa66 bl 8021c2c <strncmp>
  24304. 8029760: b968 cbnz r0, 802977e <http_recv+0x10a>
  24305. {
  24306. if (HTTP_InfoPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)
  24307. 8029762: 4b3f ldr r3, [pc, #252] ; (8029860 <http_recv+0x1ec>)
  24308. 8029764: f8df 812c ldr.w r8, [pc, #300] ; 8029894 <http_recv+0x220>
  24309. 8029768: 4e4d ldr r6, [pc, #308] ; (80298a0 <http_recv+0x22c>)
  24310. 802976a: 881a ldrh r2, [r3, #0]
  24311. 802976c: 483d ldr r0, [pc, #244] ; (8029864 <http_recv+0x1f0>)
  24312. 802976e: 4641 mov r1, r8
  24313. 8029770: 4633 mov r3, r6
  24314. 8029772: f7ff ff53 bl 802961c <HTTP_InfoPage>
  24315. 8029776: b900 cbnz r0, 802977a <http_recv+0x106>
  24316. 8029778: e053 b.n 8029822 <http_recv+0x1ae>
  24317. send_data(pcb, hs);
  24318. tcp_sent(pcb, http_sent);
  24319. }
  24320. else
  24321. {
  24322. fs_open("/info.html", &file);
  24323. 802977a: 484b ldr r0, [pc, #300] ; (80298a8 <http_recv+0x234>)
  24324. 802977c: e056 b.n 802982c <http_recv+0x1b8>
  24325. send_data(pcb, hs);
  24326. tcp_sent(pcb, http_sent);
  24327. }
  24328. }
  24329. /* Сброс настроек и сохранине */
  24330. else if (strncmp(data, "GET /reset.cgi", 14) == 0)
  24331. 802977e: 4630 mov r0, r6
  24332. 8029780: 494a ldr r1, [pc, #296] ; (80298ac <http_recv+0x238>)
  24333. 8029782: 220e movs r2, #14
  24334. 8029784: f7f8 fa52 bl 8021c2c <strncmp>
  24335. 8029788: b928 cbnz r0, 8029796 <http_recv+0x122>
  24336. {
  24337. HTTP_ResetSettings();
  24338. 802978a: f000 fb77 bl 8029e7c <HTTP_ResetSettings>
  24339. HTTP_SaveSettings();
  24340. 802978e: f000 fb7c bl 8029e8a <HTTP_SaveSettings>
  24341. fs_open("/settings.html", &file);
  24342. 8029792: 4847 ldr r0, [pc, #284] ; (80298b0 <http_recv+0x23c>)
  24343. 8029794: e04a b.n 802982c <http_recv+0x1b8>
  24344. hs->left = file.len;
  24345. send_data(pcb, hs);
  24346. tcp_sent(pcb, http_sent);
  24347. }
  24348. /* Перезагрузка контроллера */
  24349. else if (strncmp(data, "GET /reboot.cgi", 15) == 0)
  24350. 8029796: 4630 mov r0, r6
  24351. 8029798: 4946 ldr r1, [pc, #280] ; (80298b4 <http_recv+0x240>)
  24352. 802979a: 220f movs r2, #15
  24353. 802979c: f7f8 fa46 bl 8021c2c <strncmp>
  24354. 80297a0: b910 cbnz r0, 80297a8 <http_recv+0x134>
  24355. {
  24356. HTTP_Reboot();
  24357. 80297a2: f000 fb74 bl 8029e8e <HTTP_Reboot>
  24358. 80297a6: e050 b.n 802984a <http_recv+0x1d6>
  24359. }
  24360. /* Подтверждение новых сетевых настроек */
  24361. else if (strncmp(data, "GET /confirm.cgi", 16) == 0)
  24362. 80297a8: 4630 mov r0, r6
  24363. 80297aa: 4943 ldr r1, [pc, #268] ; (80298b8 <http_recv+0x244>)
  24364. 80297ac: 2210 movs r2, #16
  24365. 80297ae: f7f8 fa3d bl 8021c2c <strncmp>
  24366. 80297b2: b920 cbnz r0, 80297be <http_recv+0x14a>
  24367. {
  24368. SetWebReinitFlag(false);
  24369. 80297b4: f7fd fef4 bl 80275a0 <SetWebReinitFlag>
  24370. SetConfirmWebParamsFlag();
  24371. 80297b8: f7fd fef8 bl 80275ac <SetConfirmWebParamsFlag>
  24372. 80297bc: e035 b.n 802982a <http_recv+0x1b6>
  24373. hs->left = file.len;
  24374. send_data(pcb, hs);
  24375. tcp_sent(pcb, http_sent);
  24376. }
  24377. /* Проверка пароля, переход в bootloader */
  24378. else if (strncmp(data, "POST /checkpwd.cgi", 18) == 0)
  24379. 80297be: 4630 mov r0, r6
  24380. 80297c0: 493e ldr r1, [pc, #248] ; (80298bc <http_recv+0x248>)
  24381. 80297c2: 2212 movs r2, #18
  24382. 80297c4: f7f8 fa32 bl 8021c2c <strncmp>
  24383. 80297c8: b950 cbnz r0, 80297e0 <http_recv+0x16c>
  24384. {
  24385. HTTP_ConfirmBootPwd(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  24386. 80297ca: f8df 80c8 ldr.w r8, [pc, #200] ; 8029894 <http_recv+0x220>
  24387. 80297ce: 4e34 ldr r6, [pc, #208] ; (80298a0 <http_recv+0x22c>)
  24388. 80297d0: 4b23 ldr r3, [pc, #140] ; (8029860 <http_recv+0x1ec>)
  24389. 80297d2: 4824 ldr r0, [pc, #144] ; (8029864 <http_recv+0x1f0>)
  24390. 80297d4: 881a ldrh r2, [r3, #0]
  24391. 80297d6: 4641 mov r1, r8
  24392. 80297d8: 4633 mov r3, r6
  24393. 80297da: f7ff fd43 bl 8029264 <HTTP_ConfirmBootPwd>
  24394. 80297de: e020 b.n 8029822 <http_recv+0x1ae>
  24395. hs->left = sendBufLoadLen;
  24396. send_data(pcb, hs);
  24397. tcp_sent(pcb, http_sent);
  24398. }
  24399. // На производстве
  24400. else if (strncmp(data, "GET /setProdate.cgi", 19) == 0)
  24401. 80297e0: 4630 mov r0, r6
  24402. 80297e2: 4937 ldr r1, [pc, #220] ; (80298c0 <http_recv+0x24c>)
  24403. 80297e4: 2213 movs r2, #19
  24404. 80297e6: f7f8 fa21 bl 8021c2c <strncmp>
  24405. 80297ea: b950 cbnz r0, 8029802 <http_recv+0x18e>
  24406. {
  24407. HTTP_Prodate(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  24408. 80297ec: f8df 80a4 ldr.w r8, [pc, #164] ; 8029894 <http_recv+0x220>
  24409. 80297f0: 4e2b ldr r6, [pc, #172] ; (80298a0 <http_recv+0x22c>)
  24410. 80297f2: 4b1b ldr r3, [pc, #108] ; (8029860 <http_recv+0x1ec>)
  24411. 80297f4: 481b ldr r0, [pc, #108] ; (8029864 <http_recv+0x1f0>)
  24412. 80297f6: 881a ldrh r2, [r3, #0]
  24413. 80297f8: 4641 mov r1, r8
  24414. 80297fa: 4633 mov r3, r6
  24415. 80297fc: f7ff fe72 bl 80294e4 <HTTP_Prodate>
  24416. 8029800: e00f b.n 8029822 <http_recv+0x1ae>
  24417. hs->left = sendBufLoadLen;
  24418. send_data(pcb, hs);
  24419. tcp_sent(pcb, http_sent);
  24420. }
  24421. // На производстве
  24422. else if (strncmp(data, "GET /progon.cgi", 15) == 0)
  24423. 8029802: 4630 mov r0, r6
  24424. 8029804: 492f ldr r1, [pc, #188] ; (80298c4 <http_recv+0x250>)
  24425. 8029806: 220f movs r2, #15
  24426. 8029808: f7f8 fa10 bl 8021c2c <strncmp>
  24427. 802980c: b968 cbnz r0, 802982a <http_recv+0x1b6>
  24428. {
  24429. HTTP_Progon(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  24430. 802980e: 4b14 ldr r3, [pc, #80] ; (8029860 <http_recv+0x1ec>)
  24431. 8029810: f8df 8080 ldr.w r8, [pc, #128] ; 8029894 <http_recv+0x220>
  24432. 8029814: 4e22 ldr r6, [pc, #136] ; (80298a0 <http_recv+0x22c>)
  24433. 8029816: 881a ldrh r2, [r3, #0]
  24434. 8029818: 4812 ldr r0, [pc, #72] ; (8029864 <http_recv+0x1f0>)
  24435. 802981a: 4641 mov r1, r8
  24436. 802981c: 4633 mov r3, r6
  24437. 802981e: f7ff fce1 bl 80291e4 <HTTP_Progon>
  24438. hs->file = sendBuf;
  24439. 8029822: f8c4 8000 str.w r8, [r4]
  24440. hs->left = sendBufLoadLen;
  24441. 8029826: 8833 ldrh r3, [r6, #0]
  24442. 8029828: e006 b.n 8029838 <http_recv+0x1c4>
  24443. send_data(pcb, hs);
  24444. tcp_sent(pcb, http_sent);
  24445. }
  24446. else
  24447. {
  24448. fs_open("/index.html", &file); // +
  24449. 802982a: 4827 ldr r0, [pc, #156] ; (80298c8 <http_recv+0x254>)
  24450. 802982c: 4669 mov r1, sp
  24451. 802982e: f7ff fc41 bl 80290b4 <fs_open>
  24452. hs->file = file.data;
  24453. 8029832: 9b00 ldr r3, [sp, #0]
  24454. 8029834: 6023 str r3, [r4, #0]
  24455. hs->left = file.len;
  24456. 8029836: 9b01 ldr r3, [sp, #4]
  24457. 8029838: 6063 str r3, [r4, #4]
  24458. send_data(pcb, hs);
  24459. 802983a: 4628 mov r0, r5
  24460. 802983c: 4621 mov r1, r4
  24461. 802983e: f7ff fc75 bl 802912c <send_data>
  24462. tcp_sent(pcb, http_sent);
  24463. 8029842: 4628 mov r0, r5
  24464. 8029844: 4921 ldr r1, [pc, #132] ; (80298cc <http_recv+0x258>)
  24465. 8029846: f001 ffcb bl 802b7e0 <tcp_sent>
  24466. }
  24467. }
  24468. pbuf_free(p);
  24469. 802984a: 4638 mov r0, r7
  24470. 802984c: f001 fd00 bl 802b250 <pbuf_free>
  24471. close_conn(pcb,hs);
  24472. 8029850: 4628 mov r0, r5
  24473. }
  24474. if (err == ERR_OK && p == NULL)
  24475. {
  24476. close_conn(pcb, hs);
  24477. 8029852: 4621 mov r1, r4
  24478. 8029854: f7ff fc8d bl 8029172 <close_conn>
  24479. }
  24480. return ERR_OK;
  24481. }
  24482. 8029858: 2000 movs r0, #0
  24483. 802985a: e8bd 81fc ldmia.w sp!, {r2, r3, r4, r5, r6, r7, r8, pc}
  24484. 802985e: bf00 nop
  24485. 8029860: 200029f6 .word 0x200029f6
  24486. 8029864: 2000f345 .word 0x2000f345
  24487. 8029868: 0803715f .word 0x0803715f
  24488. 802986c: 08037163 .word 0x08037163
  24489. 8029870: 0803716d .word 0x0803716d
  24490. 8029874: 08037171 .word 0x08037171
  24491. 8029878: 0803717c .word 0x0803717c
  24492. 802987c: 08037180 .word 0x08037180
  24493. 8029880: 0803718d .word 0x0803718d
  24494. 8029884: 08037191 .word 0x08037191
  24495. 8029888: 0803719a .word 0x0803719a
  24496. 802988c: 080371ad .word 0x080371ad
  24497. 8029890: 080371bc .word 0x080371bc
  24498. 8029894: 2000eb75 .word 0x2000eb75
  24499. 8029898: 080371cd .word 0x080371cd
  24500. 802989c: 200029f4 .word 0x200029f4
  24501. 80298a0: 200029f8 .word 0x200029f8
  24502. 80298a4: 080371df .word 0x080371df
  24503. 80298a8: 080371b1 .word 0x080371b1
  24504. 80298ac: 080371ed .word 0x080371ed
  24505. 80298b0: 0803719e .word 0x0803719e
  24506. 80298b4: 080371fc .word 0x080371fc
  24507. 80298b8: 0803720c .word 0x0803720c
  24508. 80298bc: 08037229 .word 0x08037229
  24509. 80298c0: 0803723c .word 0x0803723c
  24510. 80298c4: 08037250 .word 0x08037250
  24511. 80298c8: 0803721d .word 0x0803721d
  24512. 80298cc: 0802919f .word 0x0802919f
  24513. 080298d0 <NVIC_SystemReset>:
  24514. 80298d0: f3bf 8f4f dsb sy
  24515. (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
  24516. 80298d4: 4a04 ldr r2, [pc, #16] ; (80298e8 <NVIC_SystemReset+0x18>)
  24517. 80298d6: 4b05 ldr r3, [pc, #20] ; (80298ec <NVIC_SystemReset+0x1c>)
  24518. 80298d8: 68d1 ldr r1, [r2, #12]
  24519. 80298da: f401 61e0 and.w r1, r1, #1792 ; 0x700
  24520. 80298de: 430b orrs r3, r1
  24521. __STATIC_INLINE void NVIC_SystemReset(void)
  24522. //static inline void NVIC_SystemReset(void)
  24523. {
  24524. __DSB(); /* Ensure all outstanding memory accesses included
  24525. buffered write are completed before reset */
  24526. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  24527. 80298e0: 60d3 str r3, [r2, #12]
  24528. 80298e2: f3bf 8f4f dsb sy
  24529. 80298e6: e7fe b.n 80298e6 <NVIC_SystemReset+0x16>
  24530. 80298e8: e000ed00 .word 0xe000ed00
  24531. 80298ec: 05fa0004 .word 0x05fa0004
  24532. 080298f0 <vTaskReboot>:
  24533. /**
  24534. * @brief
  24535. */
  24536. void vTaskReboot(void * pvParameters)
  24537. {
  24538. 80298f0: b508 push {r3, lr}
  24539. for (;;)
  24540. {
  24541. mode = *(bool*)pvParameters;
  24542. if (mode)
  24543. 80298f2: 7803 ldrb r3, [r0, #0]
  24544. 80298f4: b133 cbz r3, 8029904 <vTaskReboot+0x14>
  24545. {
  24546. SetLoadMode();
  24547. 80298f6: f7fd fe4d bl 8027594 <SetLoadMode>
  24548. */
  24549. void HTTP_SaveSettings(void)
  24550. {
  24551. // taskENTER_CRITICAL();
  24552. SETTINGS_Save();
  24553. 80298fa: f7fd ffdf bl 80278bc <SETTINGS_Save>
  24554. if (mode)
  24555. {
  24556. SetLoadMode();
  24557. HTTP_SaveSettings();
  24558. SNMP_SendUserTrap(FW_VERSION_UPDATE);
  24559. 80298fe: 2001 movs r0, #1
  24560. 8029900: f009 fba2 bl 8033048 <SNMP_SendUserTrap>
  24561. vTaskDelay(1010);
  24562. NVIC_SystemReset();
  24563. }
  24564. else
  24565. {
  24566. vTaskDelay(1000);
  24567. 8029904: f44f 707a mov.w r0, #1000 ; 0x3e8
  24568. 8029908: f7ff f824 bl 8028954 <vTaskDelay>
  24569. /* Блокируем управление ключем на тау секунд*/
  24570. //IO_KeyBlockOn();
  24571. vTaskDelay(1010);
  24572. 802990c: f240 30f2 movw r0, #1010 ; 0x3f2
  24573. 8029910: f7ff f820 bl 8028954 <vTaskDelay>
  24574. NVIC_SystemReset();
  24575. 8029914: f7ff ffdc bl 80298d0 <NVIC_SystemReset>
  24576. 08029918 <HTTP_GetParamsPage1>:
  24577. /**
  24578. * @brief Возвращяет строку с настройками на первой странице
  24579. * @retval None
  24580. */
  24581. void HTTP_GetParamsPage1(char *buf)
  24582. {
  24583. 8029918: b510 push {r4, lr}
  24584. char str[40];
  24585. uint8_t len;
  24586. memset(buf, 0, 1000);
  24587. 802991a: f44f 727a mov.w r2, #1000 ; 0x3e8
  24588. /**
  24589. * @brief Возвращяет строку с настройками на первой странице
  24590. * @retval None
  24591. */
  24592. void HTTP_GetParamsPage1(char *buf)
  24593. {
  24594. 802991e: b08c sub sp, #48 ; 0x30
  24595. 8029920: 4604 mov r4, r0
  24596. char str[40];
  24597. uint8_t len;
  24598. memset(buf, 0, 1000);
  24599. 8029922: 2100 movs r1, #0
  24600. 8029924: f7f7 ff48 bl 80217b8 <memset>
  24601. // Headers для поддержки saffari
  24602. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  24603. 8029928: 4620 mov r0, r4
  24604. 802992a: 496e ldr r1, [pc, #440] ; (8029ae4 <HTTP_GetParamsPage1+0x1cc>)
  24605. 802992c: f7f8 f8be bl 8021aac <strcpy>
  24606. // Параметры UPS
  24607. GetInputVoltageStr(str, &len);
  24608. 8029930: a802 add r0, sp, #8
  24609. 8029932: f10d 0107 add.w r1, sp, #7
  24610. 8029936: f7fd fc6d bl 8027214 <GetInputVoltageStr>
  24611. strcat(buf, "{\"AC\":\"");
  24612. 802993a: 4620 mov r0, r4
  24613. 802993c: 496a ldr r1, [pc, #424] ; (8029ae8 <HTTP_GetParamsPage1+0x1d0>)
  24614. 802993e: f7f7 ffa1 bl 8021884 <strcat>
  24615. strncat(buf, str, len);
  24616. 8029942: f89d 2007 ldrb.w r2, [sp, #7]
  24617. 8029946: a902 add r1, sp, #8
  24618. 8029948: 4620 mov r0, r4
  24619. 802994a: f7f8 f93d bl 8021bc8 <strncat>
  24620. GetOutputVoltageStr(str, &len);
  24621. 802994e: a802 add r0, sp, #8
  24622. 8029950: f10d 0107 add.w r1, sp, #7
  24623. 8029954: f7fd fc64 bl 8027220 <GetOutputVoltageStr>
  24624. strcat(buf, "\",\"DC\":\"");
  24625. 8029958: 4620 mov r0, r4
  24626. 802995a: 4964 ldr r1, [pc, #400] ; (8029aec <HTTP_GetParamsPage1+0x1d4>)
  24627. 802995c: f7f7 ff92 bl 8021884 <strcat>
  24628. strncat(buf, str, len);
  24629. 8029960: f89d 2007 ldrb.w r2, [sp, #7]
  24630. 8029964: a902 add r1, sp, #8
  24631. 8029966: 4620 mov r0, r4
  24632. 8029968: f7f8 f92e bl 8021bc8 <strncat>
  24633. GetInputFreqStr(str, &len);
  24634. 802996c: a802 add r0, sp, #8
  24635. 802996e: f10d 0107 add.w r1, sp, #7
  24636. 8029972: f7fd fc43 bl 80271fc <GetInputFreqStr>
  24637. strcat(buf, "\",\"in_freq\":\"");
  24638. 8029976: 4620 mov r0, r4
  24639. 8029978: 495d ldr r1, [pc, #372] ; (8029af0 <HTTP_GetParamsPage1+0x1d8>)
  24640. 802997a: f7f7 ff83 bl 8021884 <strcat>
  24641. strncat(buf, str, len);
  24642. 802997e: f89d 2007 ldrb.w r2, [sp, #7]
  24643. 8029982: a902 add r1, sp, #8
  24644. 8029984: 4620 mov r0, r4
  24645. 8029986: f7f8 f91f bl 8021bc8 <strncat>
  24646. GetOutputFreqStr(str, &len);
  24647. 802998a: a802 add r0, sp, #8
  24648. 802998c: f10d 0107 add.w r1, sp, #7
  24649. 8029990: f7fd fc3a bl 8027208 <GetOutputFreqStr>
  24650. strcat(buf, "\",\"out_freq\":\"");
  24651. 8029994: 4620 mov r0, r4
  24652. 8029996: 4957 ldr r1, [pc, #348] ; (8029af4 <HTTP_GetParamsPage1+0x1dc>)
  24653. 8029998: f7f7 ff74 bl 8021884 <strcat>
  24654. strncat(buf, str, len);
  24655. 802999c: f89d 2007 ldrb.w r2, [sp, #7]
  24656. 80299a0: a902 add r1, sp, #8
  24657. 80299a2: 4620 mov r0, r4
  24658. 80299a4: f7f8 f910 bl 8021bc8 <strncat>
  24659. GetPowerStr(str, &len);
  24660. 80299a8: a802 add r0, sp, #8
  24661. 80299aa: f10d 0107 add.w r1, sp, #7
  24662. 80299ae: f7fd fc3d bl 802722c <GetPowerStr>
  24663. strcat(buf, "\",\"pwr\":\"");
  24664. 80299b2: 4620 mov r0, r4
  24665. 80299b4: 4950 ldr r1, [pc, #320] ; (8029af8 <HTTP_GetParamsPage1+0x1e0>)
  24666. 80299b6: f7f7 ff65 bl 8021884 <strcat>
  24667. strncat(buf, str, len);
  24668. 80299ba: f89d 2007 ldrb.w r2, [sp, #7]
  24669. 80299be: a902 add r1, sp, #8
  24670. 80299c0: 4620 mov r0, r4
  24671. 80299c2: f7f8 f901 bl 8021bc8 <strncat>
  24672. GetLineFailBitStr(str, &len);
  24673. 80299c6: a802 add r0, sp, #8
  24674. 80299c8: f10d 0107 add.w r1, sp, #7
  24675. 80299cc: f7fd fc12 bl 80271f4 <GetLineFailBitStr>
  24676. strcat(buf, "\",\"line_fail\":");
  24677. 80299d0: 4620 mov r0, r4
  24678. 80299d2: 494a ldr r1, [pc, #296] ; (8029afc <HTTP_GetParamsPage1+0x1e4>)
  24679. 80299d4: f7f7 ff56 bl 8021884 <strcat>
  24680. strncat(buf, str, len);
  24681. 80299d8: f89d 2007 ldrb.w r2, [sp, #7]
  24682. 80299dc: a902 add r1, sp, #8
  24683. 80299de: 4620 mov r0, r4
  24684. 80299e0: f7f8 f8f2 bl 8021bc8 <strncat>
  24685. GetLowBatteryBitStr(str, &len);
  24686. 80299e4: a802 add r0, sp, #8
  24687. 80299e6: f10d 0107 add.w r1, sp, #7
  24688. 80299ea: f7fd fc06 bl 80271fa <GetLowBatteryBitStr>
  24689. strcat(buf, ",\"low_battery\":");
  24690. 80299ee: 4620 mov r0, r4
  24691. 80299f0: 4943 ldr r1, [pc, #268] ; (8029b00 <HTTP_GetParamsPage1+0x1e8>)
  24692. 80299f2: f7f7 ff47 bl 8021884 <strcat>
  24693. strncat(buf, str, len);
  24694. 80299f6: f89d 2007 ldrb.w r2, [sp, #7]
  24695. 80299fa: a902 add r1, sp, #8
  24696. 80299fc: 4620 mov r0, r4
  24697. 80299fe: f7f8 f8e3 bl 8021bc8 <strncat>
  24698. GetBatCapacityStr(str, &len);
  24699. 8029a02: a802 add r0, sp, #8
  24700. 8029a04: f10d 0107 add.w r1, sp, #7
  24701. 8029a08: f7fd fc16 bl 8027238 <GetBatCapacityStr>
  24702. strcat(buf, ",\"bat_cap\":\"");
  24703. 8029a0c: 4620 mov r0, r4
  24704. 8029a0e: 493d ldr r1, [pc, #244] ; (8029b04 <HTTP_GetParamsPage1+0x1ec>)
  24705. 8029a10: f7f7 ff38 bl 8021884 <strcat>
  24706. strncat(buf, str, len);
  24707. 8029a14: f89d 2007 ldrb.w r2, [sp, #7]
  24708. 8029a18: a902 add r1, sp, #8
  24709. 8029a1a: 4620 mov r0, r4
  24710. 8029a1c: f7f8 f8d4 bl 8021bc8 <strncat>
  24711. GetInternalTempStr(str, &len);
  24712. 8029a20: a802 add r0, sp, #8
  24713. 8029a22: f10d 0107 add.w r1, sp, #7
  24714. 8029a26: f7fd fc13 bl 8027250 <GetInternalTempStr>
  24715. strcat(buf, "\",\"inner_temp\":\"");
  24716. 8029a2a: 4620 mov r0, r4
  24717. 8029a2c: 4936 ldr r1, [pc, #216] ; (8029b08 <HTTP_GetParamsPage1+0x1f0>)
  24718. 8029a2e: f7f7 ff29 bl 8021884 <strcat>
  24719. strncat(buf, str, len);
  24720. 8029a32: f89d 2007 ldrb.w r2, [sp, #7]
  24721. 8029a36: a902 add r1, sp, #8
  24722. 8029a38: 4620 mov r0, r4
  24723. 8029a3a: f7f8 f8c5 bl 8021bc8 <strncat>
  24724. GetRuntimeStr(str, &len);
  24725. 8029a3e: a802 add r0, sp, #8
  24726. 8029a40: f10d 0107 add.w r1, sp, #7
  24727. 8029a44: f7fd fbfe bl 8027244 <GetRuntimeStr>
  24728. strcat(buf, "\",\"bat_time_left\":\"");
  24729. 8029a48: 4620 mov r0, r4
  24730. 8029a4a: 4930 ldr r1, [pc, #192] ; (8029b0c <HTTP_GetParamsPage1+0x1f4>)
  24731. 8029a4c: f7f7 ff1a bl 8021884 <strcat>
  24732. strncat(buf, str, len);
  24733. 8029a50: f89d 2007 ldrb.w r2, [sp, #7]
  24734. 8029a54: a902 add r1, sp, #8
  24735. 8029a56: 4620 mov r0, r4
  24736. 8029a58: f7f8 f8b6 bl 8021bc8 <strncat>
  24737. // Мониторинг
  24738. // load_monitor (нагрузка, 0 - норма, 1 - fail)
  24739. // temp_monitor (внутренняя температура, 0 - норма, 1 - fail)
  24740. // connect_monitor (связь с UPSом, 0 - норма, 1 - fail)
  24741. GetLoadMonitorStr(str, &len);
  24742. 8029a5c: a802 add r0, sp, #8
  24743. 8029a5e: f10d 0107 add.w r1, sp, #7
  24744. 8029a62: f7fd fbfb bl 802725c <GetLoadMonitorStr>
  24745. strcat(buf, "\",\"load_monitor\":");
  24746. 8029a66: 4620 mov r0, r4
  24747. 8029a68: 4929 ldr r1, [pc, #164] ; (8029b10 <HTTP_GetParamsPage1+0x1f8>)
  24748. 8029a6a: f7f7 ff0b bl 8021884 <strcat>
  24749. strncat(buf, str, len);
  24750. 8029a6e: f89d 2007 ldrb.w r2, [sp, #7]
  24751. 8029a72: a902 add r1, sp, #8
  24752. 8029a74: 4620 mov r0, r4
  24753. 8029a76: f7f8 f8a7 bl 8021bc8 <strncat>
  24754. GetTempMonitorStr(str, &len);
  24755. 8029a7a: a802 add r0, sp, #8
  24756. 8029a7c: f10d 0107 add.w r1, sp, #7
  24757. 8029a80: f7fd fbef bl 8027262 <GetTempMonitorStr>
  24758. strcat(buf, ",\"temp_monitor\":");
  24759. 8029a84: 4620 mov r0, r4
  24760. 8029a86: 4923 ldr r1, [pc, #140] ; (8029b14 <HTTP_GetParamsPage1+0x1fc>)
  24761. 8029a88: f7f7 fefc bl 8021884 <strcat>
  24762. strncat(buf, str, len);
  24763. 8029a8c: f89d 2007 ldrb.w r2, [sp, #7]
  24764. 8029a90: a902 add r1, sp, #8
  24765. 8029a92: 4620 mov r0, r4
  24766. 8029a94: f7f8 f898 bl 8021bc8 <strncat>
  24767. GetConnectMonitorStr(str, &len);
  24768. 8029a98: a802 add r0, sp, #8
  24769. 8029a9a: f10d 0107 add.w r1, sp, #7
  24770. 8029a9e: f7fd fbe3 bl 8027268 <GetConnectMonitorStr>
  24771. strcat(buf, ",\"connect_monitor\":");
  24772. 8029aa2: 4620 mov r0, r4
  24773. 8029aa4: 491c ldr r1, [pc, #112] ; (8029b18 <HTTP_GetParamsPage1+0x200>)
  24774. 8029aa6: f7f7 feed bl 8021884 <strcat>
  24775. strncat(buf, str, len);
  24776. 8029aaa: f89d 2007 ldrb.w r2, [sp, #7]
  24777. 8029aae: a902 add r1, sp, #8
  24778. 8029ab0: 4620 mov r0, r4
  24779. 8029ab2: f7f8 f889 bl 8021bc8 <strncat>
  24780. // Признак изменения сетевых настроек
  24781. GetWebReinitFlag(str, &len);
  24782. 8029ab6: a802 add r0, sp, #8
  24783. 8029ab8: f10d 0107 add.w r1, sp, #7
  24784. 8029abc: f7fd fd50 bl 8027560 <GetWebReinitFlag>
  24785. strcat(buf, ",\"netsettings_changed\":\"");
  24786. 8029ac0: 4620 mov r0, r4
  24787. 8029ac2: 4916 ldr r1, [pc, #88] ; (8029b1c <HTTP_GetParamsPage1+0x204>)
  24788. 8029ac4: f7f7 fede bl 8021884 <strcat>
  24789. strncat(buf, str, len);
  24790. 8029ac8: a902 add r1, sp, #8
  24791. 8029aca: f89d 2007 ldrb.w r2, [sp, #7]
  24792. 8029ace: 4620 mov r0, r4
  24793. 8029ad0: f7f8 f87a bl 8021bc8 <strncat>
  24794. strncat(buf, "\"}", 2);
  24795. 8029ad4: 4620 mov r0, r4
  24796. 8029ad6: 4912 ldr r1, [pc, #72] ; (8029b20 <HTTP_GetParamsPage1+0x208>)
  24797. 8029ad8: 2202 movs r2, #2
  24798. 8029ada: f7f8 f875 bl 8021bc8 <strncat>
  24799. //printf(buf);
  24800. }
  24801. 8029ade: b00c add sp, #48 ; 0x30
  24802. 8029ae0: bd10 pop {r4, pc}
  24803. 8029ae2: bf00 nop
  24804. 8029ae4: 0803a96c .word 0x0803a96c
  24805. 8029ae8: 0803a998 .word 0x0803a998
  24806. 8029aec: 0803a9a0 .word 0x0803a9a0
  24807. 8029af0: 0803a9a9 .word 0x0803a9a9
  24808. 8029af4: 0803a9b7 .word 0x0803a9b7
  24809. 8029af8: 0803a9c6 .word 0x0803a9c6
  24810. 8029afc: 0803a9d0 .word 0x0803a9d0
  24811. 8029b00: 0803a9df .word 0x0803a9df
  24812. 8029b04: 0803a9ef .word 0x0803a9ef
  24813. 8029b08: 0803a9fc .word 0x0803a9fc
  24814. 8029b0c: 0803aa0d .word 0x0803aa0d
  24815. 8029b10: 0803aa21 .word 0x0803aa21
  24816. 8029b14: 0803aa33 .word 0x0803aa33
  24817. 8029b18: 0803aa44 .word 0x0803aa44
  24818. 8029b1c: 0803ab5f .word 0x0803ab5f
  24819. 8029b20: 0803aa58 .word 0x0803aa58
  24820. 08029b24 <HTTP_GetSettings>:
  24821. /**
  24822. * @brief Возвращяет строку с настройками на второй странице
  24823. * @retval None
  24824. */
  24825. void HTTP_GetSettings(char *buf)
  24826. {
  24827. 8029b24: b510 push {r4, lr}
  24828. char str[30];
  24829. uint8_t len;
  24830. /* Headers для поддержки saffari */
  24831. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  24832. 8029b26: 4951 ldr r1, [pc, #324] ; (8029c6c <HTTP_GetSettings+0x148>)
  24833. /**
  24834. * @brief Возвращяет строку с настройками на второй странице
  24835. * @retval None
  24836. */
  24837. void HTTP_GetSettings(char *buf)
  24838. {
  24839. 8029b28: b08a sub sp, #40 ; 0x28
  24840. 8029b2a: 4604 mov r4, r0
  24841. char str[30];
  24842. uint8_t len;
  24843. /* Headers для поддержки saffari */
  24844. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  24845. 8029b2c: f7f7 ffbe bl 8021aac <strcpy>
  24846. /* SNMP */
  24847. GetReadCommunity(str, &len);
  24848. 8029b30: a802 add r0, sp, #8
  24849. 8029b32: f10d 0107 add.w r1, sp, #7
  24850. 8029b36: f7fd fca7 bl 8027488 <GetReadCommunity>
  24851. strcat(buf, "{\"read_community\":\"");
  24852. 8029b3a: 4620 mov r0, r4
  24853. 8029b3c: 494c ldr r1, [pc, #304] ; (8029c70 <HTTP_GetSettings+0x14c>)
  24854. 8029b3e: f7f7 fea1 bl 8021884 <strcat>
  24855. strncat(buf, str, len);
  24856. 8029b42: f89d 2007 ldrb.w r2, [sp, #7]
  24857. 8029b46: a902 add r1, sp, #8
  24858. 8029b48: 4620 mov r0, r4
  24859. 8029b4a: f7f8 f83d bl 8021bc8 <strncat>
  24860. GetWriteCommunity(str, &len);
  24861. 8029b4e: a802 add r0, sp, #8
  24862. 8029b50: f10d 0107 add.w r1, sp, #7
  24863. 8029b54: f7fd fca8 bl 80274a8 <GetWriteCommunity>
  24864. strcat(buf, "\",\"write_community\":\"");
  24865. 8029b58: 4620 mov r0, r4
  24866. 8029b5a: 4946 ldr r1, [pc, #280] ; (8029c74 <HTTP_GetSettings+0x150>)
  24867. 8029b5c: f7f7 fe92 bl 8021884 <strcat>
  24868. strncat(buf, str, len);
  24869. 8029b60: f89d 2007 ldrb.w r2, [sp, #7]
  24870. 8029b64: a902 add r1, sp, #8
  24871. 8029b66: 4620 mov r0, r4
  24872. 8029b68: f7f8 f82e bl 8021bc8 <strncat>
  24873. GetManagerIp(str, &len);
  24874. 8029b6c: a802 add r0, sp, #8
  24875. 8029b6e: f10d 0107 add.w r1, sp, #7
  24876. 8029b72: f7fd fca9 bl 80274c8 <GetManagerIp>
  24877. strcat(buf, "\",\"managerIP\":\"");
  24878. 8029b76: 4620 mov r0, r4
  24879. 8029b78: 493f ldr r1, [pc, #252] ; (8029c78 <HTTP_GetSettings+0x154>)
  24880. 8029b7a: f7f7 fe83 bl 8021884 <strcat>
  24881. strncat(buf, str, len);
  24882. 8029b7e: f89d 2007 ldrb.w r2, [sp, #7]
  24883. 8029b82: a902 add r1, sp, #8
  24884. 8029b84: 4620 mov r0, r4
  24885. 8029b86: f7f8 f81f bl 8021bc8 <strncat>
  24886. GetManagerIp2(str, &len);
  24887. 8029b8a: a802 add r0, sp, #8
  24888. 8029b8c: f10d 0107 add.w r1, sp, #7
  24889. 8029b90: f7fd fcaa bl 80274e8 <GetManagerIp2>
  24890. strcat(buf, "\",\"managerIP2\":\"");
  24891. 8029b94: 4620 mov r0, r4
  24892. 8029b96: 4939 ldr r1, [pc, #228] ; (8029c7c <HTTP_GetSettings+0x158>)
  24893. 8029b98: f7f7 fe74 bl 8021884 <strcat>
  24894. strncat(buf, str, len);
  24895. 8029b9c: f89d 2007 ldrb.w r2, [sp, #7]
  24896. 8029ba0: a902 add r1, sp, #8
  24897. 8029ba2: 4620 mov r0, r4
  24898. 8029ba4: f7f8 f810 bl 8021bc8 <strncat>
  24899. GetManagerIp3(str, &len);
  24900. 8029ba8: a802 add r0, sp, #8
  24901. 8029baa: f10d 0107 add.w r1, sp, #7
  24902. 8029bae: f7fd fcab bl 8027508 <GetManagerIp3>
  24903. strcat(buf, "\",\"managerIP3\":\"");
  24904. 8029bb2: 4620 mov r0, r4
  24905. 8029bb4: 4932 ldr r1, [pc, #200] ; (8029c80 <HTTP_GetSettings+0x15c>)
  24906. 8029bb6: f7f7 fe65 bl 8021884 <strcat>
  24907. strncat(buf, str, len);
  24908. 8029bba: f89d 2007 ldrb.w r2, [sp, #7]
  24909. 8029bbe: a902 add r1, sp, #8
  24910. 8029bc0: 4620 mov r0, r4
  24911. 8029bc2: f7f8 f801 bl 8021bc8 <strncat>
  24912. /* WEB */
  24913. GetIpStr(str, &len);
  24914. 8029bc6: a802 add r0, sp, #8
  24915. 8029bc8: f10d 0107 add.w r1, sp, #7
  24916. 8029bcc: f7fd fc06 bl 80273dc <GetIpStr>
  24917. strcat(buf, "\",\"ipaddr\":\"");
  24918. 8029bd0: 4620 mov r0, r4
  24919. 8029bd2: 492c ldr r1, [pc, #176] ; (8029c84 <HTTP_GetSettings+0x160>)
  24920. 8029bd4: f7f7 fe56 bl 8021884 <strcat>
  24921. strncat(buf, str, len);
  24922. 8029bd8: f89d 2007 ldrb.w r2, [sp, #7]
  24923. 8029bdc: a902 add r1, sp, #8
  24924. 8029bde: 4620 mov r0, r4
  24925. 8029be0: f7f7 fff2 bl 8021bc8 <strncat>
  24926. GetGatewayStr(str, &len);
  24927. 8029be4: a802 add r0, sp, #8
  24928. 8029be6: f10d 0107 add.w r1, sp, #7
  24929. 8029bea: f7fd fc0d bl 8027408 <GetGatewayStr>
  24930. strcat(buf, "\",\"gw\":\"");
  24931. 8029bee: 4620 mov r0, r4
  24932. 8029bf0: 4925 ldr r1, [pc, #148] ; (8029c88 <HTTP_GetSettings+0x164>)
  24933. 8029bf2: f7f7 fe47 bl 8021884 <strcat>
  24934. strncat(buf, str, len);
  24935. 8029bf6: f89d 2007 ldrb.w r2, [sp, #7]
  24936. 8029bfa: a902 add r1, sp, #8
  24937. 8029bfc: 4620 mov r0, r4
  24938. 8029bfe: f7f7 ffe3 bl 8021bc8 <strncat>
  24939. GetMaskStr(str, &len);
  24940. 8029c02: a802 add r0, sp, #8
  24941. 8029c04: f10d 0107 add.w r1, sp, #7
  24942. 8029c08: f7fd fc14 bl 8027434 <GetMaskStr>
  24943. strcat(buf, "\",\"mask\":\"");
  24944. 8029c0c: 4620 mov r0, r4
  24945. 8029c0e: 491f ldr r1, [pc, #124] ; (8029c8c <HTTP_GetSettings+0x168>)
  24946. 8029c10: f7f7 fe38 bl 8021884 <strcat>
  24947. strncat(buf, str, len);
  24948. 8029c14: f89d 2007 ldrb.w r2, [sp, #7]
  24949. 8029c18: a902 add r1, sp, #8
  24950. 8029c1a: 4620 mov r0, r4
  24951. 8029c1c: f7f7 ffd4 bl 8021bc8 <strncat>
  24952. GetDhcpStateStr(str, &len);
  24953. 8029c20: a802 add r0, sp, #8
  24954. 8029c22: f10d 0107 add.w r1, sp, #7
  24955. 8029c26: f7fd fc1b bl 8027460 <GetDhcpStateStr>
  24956. strcat(buf, "\",\"dhcp\":");
  24957. 8029c2a: 4620 mov r0, r4
  24958. 8029c2c: 4918 ldr r1, [pc, #96] ; (8029c90 <HTTP_GetSettings+0x16c>)
  24959. 8029c2e: f7f7 fe29 bl 8021884 <strcat>
  24960. strncat(buf, str, len);
  24961. 8029c32: f89d 2007 ldrb.w r2, [sp, #7]
  24962. 8029c36: a902 add r1, sp, #8
  24963. 8029c38: 4620 mov r0, r4
  24964. 8029c3a: f7f7 ffc5 bl 8021bc8 <strncat>
  24965. /* Признак изменения сетевых настроек */
  24966. GetWebReinitFlag(str, &len);
  24967. 8029c3e: a802 add r0, sp, #8
  24968. 8029c40: f10d 0107 add.w r1, sp, #7
  24969. 8029c44: f7fd fc8c bl 8027560 <GetWebReinitFlag>
  24970. strcat(buf, ",\"netsettings_changed\":\"");
  24971. 8029c48: 4620 mov r0, r4
  24972. 8029c4a: 4912 ldr r1, [pc, #72] ; (8029c94 <HTTP_GetSettings+0x170>)
  24973. 8029c4c: f7f7 fe1a bl 8021884 <strcat>
  24974. strncat(buf, str, len);
  24975. 8029c50: a902 add r1, sp, #8
  24976. 8029c52: f89d 2007 ldrb.w r2, [sp, #7]
  24977. 8029c56: 4620 mov r0, r4
  24978. 8029c58: f7f7 ffb6 bl 8021bc8 <strncat>
  24979. strncat(buf, "\"}", 2);
  24980. 8029c5c: 4620 mov r0, r4
  24981. 8029c5e: 490e ldr r1, [pc, #56] ; (8029c98 <HTTP_GetSettings+0x174>)
  24982. 8029c60: 2202 movs r2, #2
  24983. 8029c62: f7f7 ffb1 bl 8021bc8 <strncat>
  24984. //printf(buf);
  24985. }
  24986. 8029c66: b00a add sp, #40 ; 0x28
  24987. 8029c68: bd10 pop {r4, pc}
  24988. 8029c6a: bf00 nop
  24989. 8029c6c: 0803a96c .word 0x0803a96c
  24990. 8029c70: 0803aa5b .word 0x0803aa5b
  24991. 8029c74: 0803aa6f .word 0x0803aa6f
  24992. 8029c78: 0803aa85 .word 0x0803aa85
  24993. 8029c7c: 0803aa95 .word 0x0803aa95
  24994. 8029c80: 0803aaa6 .word 0x0803aaa6
  24995. 8029c84: 0803aab7 .word 0x0803aab7
  24996. 8029c88: 0803aac4 .word 0x0803aac4
  24997. 8029c8c: 0803aacd .word 0x0803aacd
  24998. 8029c90: 0803aad8 .word 0x0803aad8
  24999. 8029c94: 0803ab5f .word 0x0803ab5f
  25000. 8029c98: 0803aa58 .word 0x0803aa58
  25001. 08029c9c <HTTP_GetInfo>:
  25002. * @brief Возвращяет строку с информацией об устройстве
  25003. * @retval None
  25004. */
  25005. // TODO Согласовать максимальную длину строк
  25006. void HTTP_GetInfo(char *buf)
  25007. {
  25008. 8029c9c: b510 push {r4, lr}
  25009. char str[40];
  25010. uint8_t len;
  25011. /* Headers для поддержки saffari */
  25012. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  25013. 8029c9e: 4951 ldr r1, [pc, #324] ; (8029de4 <HTTP_GetInfo+0x148>)
  25014. * @brief Возвращяет строку с информацией об устройстве
  25015. * @retval None
  25016. */
  25017. // TODO Согласовать максимальную длину строк
  25018. void HTTP_GetInfo(char *buf)
  25019. {
  25020. 8029ca0: b08c sub sp, #48 ; 0x30
  25021. 8029ca2: 4604 mov r4, r0
  25022. char str[40];
  25023. uint8_t len;
  25024. /* Headers для поддержки saffari */
  25025. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  25026. 8029ca4: f7f7 ff02 bl 8021aac <strcpy>
  25027. GetWorkTimeStr(str, &len);
  25028. 8029ca8: a802 add r0, sp, #8
  25029. 8029caa: f10d 0107 add.w r1, sp, #7
  25030. 8029cae: f7fd fadf bl 8027270 <GetWorkTimeStr>
  25031. strcat(buf, "{\"uptime\":\"");
  25032. 8029cb2: 4620 mov r0, r4
  25033. 8029cb4: 494c ldr r1, [pc, #304] ; (8029de8 <HTTP_GetInfo+0x14c>)
  25034. 8029cb6: f7f7 fde5 bl 8021884 <strcat>
  25035. strncat(buf, str, len);
  25036. 8029cba: f89d 2007 ldrb.w r2, [sp, #7]
  25037. 8029cbe: a902 add r1, sp, #8
  25038. 8029cc0: 4620 mov r0, r4
  25039. 8029cc2: f7f7 ff81 bl 8021bc8 <strncat>
  25040. GetModelStr(str, &len);
  25041. 8029cc6: a802 add r0, sp, #8
  25042. 8029cc8: f10d 0107 add.w r1, sp, #7
  25043. 8029ccc: f7fd faf6 bl 80272bc <GetModelStr>
  25044. strcat(buf, "\",\"model\":\"");
  25045. 8029cd0: 4620 mov r0, r4
  25046. 8029cd2: 4946 ldr r1, [pc, #280] ; (8029dec <HTTP_GetInfo+0x150>)
  25047. 8029cd4: f7f7 fdd6 bl 8021884 <strcat>
  25048. strncat(buf, str, len);
  25049. 8029cd8: f89d 2007 ldrb.w r2, [sp, #7]
  25050. 8029cdc: a902 add r1, sp, #8
  25051. 8029cde: 4620 mov r0, r4
  25052. 8029ce0: f7f7 ff72 bl 8021bc8 <strncat>
  25053. GetProductionDataStr(str, &len);
  25054. 8029ce4: a802 add r0, sp, #8
  25055. 8029ce6: f10d 0107 add.w r1, sp, #7
  25056. 8029cea: f7fd faf9 bl 80272e0 <GetProductionDataStr>
  25057. strcat(buf, "\",\"prodate\":\"");
  25058. 8029cee: 4620 mov r0, r4
  25059. 8029cf0: 493f ldr r1, [pc, #252] ; (8029df0 <HTTP_GetInfo+0x154>)
  25060. 8029cf2: f7f7 fdc7 bl 8021884 <strcat>
  25061. strncat(buf, str, len);
  25062. 8029cf6: f89d 2007 ldrb.w r2, [sp, #7]
  25063. 8029cfa: a902 add r1, sp, #8
  25064. 8029cfc: 4620 mov r0, r4
  25065. 8029cfe: f7f7 ff63 bl 8021bc8 <strncat>
  25066. GetVersionStr(str, &len);
  25067. 8029d02: a802 add r0, sp, #8
  25068. 8029d04: f10d 0107 add.w r1, sp, #7
  25069. 8029d08: f7fd fafc bl 8027304 <GetVersionStr>
  25070. strcat(buf, "\",\"fwversion\":\"");
  25071. 8029d0c: 4620 mov r0, r4
  25072. 8029d0e: 4939 ldr r1, [pc, #228] ; (8029df4 <HTTP_GetInfo+0x158>)
  25073. 8029d10: f7f7 fdb8 bl 8021884 <strcat>
  25074. strncat(buf, str, len);
  25075. 8029d14: f89d 2007 ldrb.w r2, [sp, #7]
  25076. 8029d18: a902 add r1, sp, #8
  25077. 8029d1a: 4620 mov r0, r4
  25078. 8029d1c: f7f7 ff54 bl 8021bc8 <strncat>
  25079. GetMacStr(str, &len);
  25080. 8029d20: a802 add r0, sp, #8
  25081. 8029d22: f10d 0107 add.w r1, sp, #7
  25082. 8029d26: f7fd faff bl 8027328 <GetMacStr>
  25083. strcat(buf, "\",\"macaddr\":\"");
  25084. 8029d2a: 4620 mov r0, r4
  25085. 8029d2c: 4932 ldr r1, [pc, #200] ; (8029df8 <HTTP_GetInfo+0x15c>)
  25086. 8029d2e: f7f7 fda9 bl 8021884 <strcat>
  25087. strncat(buf, str, len);
  25088. 8029d32: f89d 2007 ldrb.w r2, [sp, #7]
  25089. 8029d36: a902 add r1, sp, #8
  25090. 8029d38: 4620 mov r0, r4
  25091. 8029d3a: f7f7 ff45 bl 8021bc8 <strncat>
  25092. GetSerialNumberStr(str, &len);
  25093. 8029d3e: a802 add r0, sp, #8
  25094. 8029d40: f10d 0107 add.w r1, sp, #7
  25095. 8029d44: f7fd fb02 bl 802734c <GetSerialNumberStr>
  25096. strcat(buf, "\",\"serno\":\"");
  25097. 8029d48: 4620 mov r0, r4
  25098. 8029d4a: 492c ldr r1, [pc, #176] ; (8029dfc <HTTP_GetInfo+0x160>)
  25099. 8029d4c: f7f7 fd9a bl 8021884 <strcat>
  25100. strncat(buf, str, len);
  25101. 8029d50: f89d 2007 ldrb.w r2, [sp, #7]
  25102. 8029d54: a902 add r1, sp, #8
  25103. 8029d56: 4620 mov r0, r4
  25104. 8029d58: f7f7 ff36 bl 8021bc8 <strncat>
  25105. GetOwnerStr(str, &len);
  25106. 8029d5c: a802 add r0, sp, #8
  25107. 8029d5e: f10d 0107 add.w r1, sp, #7
  25108. 8029d62: f7fd fb05 bl 8027370 <GetOwnerStr>
  25109. strcat(buf, "\",\"owner\":\"");
  25110. 8029d66: 4620 mov r0, r4
  25111. 8029d68: 4925 ldr r1, [pc, #148] ; (8029e00 <HTTP_GetInfo+0x164>)
  25112. 8029d6a: f7f7 fd8b bl 8021884 <strcat>
  25113. strncat(buf, str, len);
  25114. 8029d6e: f89d 2007 ldrb.w r2, [sp, #7]
  25115. 8029d72: a902 add r1, sp, #8
  25116. 8029d74: 4620 mov r0, r4
  25117. 8029d76: f7f7 ff27 bl 8021bc8 <strncat>
  25118. GetLocationStr(str, &len);
  25119. 8029d7a: a802 add r0, sp, #8
  25120. 8029d7c: f10d 0107 add.w r1, sp, #7
  25121. 8029d80: f7fd fb08 bl 8027394 <GetLocationStr>
  25122. strcat(buf, "\",\"sysLocation\":\"");
  25123. 8029d84: 4620 mov r0, r4
  25124. 8029d86: 491f ldr r1, [pc, #124] ; (8029e04 <HTTP_GetInfo+0x168>)
  25125. 8029d88: f7f7 fd7c bl 8021884 <strcat>
  25126. strncat(buf, str, len);
  25127. 8029d8c: f89d 2007 ldrb.w r2, [sp, #7]
  25128. 8029d90: a902 add r1, sp, #8
  25129. 8029d92: 4620 mov r0, r4
  25130. 8029d94: f7f7 ff18 bl 8021bc8 <strncat>
  25131. GetCommentsStr(str, &len);
  25132. 8029d98: a802 add r0, sp, #8
  25133. 8029d9a: f10d 0107 add.w r1, sp, #7
  25134. 8029d9e: f7fd fb0b bl 80273b8 <GetCommentsStr>
  25135. strcat(buf, "\",\"comment\":\"");
  25136. 8029da2: 4620 mov r0, r4
  25137. 8029da4: 4918 ldr r1, [pc, #96] ; (8029e08 <HTTP_GetInfo+0x16c>)
  25138. 8029da6: f7f7 fd6d bl 8021884 <strcat>
  25139. strncat(buf, str, len);
  25140. 8029daa: f89d 2007 ldrb.w r2, [sp, #7]
  25141. 8029dae: a902 add r1, sp, #8
  25142. 8029db0: 4620 mov r0, r4
  25143. 8029db2: f7f7 ff09 bl 8021bc8 <strncat>
  25144. /* Признак изменения сетевых настроек */
  25145. GetWebReinitFlag(str, &len);
  25146. 8029db6: a802 add r0, sp, #8
  25147. 8029db8: f10d 0107 add.w r1, sp, #7
  25148. 8029dbc: f7fd fbd0 bl 8027560 <GetWebReinitFlag>
  25149. strcat(buf, "\",\"netsettings_changed\":\"");
  25150. 8029dc0: 4620 mov r0, r4
  25151. 8029dc2: 4912 ldr r1, [pc, #72] ; (8029e0c <HTTP_GetInfo+0x170>)
  25152. 8029dc4: f7f7 fd5e bl 8021884 <strcat>
  25153. strncat(buf, str, len);
  25154. 8029dc8: a902 add r1, sp, #8
  25155. 8029dca: f89d 2007 ldrb.w r2, [sp, #7]
  25156. 8029dce: 4620 mov r0, r4
  25157. 8029dd0: f7f7 fefa bl 8021bc8 <strncat>
  25158. strncat(buf, "\"}", 2);
  25159. 8029dd4: 4620 mov r0, r4
  25160. 8029dd6: 490e ldr r1, [pc, #56] ; (8029e10 <HTTP_GetInfo+0x174>)
  25161. 8029dd8: 2202 movs r2, #2
  25162. 8029dda: f7f7 fef5 bl 8021bc8 <strncat>
  25163. }
  25164. 8029dde: b00c add sp, #48 ; 0x30
  25165. 8029de0: bd10 pop {r4, pc}
  25166. 8029de2: bf00 nop
  25167. 8029de4: 0803a96c .word 0x0803a96c
  25168. 8029de8: 0803aae2 .word 0x0803aae2
  25169. 8029dec: 0803aaee .word 0x0803aaee
  25170. 8029df0: 0803aafa .word 0x0803aafa
  25171. 8029df4: 0803ab08 .word 0x0803ab08
  25172. 8029df8: 0803ab18 .word 0x0803ab18
  25173. 8029dfc: 0803ab26 .word 0x0803ab26
  25174. 8029e00: 0803ab32 .word 0x0803ab32
  25175. 8029e04: 0803ab3e .word 0x0803ab3e
  25176. 8029e08: 0803ab50 .word 0x0803ab50
  25177. 8029e0c: 0803ab5e .word 0x0803ab5e
  25178. 8029e10: 0803aa58 .word 0x0803aa58
  25179. 08029e14 <HTTP_GetProgonParams>:
  25180. /**
  25181. * @brief Возвращает uptime, freq, dutycicle
  25182. */
  25183. void HTTP_GetProgonParams(char *buf)
  25184. {
  25185. 8029e14: b510 push {r4, lr}
  25186. char str[20];
  25187. u32_t tick;
  25188. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  25189. 8029e16: 4915 ldr r1, [pc, #84] ; (8029e6c <HTTP_GetProgonParams+0x58>)
  25190. /**
  25191. * @brief Возвращает uptime, freq, dutycicle
  25192. */
  25193. void HTTP_GetProgonParams(char *buf)
  25194. {
  25195. 8029e18: b086 sub sp, #24
  25196. 8029e1a: 4604 mov r4, r0
  25197. char str[20];
  25198. u32_t tick;
  25199. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  25200. 8029e1c: f7f7 fe46 bl 8021aac <strcpy>
  25201. strcat(buf, "{\"uptime\":\"");
  25202. 8029e20: 4913 ldr r1, [pc, #76] ; (8029e70 <HTTP_GetProgonParams+0x5c>)
  25203. 8029e22: 4620 mov r0, r4
  25204. 8029e24: f7f7 fd2e bl 8021884 <strcat>
  25205. snmp_get_sysuptime(&tick);
  25206. 8029e28: 4668 mov r0, sp
  25207. 8029e2a: f005 fd03 bl 802f834 <snmp_get_sysuptime>
  25208. tick = tick/100;
  25209. 8029e2e: 9b00 ldr r3, [sp, #0]
  25210. 8029e30: 2264 movs r2, #100 ; 0x64
  25211. 8029e32: fbb3 f3f2 udiv r3, r3, r2
  25212. memset(str, 0, 20);
  25213. 8029e36: 2100 movs r1, #0
  25214. 8029e38: 2214 movs r2, #20
  25215. 8029e3a: a801 add r0, sp, #4
  25216. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  25217. strcat(buf, "{\"uptime\":\"");
  25218. snmp_get_sysuptime(&tick);
  25219. tick = tick/100;
  25220. 8029e3c: 9300 str r3, [sp, #0]
  25221. memset(str, 0, 20);
  25222. 8029e3e: f7f7 fcbb bl 80217b8 <memset>
  25223. sprintf(str, "%d", tick);
  25224. 8029e42: 9a00 ldr r2, [sp, #0]
  25225. 8029e44: 490b ldr r1, [pc, #44] ; (8029e74 <HTTP_GetProgonParams+0x60>)
  25226. 8029e46: a801 add r0, sp, #4
  25227. 8029e48: f7fd f9c8 bl 80271dc <tfp_sprintf>
  25228. strncat(buf, str, strlen(str));
  25229. 8029e4c: a801 add r0, sp, #4
  25230. 8029e4e: f7f7 fe8b bl 8021b68 <strlen>
  25231. 8029e52: a901 add r1, sp, #4
  25232. 8029e54: 4602 mov r2, r0
  25233. 8029e56: 4620 mov r0, r4
  25234. 8029e58: f7f7 feb6 bl 8021bc8 <strncat>
  25235. strncat(buf, "\"}", 2);
  25236. 8029e5c: 4620 mov r0, r4
  25237. 8029e5e: 4906 ldr r1, [pc, #24] ; (8029e78 <HTTP_GetProgonParams+0x64>)
  25238. 8029e60: 2202 movs r2, #2
  25239. 8029e62: f7f7 feb1 bl 8021bc8 <strncat>
  25240. }
  25241. 8029e66: b006 add sp, #24
  25242. 8029e68: bd10 pop {r4, pc}
  25243. 8029e6a: bf00 nop
  25244. 8029e6c: 0803a96c .word 0x0803a96c
  25245. 8029e70: 0803aae2 .word 0x0803aae2
  25246. 8029e74: 0803ab78 .word 0x0803ab78
  25247. 8029e78: 0803aa58 .word 0x0803aa58
  25248. 08029e7c <HTTP_ResetSettings>:
  25249. /**
  25250. * @brief Сброс настроек (всё кроме сетевых параметров)
  25251. */
  25252. void HTTP_ResetSettings(void)
  25253. {
  25254. 8029e7c: b508 push {r3, lr}
  25255. //taskENTER_CRITICAL();
  25256. SETTINGS_SetPartDefault();
  25257. 8029e7e: f7fd fd6d bl 802795c <SETTINGS_SetPartDefault>
  25258. SETTINGS_Save();
  25259. //taskEXIT_CRITICAL();
  25260. }
  25261. 8029e82: e8bd 4008 ldmia.w sp!, {r3, lr}
  25262. void HTTP_ResetSettings(void)
  25263. {
  25264. //taskENTER_CRITICAL();
  25265. SETTINGS_SetPartDefault();
  25266. SETTINGS_Save();
  25267. 8029e86: f7fd bd19 b.w 80278bc <SETTINGS_Save>
  25268. 08029e8a <HTTP_SaveSettings>:
  25269. */
  25270. void HTTP_SaveSettings(void)
  25271. {
  25272. // taskENTER_CRITICAL();
  25273. SETTINGS_Save();
  25274. 8029e8a: f7fd bd17 b.w 80278bc <SETTINGS_Save>
  25275. 08029e8e <HTTP_Reboot>:
  25276. /**
  25277. * @brief Перезагрузка контроллера
  25278. */
  25279. void HTTP_Reboot(void)
  25280. {
  25281. 8029e8e: b508 push {r3, lr}
  25282. vTaskDelay(1010);
  25283. 8029e90: f240 30f2 movw r0, #1010 ; 0x3f2
  25284. 8029e94: f7fe fd5e bl 8028954 <vTaskDelay>
  25285. NVIC_SystemReset();
  25286. 8029e98: f7ff fd1a bl 80298d0 <NVIC_SystemReset>
  25287. 08029e9c <HTTP_StartResetTask>:
  25288. * bootloader и перезаписаны настройки
  25289. *
  25290. * false - обычная перезагрузка
  25291. */
  25292. void HTTP_StartResetTask(bool fBootMode)
  25293. {
  25294. 8029e9c: b51f push {r0, r1, r2, r3, r4, lr}
  25295. static bool temp;
  25296. temp = fBootMode;
  25297. 8029e9e: 4b07 ldr r3, [pc, #28] ; (8029ebc <HTTP_StartResetTask+0x20>)
  25298. xTaskCreate(vTaskReboot, "RebootTask", configMINIMAL_STACK_SIZE,
  25299. 8029ea0: 4907 ldr r1, [pc, #28] ; (8029ec0 <HTTP_StartResetTask+0x24>)
  25300. */
  25301. void HTTP_StartResetTask(bool fBootMode)
  25302. {
  25303. static bool temp;
  25304. temp = fBootMode;
  25305. 8029ea2: 7018 strb r0, [r3, #0]
  25306. xTaskCreate(vTaskReboot, "RebootTask", configMINIMAL_STACK_SIZE,
  25307. 8029ea4: 2200 movs r2, #0
  25308. 8029ea6: 9200 str r2, [sp, #0]
  25309. 8029ea8: 9201 str r2, [sp, #4]
  25310. 8029eaa: 9202 str r2, [sp, #8]
  25311. 8029eac: 9203 str r2, [sp, #12]
  25312. 8029eae: 4805 ldr r0, [pc, #20] ; (8029ec4 <HTTP_StartResetTask+0x28>)
  25313. 8029eb0: 2280 movs r2, #128 ; 0x80
  25314. 8029eb2: f7fe fab9 bl 8028428 <xTaskGenericCreate>
  25315. (void*)&temp, tskIDLE_PRIORITY, NULL);
  25316. }
  25317. 8029eb6: b005 add sp, #20
  25318. 8029eb8: bd00 pop {pc}
  25319. 8029eba: bf00 nop
  25320. 8029ebc: 200029fa .word 0x200029fa
  25321. 8029ec0: 0803ab7b .word 0x0803ab7b
  25322. 8029ec4: 080298f1 .word 0x080298f1
  25323. 08029ec8 <tcpip_thread>:
  25324. tcpip_thread(void *arg)
  25325. {
  25326. struct tcpip_msg *msg;
  25327. LWIP_UNUSED_ARG(arg);
  25328. if (tcpip_init_done != NULL) {
  25329. 8029ec8: 4b1e ldr r3, [pc, #120] ; (8029f44 <tcpip_thread+0x7c>)
  25330. 8029eca: 681b ldr r3, [r3, #0]
  25331. *
  25332. * @param arg unused argument
  25333. */
  25334. static void
  25335. tcpip_thread(void *arg)
  25336. {
  25337. 8029ecc: b507 push {r0, r1, r2, lr}
  25338. struct tcpip_msg *msg;
  25339. LWIP_UNUSED_ARG(arg);
  25340. if (tcpip_init_done != NULL) {
  25341. 8029ece: b113 cbz r3, 8029ed6 <tcpip_thread+0xe>
  25342. tcpip_init_done(tcpip_init_done_arg);
  25343. 8029ed0: 4a1d ldr r2, [pc, #116] ; (8029f48 <tcpip_thread+0x80>)
  25344. 8029ed2: 6810 ldr r0, [r2, #0]
  25345. 8029ed4: 4798 blx r3
  25346. LOCK_TCPIP_CORE();
  25347. while (1) { /* MAIN Loop */
  25348. UNLOCK_TCPIP_CORE();
  25349. LWIP_TCPIP_THREAD_ALIVE();
  25350. /* wait for a message, timeouts are processed while waiting */
  25351. sys_timeouts_mbox_fetch(&mbox, (void **)&msg);
  25352. 8029ed6: 481d ldr r0, [pc, #116] ; (8029f4c <tcpip_thread+0x84>)
  25353. 8029ed8: a901 add r1, sp, #4
  25354. 8029eda: f003 fd0d bl 802d8f8 <sys_timeouts_mbox_fetch>
  25355. LOCK_TCPIP_CORE();
  25356. switch (msg->type) {
  25357. 8029ede: 9b01 ldr r3, [sp, #4]
  25358. 8029ee0: 781a ldrb r2, [r3, #0]
  25359. 8029ee2: 2a05 cmp r2, #5
  25360. 8029ee4: d8f7 bhi.n 8029ed6 <tcpip_thread+0xe>
  25361. 8029ee6: e8df f002 tbb [pc, r2]
  25362. 8029eea: 0703 .short 0x0703
  25363. 8029eec: 28201b15 .word 0x28201b15
  25364. #if LWIP_NETCONN
  25365. case TCPIP_MSG_API:
  25366. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg));
  25367. msg->msg.apimsg->function(&(msg->msg.apimsg->msg));
  25368. 8029ef0: 6898 ldr r0, [r3, #8]
  25369. 8029ef2: 6803 ldr r3, [r0, #0]
  25370. 8029ef4: 3004 adds r0, #4
  25371. 8029ef6: e7ed b.n 8029ed4 <tcpip_thread+0xc>
  25372. #if !LWIP_TCPIP_CORE_LOCKING_INPUT
  25373. case TCPIP_MSG_INPKT:
  25374. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
  25375. #if LWIP_ETHERNET
  25376. if (msg->msg.inp.netif->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {
  25377. 8029ef8: 68d9 ldr r1, [r3, #12]
  25378. ethernet_input(msg->msg.inp.p, msg->msg.inp.netif);
  25379. 8029efa: 6898 ldr r0, [r3, #8]
  25380. #if !LWIP_TCPIP_CORE_LOCKING_INPUT
  25381. case TCPIP_MSG_INPKT:
  25382. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
  25383. #if LWIP_ETHERNET
  25384. if (msg->msg.inp.netif->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {
  25385. 8029efc: f891 202d ldrb.w r2, [r1, #45] ; 0x2d
  25386. 8029f00: f012 0f60 tst.w r2, #96 ; 0x60
  25387. 8029f04: d002 beq.n 8029f0c <tcpip_thread+0x44>
  25388. ethernet_input(msg->msg.inp.p, msg->msg.inp.netif);
  25389. 8029f06: f008 fb51 bl 80325ac <ethernet_input>
  25390. 8029f0a: e001 b.n 8029f10 <tcpip_thread+0x48>
  25391. } else
  25392. #endif /* LWIP_ETHERNET */
  25393. {
  25394. ip_input(msg->msg.inp.p, msg->msg.inp.netif);
  25395. 8029f0c: f004 f94e bl 802e1ac <ip_input>
  25396. }
  25397. memp_free(MEMP_TCPIP_MSG_INPKT, msg);
  25398. 8029f10: 2008 movs r0, #8
  25399. 8029f12: e00e b.n 8029f32 <tcpip_thread+0x6a>
  25400. #endif /* LWIP_NETIF_API */
  25401. #if LWIP_TCPIP_TIMEOUT
  25402. case TCPIP_MSG_TIMEOUT:
  25403. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: TIMEOUT %p\n", (void *)msg));
  25404. sys_timeout(msg->msg.tmo.msecs, msg->msg.tmo.h, msg->msg.tmo.arg);
  25405. 8029f14: f103 0008 add.w r0, r3, #8
  25406. 8029f18: c807 ldmia r0, {r0, r1, r2}
  25407. 8029f1a: f003 fc1f bl 802d75c <sys_timeout>
  25408. 8029f1e: e007 b.n 8029f30 <tcpip_thread+0x68>
  25409. memp_free(MEMP_TCPIP_MSG_API, msg);
  25410. break;
  25411. case TCPIP_MSG_UNTIMEOUT:
  25412. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: UNTIMEOUT %p\n", (void *)msg));
  25413. sys_untimeout(msg->msg.tmo.h, msg->msg.tmo.arg);
  25414. 8029f20: 68d8 ldr r0, [r3, #12]
  25415. 8029f22: 6919 ldr r1, [r3, #16]
  25416. 8029f24: f003 fcc4 bl 802d8b0 <sys_untimeout>
  25417. 8029f28: e002 b.n 8029f30 <tcpip_thread+0x68>
  25418. break;
  25419. #endif /* LWIP_TCPIP_TIMEOUT */
  25420. case TCPIP_MSG_CALLBACK:
  25421. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p\n", (void *)msg));
  25422. msg->msg.cb.function(msg->msg.cb.ctx);
  25423. 8029f2a: 689a ldr r2, [r3, #8]
  25424. 8029f2c: 68d8 ldr r0, [r3, #12]
  25425. 8029f2e: 4790 blx r2
  25426. memp_free(MEMP_TCPIP_MSG_API, msg);
  25427. 8029f30: 2007 movs r0, #7
  25428. 8029f32: 9901 ldr r1, [sp, #4]
  25429. 8029f34: f001 f882 bl 802b03c <memp_free>
  25430. break;
  25431. 8029f38: e7cd b.n 8029ed6 <tcpip_thread+0xe>
  25432. case TCPIP_MSG_CALLBACK_STATIC:
  25433. LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK_STATIC %p\n", (void *)msg));
  25434. msg->msg.cb.function(msg->msg.cb.ctx);
  25435. 8029f3a: 689a ldr r2, [r3, #8]
  25436. 8029f3c: 68d8 ldr r0, [r3, #12]
  25437. 8029f3e: 4790 blx r2
  25438. break;
  25439. 8029f40: e7c9 b.n 8029ed6 <tcpip_thread+0xe>
  25440. 8029f42: bf00 nop
  25441. 8029f44: 20002a04 .word 0x20002a04
  25442. 8029f48: 20002a00 .word 0x20002a00
  25443. 8029f4c: 200029fc .word 0x200029fc
  25444. 08029f50 <tcpip_input>:
  25445. * NETIF_FLAG_ETHERNET flags)
  25446. * @param inp the network interface on which the packet was received
  25447. */
  25448. err_t
  25449. tcpip_input(struct pbuf *p, struct netif *inp)
  25450. {
  25451. 8029f50: b5f8 push {r3, r4, r5, r6, r7, lr}
  25452. UNLOCK_TCPIP_CORE();
  25453. return ret;
  25454. #else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  25455. struct tcpip_msg *msg;
  25456. if (!sys_mbox_valid(&mbox)) {
  25457. 8029f52: 4d0e ldr r5, [pc, #56] ; (8029f8c <tcpip_input+0x3c>)
  25458. 8029f54: 682b ldr r3, [r5, #0]
  25459. * NETIF_FLAG_ETHERNET flags)
  25460. * @param inp the network interface on which the packet was received
  25461. */
  25462. err_t
  25463. tcpip_input(struct pbuf *p, struct netif *inp)
  25464. {
  25465. 8029f56: 4606 mov r6, r0
  25466. 8029f58: 460f mov r7, r1
  25467. UNLOCK_TCPIP_CORE();
  25468. return ret;
  25469. #else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  25470. struct tcpip_msg *msg;
  25471. if (!sys_mbox_valid(&mbox)) {
  25472. 8029f5a: b193 cbz r3, 8029f82 <tcpip_input+0x32>
  25473. return ERR_VAL;
  25474. }
  25475. msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);
  25476. 8029f5c: 2008 movs r0, #8
  25477. 8029f5e: f001 f857 bl 802b010 <memp_malloc>
  25478. if (msg == NULL) {
  25479. 8029f62: 4604 mov r4, r0
  25480. 8029f64: b178 cbz r0, 8029f86 <tcpip_input+0x36>
  25481. return ERR_MEM;
  25482. }
  25483. msg->type = TCPIP_MSG_INPKT;
  25484. 8029f66: 2301 movs r3, #1
  25485. 8029f68: 7003 strb r3, [r0, #0]
  25486. msg->msg.inp.p = p;
  25487. 8029f6a: 6086 str r6, [r0, #8]
  25488. msg->msg.inp.netif = inp;
  25489. 8029f6c: 60c7 str r7, [r0, #12]
  25490. if (sys_mbox_trypost(&mbox, msg) != ERR_OK) {
  25491. 8029f6e: 4621 mov r1, r4
  25492. 8029f70: 4628 mov r0, r5
  25493. 8029f72: f008 fd69 bl 8032a48 <sys_mbox_trypost>
  25494. 8029f76: b138 cbz r0, 8029f88 <tcpip_input+0x38>
  25495. memp_free(MEMP_TCPIP_MSG_INPKT, msg);
  25496. 8029f78: 2008 movs r0, #8
  25497. 8029f7a: 4621 mov r1, r4
  25498. 8029f7c: f001 f85e bl 802b03c <memp_free>
  25499. 8029f80: e001 b.n 8029f86 <tcpip_input+0x36>
  25500. return ret;
  25501. #else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  25502. struct tcpip_msg *msg;
  25503. if (!sys_mbox_valid(&mbox)) {
  25504. return ERR_VAL;
  25505. 8029f82: 20fa movs r0, #250 ; 0xfa
  25506. 8029f84: e000 b.n 8029f88 <tcpip_input+0x38>
  25507. }
  25508. msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);
  25509. if (msg == NULL) {
  25510. return ERR_MEM;
  25511. 8029f86: 20ff movs r0, #255 ; 0xff
  25512. memp_free(MEMP_TCPIP_MSG_INPKT, msg);
  25513. return ERR_MEM;
  25514. }
  25515. return ERR_OK;
  25516. #endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */
  25517. }
  25518. 8029f88: b240 sxtb r0, r0
  25519. 8029f8a: bdf8 pop {r3, r4, r5, r6, r7, pc}
  25520. 8029f8c: 200029fc .word 0x200029fc
  25521. 08029f90 <tcpip_init>:
  25522. * @param initfunc a function to call when tcpip_thread is running and finished initializing
  25523. * @param arg argument to pass to initfunc
  25524. */
  25525. void
  25526. tcpip_init(tcpip_init_done_fn initfunc, void *arg)
  25527. {
  25528. 8029f90: b537 push {r0, r1, r2, r4, r5, lr}
  25529. 8029f92: 4604 mov r4, r0
  25530. 8029f94: 460d mov r5, r1
  25531. lwip_init();
  25532. 8029f96: f000 feb3 bl 802ad00 <lwip_init>
  25533. tcpip_init_done = initfunc;
  25534. 8029f9a: 4b09 ldr r3, [pc, #36] ; (8029fc0 <tcpip_init+0x30>)
  25535. tcpip_init_done_arg = arg;
  25536. if(sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
  25537. 8029f9c: 4809 ldr r0, [pc, #36] ; (8029fc4 <tcpip_init+0x34>)
  25538. void
  25539. tcpip_init(tcpip_init_done_fn initfunc, void *arg)
  25540. {
  25541. lwip_init();
  25542. tcpip_init_done = initfunc;
  25543. 8029f9e: 601c str r4, [r3, #0]
  25544. tcpip_init_done_arg = arg;
  25545. 8029fa0: 4b09 ldr r3, [pc, #36] ; (8029fc8 <tcpip_init+0x38>)
  25546. if(sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
  25547. 8029fa2: 2132 movs r1, #50 ; 0x32
  25548. tcpip_init(tcpip_init_done_fn initfunc, void *arg)
  25549. {
  25550. lwip_init();
  25551. tcpip_init_done = initfunc;
  25552. tcpip_init_done_arg = arg;
  25553. 8029fa4: 601d str r5, [r3, #0]
  25554. if(sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
  25555. 8029fa6: f008 fd41 bl 8032a2c <sys_mbox_new>
  25556. if(sys_mutex_new(&lock_tcpip_core) != ERR_OK) {
  25557. LWIP_ASSERT("failed to create lock_tcpip_core", 0);
  25558. }
  25559. #endif /* LWIP_TCPIP_CORE_LOCKING */
  25560. sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);
  25561. 8029faa: 2303 movs r3, #3
  25562. 8029fac: 9300 str r3, [sp, #0]
  25563. 8029fae: 4907 ldr r1, [pc, #28] ; (8029fcc <tcpip_init+0x3c>)
  25564. 8029fb0: 4807 ldr r0, [pc, #28] ; (8029fd0 <tcpip_init+0x40>)
  25565. 8029fb2: 2200 movs r2, #0
  25566. 8029fb4: f44f 73c8 mov.w r3, #400 ; 0x190
  25567. 8029fb8: f008 fdb7 bl 8032b2a <sys_thread_new>
  25568. }
  25569. 8029fbc: bd3e pop {r1, r2, r3, r4, r5, pc}
  25570. 8029fbe: bf00 nop
  25571. 8029fc0: 20002a04 .word 0x20002a04
  25572. 8029fc4: 200029fc .word 0x200029fc
  25573. 8029fc8: 20002a00 .word 0x20002a00
  25574. 8029fcc: 08029ec9 .word 0x08029ec9
  25575. 8029fd0: 0803ab86 .word 0x0803ab86
  25576. 08029fd4 <lwip_htons>:
  25577. * @return n in network byte order
  25578. */
  25579. u16_t
  25580. lwip_htons(u16_t n)
  25581. {
  25582. return ((n & 0xff) << 8) | ((n & 0xff00) >> 8);
  25583. 8029fd4: 0a03 lsrs r3, r0, #8
  25584. 8029fd6: ea43 2000 orr.w r0, r3, r0, lsl #8
  25585. }
  25586. 8029fda: b280 uxth r0, r0
  25587. 8029fdc: 4770 bx lr
  25588. 08029fde <lwip_ntohs>:
  25589. * @return n in network byte order
  25590. */
  25591. u16_t
  25592. lwip_htons(u16_t n)
  25593. {
  25594. return ((n & 0xff) << 8) | ((n & 0xff00) >> 8);
  25595. 8029fde: 0a03 lsrs r3, r0, #8
  25596. 8029fe0: ea43 2000 orr.w r0, r3, r0, lsl #8
  25597. */
  25598. u16_t
  25599. lwip_ntohs(u16_t n)
  25600. {
  25601. return lwip_htons(n);
  25602. }
  25603. 8029fe4: b280 uxth r0, r0
  25604. 8029fe6: 4770 bx lr
  25605. 08029fe8 <lwip_htonl>:
  25606. {
  25607. return ((n & 0xff) << 24) |
  25608. ((n & 0xff00) << 8) |
  25609. ((n & 0xff0000UL) >> 8) |
  25610. ((n & 0xff000000UL) >> 24);
  25611. }
  25612. 8029fe8: ba00 rev r0, r0
  25613. 8029fea: 4770 bx lr
  25614. 08029fec <lwip_ntohl>:
  25615. * @return n in host byte order
  25616. */
  25617. u32_t
  25618. lwip_ntohl(u32_t n)
  25619. {
  25620. return lwip_htonl(n);
  25621. 8029fec: f7ff bffc b.w 8029fe8 <lwip_htonl>
  25622. 08029ff0 <dhcp_set_state>:
  25623. * If the state changed, reset the number of tries.
  25624. */
  25625. static void
  25626. dhcp_set_state(struct dhcp *dhcp, u8_t new_state)
  25627. {
  25628. if (new_state != dhcp->state) {
  25629. 8029ff0: 7b03 ldrb r3, [r0, #12]
  25630. 8029ff2: 428b cmp r3, r1
  25631. 8029ff4: d003 beq.n 8029ffe <dhcp_set_state+0xe>
  25632. dhcp->state = new_state;
  25633. dhcp->tries = 0;
  25634. 8029ff6: 2300 movs r3, #0
  25635. */
  25636. static void
  25637. dhcp_set_state(struct dhcp *dhcp, u8_t new_state)
  25638. {
  25639. if (new_state != dhcp->state) {
  25640. dhcp->state = new_state;
  25641. 8029ff8: 7301 strb r1, [r0, #12]
  25642. dhcp->tries = 0;
  25643. 8029ffa: 7343 strb r3, [r0, #13]
  25644. dhcp->request_timeout = 0;
  25645. 8029ffc: 8343 strh r3, [r0, #26]
  25646. 8029ffe: 4770 bx lr
  25647. 0802a000 <dhcp_option>:
  25648. */
  25649. static void
  25650. dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len)
  25651. {
  25652. LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN);
  25653. dhcp->msg_out->options[dhcp->options_out_len++] = option_type;
  25654. 802a000: 8b03 ldrh r3, [r0, #24]
  25655. * DHCP message.
  25656. *
  25657. */
  25658. static void
  25659. dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len)
  25660. {
  25661. 802a002: b510 push {r4, lr}
  25662. LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN);
  25663. dhcp->msg_out->options[dhcp->options_out_len++] = option_type;
  25664. 802a004: 6944 ldr r4, [r0, #20]
  25665. 802a006: 18e4 adds r4, r4, r3
  25666. 802a008: f884 10f0 strb.w r1, [r4, #240] ; 0xf0
  25667. dhcp->msg_out->options[dhcp->options_out_len++] = option_len;
  25668. 802a00c: 6941 ldr r1, [r0, #20]
  25669. */
  25670. static void
  25671. dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len)
  25672. {
  25673. LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN);
  25674. dhcp->msg_out->options[dhcp->options_out_len++] = option_type;
  25675. 802a00e: 1c5c adds r4, r3, #1
  25676. dhcp->msg_out->options[dhcp->options_out_len++] = option_len;
  25677. 802a010: fa11 f184 uxtah r1, r1, r4
  25678. 802a014: 3302 adds r3, #2
  25679. 802a016: f881 20f0 strb.w r2, [r1, #240] ; 0xf0
  25680. 802a01a: 8303 strh r3, [r0, #24]
  25681. 802a01c: bd10 pop {r4, pc}
  25682. 0802a01e <dhcp_option_byte>:
  25683. */
  25684. static void
  25685. dhcp_option_byte(struct dhcp *dhcp, u8_t value)
  25686. {
  25687. LWIP_ASSERT("dhcp_option_byte: dhcp->options_out_len < DHCP_OPTIONS_LEN", dhcp->options_out_len < DHCP_OPTIONS_LEN);
  25688. dhcp->msg_out->options[dhcp->options_out_len++] = value;
  25689. 802a01e: 8b03 ldrh r3, [r0, #24]
  25690. 802a020: 6942 ldr r2, [r0, #20]
  25691. 802a022: 18d2 adds r2, r2, r3
  25692. 802a024: 3301 adds r3, #1
  25693. 802a026: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  25694. 802a02a: 8303 strh r3, [r0, #24]
  25695. 802a02c: 4770 bx lr
  25696. 0802a02e <dhcp_option_short>:
  25697. static void
  25698. dhcp_option_short(struct dhcp *dhcp, u16_t value)
  25699. {
  25700. LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN);
  25701. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
  25702. 802a02e: 8b03 ldrh r3, [r0, #24]
  25703. 802a030: 6942 ldr r2, [r0, #20]
  25704. 802a032: 18d2 adds r2, r2, r3
  25705. dhcp->msg_out->options[dhcp->options_out_len++] = value;
  25706. }
  25707. static void
  25708. dhcp_option_short(struct dhcp *dhcp, u16_t value)
  25709. {
  25710. 802a034: b510 push {r4, lr}
  25711. LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN);
  25712. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
  25713. 802a036: 0a0c lsrs r4, r1, #8
  25714. 802a038: f882 40f0 strb.w r4, [r2, #240] ; 0xf0
  25715. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU);
  25716. 802a03c: 6942 ldr r2, [r0, #20]
  25717. static void
  25718. dhcp_option_short(struct dhcp *dhcp, u16_t value)
  25719. {
  25720. LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN);
  25721. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
  25722. 802a03e: 1c5c adds r4, r3, #1
  25723. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU);
  25724. 802a040: fa12 f284 uxtah r2, r2, r4
  25725. 802a044: 3302 adds r3, #2
  25726. 802a046: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  25727. 802a04a: 8303 strh r3, [r0, #24]
  25728. 802a04c: bd10 pop {r4, pc}
  25729. 0802a04e <dhcp_option_long>:
  25730. static void
  25731. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  25732. {
  25733. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  25734. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  25735. 802a04e: 8b03 ldrh r3, [r0, #24]
  25736. 802a050: 6942 ldr r2, [r0, #20]
  25737. 802a052: 18d2 adds r2, r2, r3
  25738. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU);
  25739. }
  25740. static void
  25741. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  25742. {
  25743. 802a054: b510 push {r4, lr}
  25744. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  25745. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  25746. 802a056: 0e0c lsrs r4, r1, #24
  25747. 802a058: f882 40f0 strb.w r4, [r2, #240] ; 0xf0
  25748. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
  25749. 802a05c: 6942 ldr r2, [r0, #20]
  25750. static void
  25751. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  25752. {
  25753. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  25754. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  25755. 802a05e: 1c5c adds r4, r3, #1
  25756. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
  25757. 802a060: fa12 f284 uxtah r2, r2, r4
  25758. 802a064: f3c1 4407 ubfx r4, r1, #16, #8
  25759. 802a068: f882 40f0 strb.w r4, [r2, #240] ; 0xf0
  25760. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);
  25761. 802a06c: 6942 ldr r2, [r0, #20]
  25762. static void
  25763. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  25764. {
  25765. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  25766. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  25767. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
  25768. 802a06e: 1c9c adds r4, r3, #2
  25769. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);
  25770. 802a070: fa12 f284 uxtah r2, r2, r4
  25771. 802a074: f3c1 2407 ubfx r4, r1, #8, #8
  25772. 802a078: f882 40f0 strb.w r4, [r2, #240] ; 0xf0
  25773. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x000000ffUL));
  25774. 802a07c: 6942 ldr r2, [r0, #20]
  25775. dhcp_option_long(struct dhcp *dhcp, u32_t value)
  25776. {
  25777. LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);
  25778. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
  25779. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
  25780. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);
  25781. 802a07e: 1cdc adds r4, r3, #3
  25782. dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x000000ffUL));
  25783. 802a080: fa12 f284 uxtah r2, r2, r4
  25784. 802a084: 3304 adds r3, #4
  25785. 802a086: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  25786. 802a08a: 8303 strh r3, [r0, #24]
  25787. 802a08c: bd10 pop {r4, pc}
  25788. 0802a08e <dhcp_option_trailer>:
  25789. * @param dhcp DHCP state structure
  25790. */
  25791. static void
  25792. dhcp_option_trailer(struct dhcp *dhcp)
  25793. {
  25794. LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;);
  25795. 802a08e: b190 cbz r0, 802a0b6 <dhcp_option_trailer+0x28>
  25796. LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL);
  25797. LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN);
  25798. dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END;
  25799. 802a090: 8b03 ldrh r3, [r0, #24]
  25800. 802a092: 6942 ldr r2, [r0, #20]
  25801. 802a094: 18d2 adds r2, r2, r3
  25802. 802a096: 21ff movs r1, #255 ; 0xff
  25803. 802a098: 3301 adds r3, #1
  25804. 802a09a: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  25805. 802a09e: 8303 strh r3, [r0, #24]
  25806. /* packet is too small, or not 4 byte aligned? */
  25807. while (((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) &&
  25808. (dhcp->options_out_len < DHCP_OPTIONS_LEN)) {
  25809. /* add a fill/padding byte */
  25810. dhcp->msg_out->options[dhcp->options_out_len++] = 0;
  25811. 802a0a0: 2100 movs r1, #0
  25812. LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;);
  25813. LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL);
  25814. LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN);
  25815. dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END;
  25816. /* packet is too small, or not 4 byte aligned? */
  25817. while (((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) &&
  25818. 802a0a2: e005 b.n 802a0b0 <dhcp_option_trailer+0x22>
  25819. (dhcp->options_out_len < DHCP_OPTIONS_LEN)) {
  25820. /* add a fill/padding byte */
  25821. dhcp->msg_out->options[dhcp->options_out_len++] = 0;
  25822. 802a0a4: 6942 ldr r2, [r0, #20]
  25823. 802a0a6: 18d2 adds r2, r2, r3
  25824. 802a0a8: 3301 adds r3, #1
  25825. 802a0aa: f882 10f0 strb.w r1, [r2, #240] ; 0xf0
  25826. 802a0ae: 8303 strh r3, [r0, #24]
  25827. LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;);
  25828. LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL);
  25829. LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN);
  25830. dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END;
  25831. /* packet is too small, or not 4 byte aligned? */
  25832. while (((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) &&
  25833. 802a0b0: 8b03 ldrh r3, [r0, #24]
  25834. 802a0b2: 2b43 cmp r3, #67 ; 0x43
  25835. 802a0b4: d9f6 bls.n 802a0a4 <dhcp_option_trailer+0x16>
  25836. 802a0b6: 4770 bx lr
  25837. 0802a0b8 <dhcp_create_msg>:
  25838. * @param dhcp dhcp control struct
  25839. * @param message_type message type of the request
  25840. */
  25841. static err_t
  25842. dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type)
  25843. {
  25844. 802a0b8: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  25845. 802a0bc: 460c mov r4, r1
  25846. 802a0be: 4617 mov r7, r2
  25847. if (!xid_initialised) {
  25848. xid = DHCP_GLOBAL_XID;
  25849. xid_initialised = !xid_initialised;
  25850. }
  25851. #endif
  25852. LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return ERR_ARG;);
  25853. 802a0c0: 4606 mov r6, r0
  25854. 802a0c2: 2800 cmp r0, #0
  25855. 802a0c4: f000 808e beq.w 802a1e4 <dhcp_create_msg+0x12c>
  25856. LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return ERR_VAL;);
  25857. 802a0c8: 2900 cmp r1, #0
  25858. 802a0ca: f000 808d beq.w 802a1e8 <dhcp_create_msg+0x130>
  25859. LWIP_ASSERT("dhcp_create_msg: dhcp->p_out == NULL", dhcp->p_out == NULL);
  25860. LWIP_ASSERT("dhcp_create_msg: dhcp->msg_out == NULL", dhcp->msg_out == NULL);
  25861. dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM);
  25862. 802a0ce: 2000 movs r0, #0
  25863. 802a0d0: f44f 719a mov.w r1, #308 ; 0x134
  25864. 802a0d4: 4602 mov r2, r0
  25865. 802a0d6: f001 f908 bl 802b2ea <pbuf_alloc>
  25866. 802a0da: 6120 str r0, [r4, #16]
  25867. if (dhcp->p_out == NULL) {
  25868. 802a0dc: 2800 cmp r0, #0
  25869. 802a0de: f000 8085 beq.w 802a1ec <dhcp_create_msg+0x134>
  25870. }
  25871. LWIP_ASSERT("dhcp_create_msg: check that first pbuf can hold struct dhcp_msg",
  25872. (dhcp->p_out->len >= sizeof(struct dhcp_msg)));
  25873. /* reuse transaction identifier in retransmissions */
  25874. if (dhcp->tries == 0) {
  25875. 802a0e2: 7b62 ldrb r2, [r4, #13]
  25876. 802a0e4: 4b43 ldr r3, [pc, #268] ; (802a1f4 <dhcp_create_msg+0x13c>)
  25877. 802a0e6: b912 cbnz r2, 802a0ee <dhcp_create_msg+0x36>
  25878. #if DHCP_CREATE_RAND_XID && defined(LWIP_RAND)
  25879. xid = LWIP_RAND();
  25880. #else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  25881. xid++;
  25882. 802a0e8: 681a ldr r2, [r3, #0]
  25883. 802a0ea: 3201 adds r2, #1
  25884. 802a0ec: 601a str r2, [r3, #0]
  25885. #endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  25886. }
  25887. dhcp->xid = xid;
  25888. 802a0ee: 681b ldr r3, [r3, #0]
  25889. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE,
  25890. ("transaction id xid(%"X32_F")\n", xid));
  25891. dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload;
  25892. 802a0f0: 6842 ldr r2, [r0, #4]
  25893. xid = LWIP_RAND();
  25894. #else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  25895. xid++;
  25896. #endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
  25897. }
  25898. dhcp->xid = xid;
  25899. 802a0f2: 6023 str r3, [r4, #0]
  25900. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE,
  25901. ("transaction id xid(%"X32_F")\n", xid));
  25902. dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload;
  25903. dhcp->msg_out->op = DHCP_BOOTREQUEST;
  25904. 802a0f4: 2301 movs r3, #1
  25905. }
  25906. dhcp->xid = xid;
  25907. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE,
  25908. ("transaction id xid(%"X32_F")\n", xid));
  25909. dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload;
  25910. 802a0f6: 6162 str r2, [r4, #20]
  25911. dhcp->msg_out->op = DHCP_BOOTREQUEST;
  25912. 802a0f8: 7013 strb r3, [r2, #0]
  25913. /* TODO: make link layer independent */
  25914. dhcp->msg_out->htype = DHCP_HTYPE_ETH;
  25915. 802a0fa: 6962 ldr r2, [r4, #20]
  25916. 802a0fc: 7053 strb r3, [r2, #1]
  25917. dhcp->msg_out->hlen = netif->hwaddr_len;
  25918. 802a0fe: 6963 ldr r3, [r4, #20]
  25919. 802a100: f896 2026 ldrb.w r2, [r6, #38] ; 0x26
  25920. 802a104: 709a strb r2, [r3, #2]
  25921. dhcp->msg_out->hops = 0;
  25922. 802a106: 6963 ldr r3, [r4, #20]
  25923. 802a108: 2500 movs r5, #0
  25924. 802a10a: 70dd strb r5, [r3, #3]
  25925. dhcp->msg_out->xid = htonl(dhcp->xid);
  25926. 802a10c: 6820 ldr r0, [r4, #0]
  25927. 802a10e: f8d4 8014 ldr.w r8, [r4, #20]
  25928. 802a112: f7ff ff69 bl 8029fe8 <lwip_htonl>
  25929. 802a116: f8c8 0004 str.w r0, [r8, #4]
  25930. dhcp->msg_out->secs = 0;
  25931. 802a11a: 6963 ldr r3, [r4, #20]
  25932. /* we don't need the broadcast flag since we can receive unicast traffic
  25933. before being fully configured! */
  25934. dhcp->msg_out->flags = 0;
  25935. ip_addr_set_zero(&dhcp->msg_out->ciaddr);
  25936. /* set ciaddr to netif->ip_addr based on message_type and state */
  25937. if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) ||
  25938. 802a11c: 2f08 cmp r7, #8
  25939. /* TODO: make link layer independent */
  25940. dhcp->msg_out->htype = DHCP_HTYPE_ETH;
  25941. dhcp->msg_out->hlen = netif->hwaddr_len;
  25942. dhcp->msg_out->hops = 0;
  25943. dhcp->msg_out->xid = htonl(dhcp->xid);
  25944. dhcp->msg_out->secs = 0;
  25945. 802a11e: 721d strb r5, [r3, #8]
  25946. 802a120: 725d strb r5, [r3, #9]
  25947. /* we don't need the broadcast flag since we can receive unicast traffic
  25948. before being fully configured! */
  25949. dhcp->msg_out->flags = 0;
  25950. 802a122: 729d strb r5, [r3, #10]
  25951. 802a124: 72dd strb r5, [r3, #11]
  25952. ip_addr_set_zero(&dhcp->msg_out->ciaddr);
  25953. 802a126: 731d strb r5, [r3, #12]
  25954. 802a128: 735d strb r5, [r3, #13]
  25955. 802a12a: 739d strb r5, [r3, #14]
  25956. 802a12c: 73dd strb r5, [r3, #15]
  25957. /* set ciaddr to netif->ip_addr based on message_type and state */
  25958. if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) ||
  25959. 802a12e: d007 beq.n 802a140 <dhcp_create_msg+0x88>
  25960. 802a130: 2f04 cmp r7, #4
  25961. 802a132: d005 beq.n 802a140 <dhcp_create_msg+0x88>
  25962. 802a134: 2f03 cmp r7, #3
  25963. 802a136: d105 bne.n 802a144 <dhcp_create_msg+0x8c>
  25964. ((message_type == DHCP_REQUEST) && /* DHCP_BOUND not used for sending! */
  25965. ((dhcp->state==DHCP_RENEWING) || dhcp->state==DHCP_REBINDING))) {
  25966. 802a138: 7b22 ldrb r2, [r4, #12]
  25967. before being fully configured! */
  25968. dhcp->msg_out->flags = 0;
  25969. ip_addr_set_zero(&dhcp->msg_out->ciaddr);
  25970. /* set ciaddr to netif->ip_addr based on message_type and state */
  25971. if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) ||
  25972. ((message_type == DHCP_REQUEST) && /* DHCP_BOUND not used for sending! */
  25973. 802a13a: 3a04 subs r2, #4
  25974. 802a13c: 2a01 cmp r2, #1
  25975. 802a13e: d801 bhi.n 802a144 <dhcp_create_msg+0x8c>
  25976. ((dhcp->state==DHCP_RENEWING) || dhcp->state==DHCP_REBINDING))) {
  25977. ip_addr_copy(dhcp->msg_out->ciaddr, netif->ip_addr);
  25978. 802a140: 6872 ldr r2, [r6, #4]
  25979. 802a142: 60da str r2, [r3, #12]
  25980. }
  25981. ip_addr_set_zero(&dhcp->msg_out->yiaddr);
  25982. 802a144: 2500 movs r5, #0
  25983. 802a146: 741d strb r5, [r3, #16]
  25984. 802a148: 745d strb r5, [r3, #17]
  25985. 802a14a: 749d strb r5, [r3, #18]
  25986. 802a14c: 74dd strb r5, [r3, #19]
  25987. ip_addr_set_zero(&dhcp->msg_out->siaddr);
  25988. 802a14e: 751d strb r5, [r3, #20]
  25989. 802a150: 755d strb r5, [r3, #21]
  25990. 802a152: 759d strb r5, [r3, #22]
  25991. 802a154: 75dd strb r5, [r3, #23]
  25992. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  25993. 802a156: 761d strb r5, [r3, #24]
  25994. 802a158: 765d strb r5, [r3, #25]
  25995. 802a15a: 769d strb r5, [r3, #26]
  25996. 802a15c: 76dd strb r5, [r3, #27]
  25997. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  25998. /* copy netif hardware address, pad with zeroes */
  25999. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  26000. 802a15e: f896 1026 ldrb.w r1, [r6, #38] ; 0x26
  26001. 802a162: 6962 ldr r2, [r4, #20]
  26002. 802a164: b2ab uxth r3, r5
  26003. 802a166: 4299 cmp r1, r3
  26004. * @param netif the netif under DHCP control
  26005. * @param dhcp dhcp control struct
  26006. * @param message_type message type of the request
  26007. */
  26008. static err_t
  26009. dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type)
  26010. 802a168: bf88 it hi
  26011. 802a16a: 1973 addhi r3, r6, r5
  26012. ip_addr_set_zero(&dhcp->msg_out->yiaddr);
  26013. ip_addr_set_zero(&dhcp->msg_out->siaddr);
  26014. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  26015. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  26016. /* copy netif hardware address, pad with zeroes */
  26017. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  26018. 802a16c: 442a add r2, r5
  26019. 802a16e: bf8c ite hi
  26020. 802a170: f893 3027 ldrbhi.w r3, [r3, #39] ; 0x27
  26021. 802a174: 2300 movls r3, #0
  26022. 802a176: 3501 adds r5, #1
  26023. ip_addr_copy(dhcp->msg_out->ciaddr, netif->ip_addr);
  26024. }
  26025. ip_addr_set_zero(&dhcp->msg_out->yiaddr);
  26026. ip_addr_set_zero(&dhcp->msg_out->siaddr);
  26027. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  26028. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  26029. 802a178: 2d10 cmp r5, #16
  26030. /* copy netif hardware address, pad with zeroes */
  26031. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  26032. 802a17a: 7713 strb r3, [r2, #28]
  26033. ip_addr_copy(dhcp->msg_out->ciaddr, netif->ip_addr);
  26034. }
  26035. ip_addr_set_zero(&dhcp->msg_out->yiaddr);
  26036. ip_addr_set_zero(&dhcp->msg_out->siaddr);
  26037. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  26038. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  26039. 802a17c: d1ef bne.n 802a15e <dhcp_create_msg+0xa6>
  26040. 802a17e: 2300 movs r3, #0
  26041. /* copy netif hardware address, pad with zeroes */
  26042. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  26043. }
  26044. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  26045. dhcp->msg_out->sname[i] = 0;
  26046. 802a180: 4619 mov r1, r3
  26047. 802a182: 6962 ldr r2, [r4, #20]
  26048. 802a184: 18d2 adds r2, r2, r3
  26049. 802a186: 3301 adds r3, #1
  26050. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  26051. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  26052. /* copy netif hardware address, pad with zeroes */
  26053. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  26054. }
  26055. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  26056. 802a188: 2b40 cmp r3, #64 ; 0x40
  26057. dhcp->msg_out->sname[i] = 0;
  26058. 802a18a: f882 102c strb.w r1, [r2, #44] ; 0x2c
  26059. ip_addr_set_zero(&dhcp->msg_out->giaddr);
  26060. for (i = 0; i < DHCP_CHADDR_LEN; i++) {
  26061. /* copy netif hardware address, pad with zeroes */
  26062. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  26063. }
  26064. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  26065. 802a18e: d1f8 bne.n 802a182 <dhcp_create_msg+0xca>
  26066. 802a190: 2200 movs r2, #0
  26067. dhcp->msg_out->sname[i] = 0;
  26068. }
  26069. for (i = 0; i < DHCP_FILE_LEN; i++) {
  26070. dhcp->msg_out->file[i] = 0;
  26071. 802a192: 4610 mov r0, r2
  26072. 802a194: 6963 ldr r3, [r4, #20]
  26073. 802a196: 1899 adds r1, r3, r2
  26074. 802a198: 3201 adds r2, #1
  26075. 802a19a: 2300 movs r3, #0
  26076. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  26077. }
  26078. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  26079. dhcp->msg_out->sname[i] = 0;
  26080. }
  26081. for (i = 0; i < DHCP_FILE_LEN; i++) {
  26082. 802a19c: 2a80 cmp r2, #128 ; 0x80
  26083. dhcp->msg_out->file[i] = 0;
  26084. 802a19e: f881 006c strb.w r0, [r1, #108] ; 0x6c
  26085. dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
  26086. }
  26087. for (i = 0; i < DHCP_SNAME_LEN; i++) {
  26088. dhcp->msg_out->sname[i] = 0;
  26089. }
  26090. for (i = 0; i < DHCP_FILE_LEN; i++) {
  26091. 802a1a2: d1f7 bne.n 802a194 <dhcp_create_msg+0xdc>
  26092. dhcp->msg_out->file[i] = 0;
  26093. }
  26094. dhcp->msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE);
  26095. 802a1a4: 6962 ldr r2, [r4, #20]
  26096. 802a1a6: f06f 007d mvn.w r0, #125 ; 0x7d
  26097. 802a1aa: 2163 movs r1, #99 ; 0x63
  26098. 802a1ac: f882 00ed strb.w r0, [r2, #237] ; 0xed
  26099. 802a1b0: 2053 movs r0, #83 ; 0x53
  26100. 802a1b2: f882 10ec strb.w r1, [r2, #236] ; 0xec
  26101. 802a1b6: f882 00ee strb.w r0, [r2, #238] ; 0xee
  26102. 802a1ba: f882 10ef strb.w r1, [r2, #239] ; 0xef
  26103. dhcp->options_out_len = 0;
  26104. 802a1be: 8323 strh r3, [r4, #24]
  26105. /* fill options field with an incrementing array (for debugging purposes) */
  26106. for (i = 0; i < DHCP_OPTIONS_LEN; i++) {
  26107. dhcp->msg_out->options[i] = (u8_t)i; /* for debugging only, no matter if truncated */
  26108. 802a1c0: 6962 ldr r2, [r4, #20]
  26109. 802a1c2: 18d2 adds r2, r2, r3
  26110. 802a1c4: f882 30f0 strb.w r3, [r2, #240] ; 0xf0
  26111. 802a1c8: 3301 adds r3, #1
  26112. dhcp->msg_out->file[i] = 0;
  26113. }
  26114. dhcp->msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE);
  26115. dhcp->options_out_len = 0;
  26116. /* fill options field with an incrementing array (for debugging purposes) */
  26117. for (i = 0; i < DHCP_OPTIONS_LEN; i++) {
  26118. 802a1ca: 2b44 cmp r3, #68 ; 0x44
  26119. 802a1cc: d1f8 bne.n 802a1c0 <dhcp_create_msg+0x108>
  26120. dhcp->msg_out->options[i] = (u8_t)i; /* for debugging only, no matter if truncated */
  26121. }
  26122. /* Add option MESSAGE_TYPE */
  26123. dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
  26124. 802a1ce: 4620 mov r0, r4
  26125. 802a1d0: 2135 movs r1, #53 ; 0x35
  26126. 802a1d2: 2201 movs r2, #1
  26127. 802a1d4: f7ff ff14 bl 802a000 <dhcp_option>
  26128. dhcp_option_byte(dhcp, message_type);
  26129. 802a1d8: 4620 mov r0, r4
  26130. 802a1da: 4639 mov r1, r7
  26131. 802a1dc: f7ff ff1f bl 802a01e <dhcp_option_byte>
  26132. return ERR_OK;
  26133. 802a1e0: 2000 movs r0, #0
  26134. 802a1e2: e004 b.n 802a1ee <dhcp_create_msg+0x136>
  26135. if (!xid_initialised) {
  26136. xid = DHCP_GLOBAL_XID;
  26137. xid_initialised = !xid_initialised;
  26138. }
  26139. #endif
  26140. LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return ERR_ARG;);
  26141. 802a1e4: 20f2 movs r0, #242 ; 0xf2
  26142. 802a1e6: e002 b.n 802a1ee <dhcp_create_msg+0x136>
  26143. LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return ERR_VAL;);
  26144. 802a1e8: 20fa movs r0, #250 ; 0xfa
  26145. 802a1ea: e000 b.n 802a1ee <dhcp_create_msg+0x136>
  26146. LWIP_ASSERT("dhcp_create_msg: dhcp->msg_out == NULL", dhcp->msg_out == NULL);
  26147. dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM);
  26148. if (dhcp->p_out == NULL) {
  26149. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  26150. ("dhcp_create_msg(): could not allocate pbuf\n"));
  26151. return ERR_MEM;
  26152. 802a1ec: 20ff movs r0, #255 ; 0xff
  26153. }
  26154. /* Add option MESSAGE_TYPE */
  26155. dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
  26156. dhcp_option_byte(dhcp, message_type);
  26157. return ERR_OK;
  26158. }
  26159. 802a1ee: b240 sxtb r0, r0
  26160. 802a1f0: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  26161. 802a1f4: 200015dc .word 0x200015dc
  26162. 0802a1f8 <dhcp_delete_msg>:
  26163. *
  26164. * @param dhcp the dhcp struct to free the request from
  26165. */
  26166. static void
  26167. dhcp_delete_msg(struct dhcp *dhcp)
  26168. {
  26169. 802a1f8: b510 push {r4, lr}
  26170. LWIP_ERROR("dhcp_delete_msg: dhcp != NULL", (dhcp != NULL), return;);
  26171. 802a1fa: 4604 mov r4, r0
  26172. 802a1fc: b130 cbz r0, 802a20c <dhcp_delete_msg+0x14>
  26173. LWIP_ASSERT("dhcp_delete_msg: dhcp->p_out != NULL", dhcp->p_out != NULL);
  26174. LWIP_ASSERT("dhcp_delete_msg: dhcp->msg_out != NULL", dhcp->msg_out != NULL);
  26175. if (dhcp->p_out != NULL) {
  26176. 802a1fe: 6900 ldr r0, [r0, #16]
  26177. 802a200: b108 cbz r0, 802a206 <dhcp_delete_msg+0xe>
  26178. pbuf_free(dhcp->p_out);
  26179. 802a202: f001 f825 bl 802b250 <pbuf_free>
  26180. }
  26181. dhcp->p_out = NULL;
  26182. 802a206: 2300 movs r3, #0
  26183. 802a208: 6123 str r3, [r4, #16]
  26184. dhcp->msg_out = NULL;
  26185. 802a20a: 6163 str r3, [r4, #20]
  26186. 802a20c: bd10 pop {r4, pc}
  26187. 802a20e: 0000 movs r0, r0
  26188. 0802a210 <dhcp_discover>:
  26189. *
  26190. * @param netif the netif under DHCP control
  26191. */
  26192. static err_t
  26193. dhcp_discover(struct netif *netif)
  26194. {
  26195. 802a210: b573 push {r0, r1, r4, r5, r6, lr}
  26196. struct dhcp *dhcp = netif->dhcp;
  26197. 802a212: 6a04 ldr r4, [r0, #32]
  26198. err_t result = ERR_OK;
  26199. u16_t msecs;
  26200. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n"));
  26201. ip_addr_set_any(&dhcp->offered_ip_addr);
  26202. 802a214: 2300 movs r3, #0
  26203. *
  26204. * @param netif the netif under DHCP control
  26205. */
  26206. static err_t
  26207. dhcp_discover(struct netif *netif)
  26208. {
  26209. 802a216: 4605 mov r5, r0
  26210. struct dhcp *dhcp = netif->dhcp;
  26211. err_t result = ERR_OK;
  26212. u16_t msecs;
  26213. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n"));
  26214. ip_addr_set_any(&dhcp->offered_ip_addr);
  26215. 802a218: 6263 str r3, [r4, #36] ; 0x24
  26216. dhcp_set_state(dhcp, DHCP_SELECTING);
  26217. 802a21a: 4620 mov r0, r4
  26218. 802a21c: 2106 movs r1, #6
  26219. 802a21e: f7ff fee7 bl 8029ff0 <dhcp_set_state>
  26220. /* create and initialize the DHCP message header */
  26221. result = dhcp_create_msg(netif, dhcp, DHCP_DISCOVER);
  26222. 802a222: 4628 mov r0, r5
  26223. 802a224: 4621 mov r1, r4
  26224. 802a226: 2201 movs r2, #1
  26225. 802a228: f7ff ff46 bl 802a0b8 <dhcp_create_msg>
  26226. if (result == ERR_OK) {
  26227. 802a22c: 4606 mov r6, r0
  26228. 802a22e: 2800 cmp r0, #0
  26229. 802a230: d130 bne.n 802a294 <dhcp_discover+0x84>
  26230. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: making request\n"));
  26231. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  26232. 802a232: 2202 movs r2, #2
  26233. 802a234: 4620 mov r0, r4
  26234. 802a236: 2139 movs r1, #57 ; 0x39
  26235. 802a238: f7ff fee2 bl 802a000 <dhcp_option>
  26236. dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
  26237. 802a23c: 4620 mov r0, r4
  26238. 802a23e: 8ca9 ldrh r1, [r5, #36] ; 0x24
  26239. 802a240: f7ff fef5 bl 802a02e <dhcp_option_short>
  26240. dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/);
  26241. 802a244: 2204 movs r2, #4
  26242. 802a246: 4620 mov r0, r4
  26243. 802a248: 2137 movs r1, #55 ; 0x37
  26244. 802a24a: f7ff fed9 bl 802a000 <dhcp_option>
  26245. dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK);
  26246. 802a24e: 4620 mov r0, r4
  26247. 802a250: 2101 movs r1, #1
  26248. 802a252: f7ff fee4 bl 802a01e <dhcp_option_byte>
  26249. dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER);
  26250. 802a256: 4620 mov r0, r4
  26251. 802a258: 2103 movs r1, #3
  26252. 802a25a: f7ff fee0 bl 802a01e <dhcp_option_byte>
  26253. dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST);
  26254. 802a25e: 4620 mov r0, r4
  26255. 802a260: 211c movs r1, #28
  26256. 802a262: f7ff fedc bl 802a01e <dhcp_option_byte>
  26257. dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER);
  26258. 802a266: 2106 movs r1, #6
  26259. 802a268: 4620 mov r0, r4
  26260. 802a26a: f7ff fed8 bl 802a01e <dhcp_option_byte>
  26261. dhcp_option_trailer(dhcp);
  26262. 802a26e: 4620 mov r0, r4
  26263. 802a270: f7ff ff0d bl 802a08e <dhcp_option_trailer>
  26264. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: realloc()ing\n"));
  26265. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  26266. 802a274: 8b21 ldrh r1, [r4, #24]
  26267. 802a276: 6920 ldr r0, [r4, #16]
  26268. 802a278: 31f0 adds r1, #240 ; 0xf0
  26269. 802a27a: b289 uxth r1, r1
  26270. 802a27c: f001 f80f bl 802b29e <pbuf_realloc>
  26271. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)\n"));
  26272. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  26273. 802a280: 9500 str r5, [sp, #0]
  26274. 802a282: 6860 ldr r0, [r4, #4]
  26275. 802a284: 6921 ldr r1, [r4, #16]
  26276. 802a286: 4a0f ldr r2, [pc, #60] ; (802a2c4 <dhcp_discover+0xb4>)
  26277. 802a288: 2343 movs r3, #67 ; 0x43
  26278. 802a28a: f003 fc81 bl 802db90 <udp_sendto_if>
  26279. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: deleting()ing\n"));
  26280. dhcp_delete_msg(dhcp);
  26281. 802a28e: 4620 mov r0, r4
  26282. 802a290: f7ff ffb2 bl 802a1f8 <dhcp_delete_msg>
  26283. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n"));
  26284. } else {
  26285. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n"));
  26286. }
  26287. dhcp->tries++;
  26288. 802a294: 7b63 ldrb r3, [r4, #13]
  26289. 802a296: 3301 adds r3, #1
  26290. 802a298: b2db uxtb r3, r3
  26291. if(dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) {
  26292. dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON;
  26293. autoip_start(netif);
  26294. }
  26295. #endif /* LWIP_DHCP_AUTOIP_COOP */
  26296. msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
  26297. 802a29a: 2b05 cmp r3, #5
  26298. 802a29c: bf98 it ls
  26299. 802a29e: f44f 727a movls.w r2, #1000 ; 0x3e8
  26300. dhcp_delete_msg(dhcp);
  26301. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n"));
  26302. } else {
  26303. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n"));
  26304. }
  26305. dhcp->tries++;
  26306. 802a2a2: 7363 strb r3, [r4, #13]
  26307. if(dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) {
  26308. dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON;
  26309. autoip_start(netif);
  26310. }
  26311. #endif /* LWIP_DHCP_AUTOIP_COOP */
  26312. msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
  26313. 802a2a4: bf9a itte ls
  26314. 802a2a6: fa02 f303 lslls.w r3, r2, r3
  26315. 802a2aa: b29b uxthls r3, r3
  26316. 802a2ac: f64e 2360 movwhi r3, #60000 ; 0xea60
  26317. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  26318. 802a2b0: f44f 72fa mov.w r2, #500 ; 0x1f4
  26319. 802a2b4: f203 13f3 addw r3, r3, #499 ; 0x1f3
  26320. 802a2b8: fb93 f3f2 sdiv r3, r3, r2
  26321. 802a2bc: 8363 strh r3, [r4, #26]
  26322. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover(): set request timeout %"U16_F" msecs\n", msecs));
  26323. return result;
  26324. }
  26325. 802a2be: 4630 mov r0, r6
  26326. 802a2c0: bd7c pop {r2, r3, r4, r5, r6, pc}
  26327. 802a2c2: bf00 nop
  26328. 802a2c4: 0803abf8 .word 0x0803abf8
  26329. 0802a2c8 <dhcp_rebind>:
  26330. *
  26331. * @param netif network interface which must rebind with a DHCP server
  26332. */
  26333. static err_t
  26334. dhcp_rebind(struct netif *netif)
  26335. {
  26336. 802a2c8: b573 push {r0, r1, r4, r5, r6, lr}
  26337. struct dhcp *dhcp = netif->dhcp;
  26338. 802a2ca: 6a04 ldr r4, [r0, #32]
  26339. *
  26340. * @param netif network interface which must rebind with a DHCP server
  26341. */
  26342. static err_t
  26343. dhcp_rebind(struct netif *netif)
  26344. {
  26345. 802a2cc: 4605 mov r5, r0
  26346. struct dhcp *dhcp = netif->dhcp;
  26347. err_t result;
  26348. u16_t msecs;
  26349. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind()\n"));
  26350. dhcp_set_state(dhcp, DHCP_REBINDING);
  26351. 802a2ce: 2104 movs r1, #4
  26352. 802a2d0: 4620 mov r0, r4
  26353. 802a2d2: f7ff fe8d bl 8029ff0 <dhcp_set_state>
  26354. /* create and initialize the DHCP message header */
  26355. result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
  26356. 802a2d6: 4628 mov r0, r5
  26357. 802a2d8: 4621 mov r1, r4
  26358. 802a2da: 2203 movs r2, #3
  26359. 802a2dc: f7ff feec bl 802a0b8 <dhcp_create_msg>
  26360. if (result == ERR_OK) {
  26361. 802a2e0: 4606 mov r6, r0
  26362. 802a2e2: b9d8 cbnz r0, 802a31c <dhcp_rebind+0x54>
  26363. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  26364. 802a2e4: 2202 movs r2, #2
  26365. 802a2e6: 4620 mov r0, r4
  26366. 802a2e8: 2139 movs r1, #57 ; 0x39
  26367. 802a2ea: f7ff fe89 bl 802a000 <dhcp_option>
  26368. dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
  26369. 802a2ee: 8ca9 ldrh r1, [r5, #36] ; 0x24
  26370. 802a2f0: 4620 mov r0, r4
  26371. 802a2f2: f7ff fe9c bl 802a02e <dhcp_option_short>
  26372. dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
  26373. dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr));
  26374. #endif
  26375. dhcp_option_trailer(dhcp);
  26376. 802a2f6: 4620 mov r0, r4
  26377. 802a2f8: f7ff fec9 bl 802a08e <dhcp_option_trailer>
  26378. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  26379. 802a2fc: 8b21 ldrh r1, [r4, #24]
  26380. 802a2fe: 6920 ldr r0, [r4, #16]
  26381. 802a300: 31f0 adds r1, #240 ; 0xf0
  26382. 802a302: b289 uxth r1, r1
  26383. 802a304: f000 ffcb bl 802b29e <pbuf_realloc>
  26384. /* broadcast to server */
  26385. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  26386. 802a308: 9500 str r5, [sp, #0]
  26387. 802a30a: 6860 ldr r0, [r4, #4]
  26388. 802a30c: 6921 ldr r1, [r4, #16]
  26389. 802a30e: 4a0e ldr r2, [pc, #56] ; (802a348 <dhcp_rebind+0x80>)
  26390. 802a310: 2343 movs r3, #67 ; 0x43
  26391. 802a312: f003 fc3d bl 802db90 <udp_sendto_if>
  26392. dhcp_delete_msg(dhcp);
  26393. 802a316: 4620 mov r0, r4
  26394. 802a318: f7ff ff6e bl 802a1f8 <dhcp_delete_msg>
  26395. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind: REBINDING\n"));
  26396. } else {
  26397. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_rebind: could not allocate DHCP request\n"));
  26398. }
  26399. dhcp->tries++;
  26400. 802a31c: 7b63 ldrb r3, [r4, #13]
  26401. 802a31e: 3301 adds r3, #1
  26402. 802a320: b2db uxtb r3, r3
  26403. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  26404. 802a322: 2b09 cmp r3, #9
  26405. dhcp_delete_msg(dhcp);
  26406. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind: REBINDING\n"));
  26407. } else {
  26408. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_rebind: could not allocate DHCP request\n"));
  26409. }
  26410. dhcp->tries++;
  26411. 802a324: 7363 strb r3, [r4, #13]
  26412. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  26413. 802a326: d804 bhi.n 802a332 <dhcp_rebind+0x6a>
  26414. 802a328: f44f 727a mov.w r2, #1000 ; 0x3e8
  26415. 802a32c: 4353 muls r3, r2
  26416. 802a32e: b29b uxth r3, r3
  26417. 802a330: e001 b.n 802a336 <dhcp_rebind+0x6e>
  26418. 802a332: f242 7310 movw r3, #10000 ; 0x2710
  26419. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  26420. 802a336: f44f 72fa mov.w r2, #500 ; 0x1f4
  26421. 802a33a: f203 13f3 addw r3, r3, #499 ; 0x1f3
  26422. 802a33e: fb93 f3f2 sdiv r3, r3, r2
  26423. 802a342: 8363 strh r3, [r4, #26]
  26424. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind(): set request timeout %"U16_F" msecs\n", msecs));
  26425. return result;
  26426. }
  26427. 802a344: 4630 mov r0, r6
  26428. 802a346: bd7c pop {r2, r3, r4, r5, r6, pc}
  26429. 802a348: 0803abf8 .word 0x0803abf8
  26430. 0802a34c <dhcp_reboot>:
  26431. *
  26432. * @param netif network interface which must reboot
  26433. */
  26434. static err_t
  26435. dhcp_reboot(struct netif *netif)
  26436. {
  26437. 802a34c: b573 push {r0, r1, r4, r5, r6, lr}
  26438. struct dhcp *dhcp = netif->dhcp;
  26439. 802a34e: 6a04 ldr r4, [r0, #32]
  26440. *
  26441. * @param netif network interface which must reboot
  26442. */
  26443. static err_t
  26444. dhcp_reboot(struct netif *netif)
  26445. {
  26446. 802a350: 4605 mov r5, r0
  26447. struct dhcp *dhcp = netif->dhcp;
  26448. err_t result;
  26449. u16_t msecs;
  26450. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot()\n"));
  26451. dhcp_set_state(dhcp, DHCP_REBOOTING);
  26452. 802a352: 2103 movs r1, #3
  26453. 802a354: 4620 mov r0, r4
  26454. 802a356: f7ff fe4b bl 8029ff0 <dhcp_set_state>
  26455. /* create and initialize the DHCP message header */
  26456. result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
  26457. 802a35a: 4628 mov r0, r5
  26458. 802a35c: 4621 mov r1, r4
  26459. 802a35e: 2203 movs r2, #3
  26460. 802a360: f7ff feaa bl 802a0b8 <dhcp_create_msg>
  26461. if (result == ERR_OK) {
  26462. 802a364: 4606 mov r6, r0
  26463. 802a366: bb40 cbnz r0, 802a3ba <dhcp_reboot+0x6e>
  26464. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  26465. 802a368: 2202 movs r2, #2
  26466. 802a36a: 4620 mov r0, r4
  26467. 802a36c: 2139 movs r1, #57 ; 0x39
  26468. 802a36e: f7ff fe47 bl 802a000 <dhcp_option>
  26469. dhcp_option_short(dhcp, 576);
  26470. 802a372: 4620 mov r0, r4
  26471. 802a374: f44f 7110 mov.w r1, #576 ; 0x240
  26472. 802a378: f7ff fe59 bl 802a02e <dhcp_option_short>
  26473. dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
  26474. 802a37c: 2204 movs r2, #4
  26475. 802a37e: 2132 movs r1, #50 ; 0x32
  26476. 802a380: 4620 mov r0, r4
  26477. 802a382: f7ff fe3d bl 802a000 <dhcp_option>
  26478. dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  26479. 802a386: 6a60 ldr r0, [r4, #36] ; 0x24
  26480. 802a388: f7ff fe30 bl 8029fec <lwip_ntohl>
  26481. 802a38c: 4601 mov r1, r0
  26482. 802a38e: 4620 mov r0, r4
  26483. 802a390: f7ff fe5d bl 802a04e <dhcp_option_long>
  26484. dhcp_option_trailer(dhcp);
  26485. 802a394: 4620 mov r0, r4
  26486. 802a396: f7ff fe7a bl 802a08e <dhcp_option_trailer>
  26487. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  26488. 802a39a: 8b21 ldrh r1, [r4, #24]
  26489. 802a39c: 6920 ldr r0, [r4, #16]
  26490. 802a39e: 31f0 adds r1, #240 ; 0xf0
  26491. 802a3a0: b289 uxth r1, r1
  26492. 802a3a2: f000 ff7c bl 802b29e <pbuf_realloc>
  26493. /* broadcast to server */
  26494. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  26495. 802a3a6: 9500 str r5, [sp, #0]
  26496. 802a3a8: 6860 ldr r0, [r4, #4]
  26497. 802a3aa: 6921 ldr r1, [r4, #16]
  26498. 802a3ac: 4a0e ldr r2, [pc, #56] ; (802a3e8 <dhcp_reboot+0x9c>)
  26499. 802a3ae: 2343 movs r3, #67 ; 0x43
  26500. 802a3b0: f003 fbee bl 802db90 <udp_sendto_if>
  26501. dhcp_delete_msg(dhcp);
  26502. 802a3b4: 4620 mov r0, r4
  26503. 802a3b6: f7ff ff1f bl 802a1f8 <dhcp_delete_msg>
  26504. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot: REBOOTING\n"));
  26505. } else {
  26506. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_reboot: could not allocate DHCP request\n"));
  26507. }
  26508. dhcp->tries++;
  26509. 802a3ba: 7b63 ldrb r3, [r4, #13]
  26510. 802a3bc: 3301 adds r3, #1
  26511. 802a3be: b2db uxtb r3, r3
  26512. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  26513. 802a3c0: 2b09 cmp r3, #9
  26514. dhcp_delete_msg(dhcp);
  26515. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot: REBOOTING\n"));
  26516. } else {
  26517. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_reboot: could not allocate DHCP request\n"));
  26518. }
  26519. dhcp->tries++;
  26520. 802a3c2: 7363 strb r3, [r4, #13]
  26521. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  26522. 802a3c4: d804 bhi.n 802a3d0 <dhcp_reboot+0x84>
  26523. 802a3c6: f44f 727a mov.w r2, #1000 ; 0x3e8
  26524. 802a3ca: 4353 muls r3, r2
  26525. 802a3cc: b29b uxth r3, r3
  26526. 802a3ce: e001 b.n 802a3d4 <dhcp_reboot+0x88>
  26527. 802a3d0: f242 7310 movw r3, #10000 ; 0x2710
  26528. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  26529. 802a3d4: f44f 72fa mov.w r2, #500 ; 0x1f4
  26530. 802a3d8: f203 13f3 addw r3, r3, #499 ; 0x1f3
  26531. 802a3dc: fb93 f3f2 sdiv r3, r3, r2
  26532. 802a3e0: 8363 strh r3, [r4, #26]
  26533. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot(): set request timeout %"U16_F" msecs\n", msecs));
  26534. return result;
  26535. }
  26536. 802a3e2: 4630 mov r0, r6
  26537. 802a3e4: bd7c pop {r2, r3, r4, r5, r6, pc}
  26538. 802a3e6: bf00 nop
  26539. 802a3e8: 0803abf8 .word 0x0803abf8
  26540. 0802a3ec <dhcp_select>:
  26541. * @param netif the netif under DHCP control
  26542. * @return lwIP specific error (see error.h)
  26543. */
  26544. static err_t
  26545. dhcp_select(struct netif *netif)
  26546. {
  26547. 802a3ec: b573 push {r0, r1, r4, r5, r6, lr}
  26548. struct dhcp *dhcp = netif->dhcp;
  26549. 802a3ee: 6a04 ldr r4, [r0, #32]
  26550. * @param netif the netif under DHCP control
  26551. * @return lwIP specific error (see error.h)
  26552. */
  26553. static err_t
  26554. dhcp_select(struct netif *netif)
  26555. {
  26556. 802a3f0: 4605 mov r5, r0
  26557. struct dhcp *dhcp = netif->dhcp;
  26558. err_t result;
  26559. u16_t msecs;
  26560. 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));
  26561. dhcp_set_state(dhcp, DHCP_REQUESTING);
  26562. 802a3f2: 2101 movs r1, #1
  26563. 802a3f4: 4620 mov r0, r4
  26564. 802a3f6: f7ff fdfb bl 8029ff0 <dhcp_set_state>
  26565. /* create and initialize the DHCP message header */
  26566. result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
  26567. 802a3fa: 4628 mov r0, r5
  26568. 802a3fc: 4621 mov r1, r4
  26569. 802a3fe: 2203 movs r2, #3
  26570. 802a400: f7ff fe5a bl 802a0b8 <dhcp_create_msg>
  26571. if (result == ERR_OK) {
  26572. 802a404: 4606 mov r6, r0
  26573. 802a406: 2800 cmp r0, #0
  26574. 802a408: d148 bne.n 802a49c <dhcp_select+0xb0>
  26575. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  26576. 802a40a: 2202 movs r2, #2
  26577. 802a40c: 4620 mov r0, r4
  26578. 802a40e: 2139 movs r1, #57 ; 0x39
  26579. 802a410: f7ff fdf6 bl 802a000 <dhcp_option>
  26580. dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
  26581. 802a414: 4620 mov r0, r4
  26582. 802a416: 8ca9 ldrh r1, [r5, #36] ; 0x24
  26583. 802a418: f7ff fe09 bl 802a02e <dhcp_option_short>
  26584. /* MUST request the offered IP address */
  26585. dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
  26586. 802a41c: 2204 movs r2, #4
  26587. 802a41e: 2132 movs r1, #50 ; 0x32
  26588. 802a420: 4620 mov r0, r4
  26589. 802a422: f7ff fded bl 802a000 <dhcp_option>
  26590. dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  26591. 802a426: 6a60 ldr r0, [r4, #36] ; 0x24
  26592. 802a428: f7ff fde0 bl 8029fec <lwip_ntohl>
  26593. 802a42c: 4601 mov r1, r0
  26594. 802a42e: 4620 mov r0, r4
  26595. 802a430: f7ff fe0d bl 802a04e <dhcp_option_long>
  26596. dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
  26597. 802a434: 2204 movs r2, #4
  26598. 802a436: 2136 movs r1, #54 ; 0x36
  26599. 802a438: 4620 mov r0, r4
  26600. 802a43a: f7ff fde1 bl 802a000 <dhcp_option>
  26601. dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->server_ip_addr)));
  26602. 802a43e: 6a20 ldr r0, [r4, #32]
  26603. 802a440: f7ff fdd4 bl 8029fec <lwip_ntohl>
  26604. 802a444: 4601 mov r1, r0
  26605. 802a446: 4620 mov r0, r4
  26606. 802a448: f7ff fe01 bl 802a04e <dhcp_option_long>
  26607. dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/);
  26608. 802a44c: 2204 movs r2, #4
  26609. 802a44e: 4620 mov r0, r4
  26610. 802a450: 2137 movs r1, #55 ; 0x37
  26611. 802a452: f7ff fdd5 bl 802a000 <dhcp_option>
  26612. dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK);
  26613. 802a456: 4620 mov r0, r4
  26614. 802a458: 2101 movs r1, #1
  26615. 802a45a: f7ff fde0 bl 802a01e <dhcp_option_byte>
  26616. dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER);
  26617. 802a45e: 4620 mov r0, r4
  26618. 802a460: 2103 movs r1, #3
  26619. 802a462: f7ff fddc bl 802a01e <dhcp_option_byte>
  26620. dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST);
  26621. 802a466: 4620 mov r0, r4
  26622. 802a468: 211c movs r1, #28
  26623. 802a46a: f7ff fdd8 bl 802a01e <dhcp_option_byte>
  26624. dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER);
  26625. 802a46e: 2106 movs r1, #6
  26626. 802a470: 4620 mov r0, r4
  26627. 802a472: f7ff fdd4 bl 802a01e <dhcp_option_byte>
  26628. #if LWIP_NETIF_HOSTNAME
  26629. dhcp_option_hostname(dhcp, netif);
  26630. #endif /* LWIP_NETIF_HOSTNAME */
  26631. dhcp_option_trailer(dhcp);
  26632. 802a476: 4620 mov r0, r4
  26633. 802a478: f7ff fe09 bl 802a08e <dhcp_option_trailer>
  26634. /* shrink the pbuf to the actual content length */
  26635. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  26636. 802a47c: 8b21 ldrh r1, [r4, #24]
  26637. 802a47e: 6920 ldr r0, [r4, #16]
  26638. 802a480: 31f0 adds r1, #240 ; 0xf0
  26639. 802a482: b289 uxth r1, r1
  26640. 802a484: f000 ff0b bl 802b29e <pbuf_realloc>
  26641. /* send broadcast to any DHCP server */
  26642. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  26643. 802a488: 9500 str r5, [sp, #0]
  26644. 802a48a: 6860 ldr r0, [r4, #4]
  26645. 802a48c: 6921 ldr r1, [r4, #16]
  26646. 802a48e: 4a0f ldr r2, [pc, #60] ; (802a4cc <dhcp_select+0xe0>)
  26647. 802a490: 2343 movs r3, #67 ; 0x43
  26648. 802a492: f003 fb7d bl 802db90 <udp_sendto_if>
  26649. dhcp_delete_msg(dhcp);
  26650. 802a496: 4620 mov r0, r4
  26651. 802a498: f7ff feae bl 802a1f8 <dhcp_delete_msg>
  26652. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_select: REQUESTING\n"));
  26653. } else {
  26654. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_select: could not allocate DHCP request\n"));
  26655. }
  26656. dhcp->tries++;
  26657. 802a49c: 7b63 ldrb r3, [r4, #13]
  26658. 802a49e: 3301 adds r3, #1
  26659. 802a4a0: b2db uxtb r3, r3
  26660. msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
  26661. 802a4a2: 2b05 cmp r3, #5
  26662. 802a4a4: bf98 it ls
  26663. 802a4a6: f44f 727a movls.w r2, #1000 ; 0x3e8
  26664. dhcp_delete_msg(dhcp);
  26665. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_select: REQUESTING\n"));
  26666. } else {
  26667. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_select: could not allocate DHCP request\n"));
  26668. }
  26669. dhcp->tries++;
  26670. 802a4aa: 7363 strb r3, [r4, #13]
  26671. msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
  26672. 802a4ac: bf9a itte ls
  26673. 802a4ae: fa02 f303 lslls.w r3, r2, r3
  26674. 802a4b2: b29b uxthls r3, r3
  26675. 802a4b4: f64e 2360 movwhi r3, #60000 ; 0xea60
  26676. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  26677. 802a4b8: f44f 72fa mov.w r2, #500 ; 0x1f4
  26678. 802a4bc: f203 13f3 addw r3, r3, #499 ; 0x1f3
  26679. 802a4c0: fb93 f3f2 sdiv r3, r3, r2
  26680. 802a4c4: 8363 strh r3, [r4, #26]
  26681. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_select(): set request timeout %"U16_F" msecs\n", msecs));
  26682. return result;
  26683. }
  26684. 802a4c6: 4630 mov r0, r6
  26685. 802a4c8: bd7c pop {r2, r3, r4, r5, r6, pc}
  26686. 802a4ca: bf00 nop
  26687. 802a4cc: 0803abf8 .word 0x0803abf8
  26688. 0802a4d0 <dhcp_check>:
  26689. *
  26690. * @param netif the netif under DHCP control
  26691. */
  26692. static void
  26693. dhcp_check(struct netif *netif)
  26694. {
  26695. 802a4d0: b538 push {r3, r4, r5, lr}
  26696. struct dhcp *dhcp = netif->dhcp;
  26697. 802a4d2: 6a04 ldr r4, [r0, #32]
  26698. *
  26699. * @param netif the netif under DHCP control
  26700. */
  26701. static void
  26702. dhcp_check(struct netif *netif)
  26703. {
  26704. 802a4d4: 4605 mov r5, r0
  26705. struct dhcp *dhcp = netif->dhcp;
  26706. err_t result;
  26707. u16_t msecs;
  26708. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_check(netif=%p) %c%c\n", (void *)netif, (s16_t)netif->name[0],
  26709. (s16_t)netif->name[1]));
  26710. dhcp_set_state(dhcp, DHCP_CHECKING);
  26711. 802a4d6: 2108 movs r1, #8
  26712. 802a4d8: 4620 mov r0, r4
  26713. 802a4da: f7ff fd89 bl 8029ff0 <dhcp_set_state>
  26714. /* create an ARP query for the offered IP address, expecting that no host
  26715. responds, as the IP address should not be in use. */
  26716. result = etharp_query(netif, &dhcp->offered_ip_addr, NULL);
  26717. 802a4de: 4628 mov r0, r5
  26718. 802a4e0: f104 0124 add.w r1, r4, #36 ; 0x24
  26719. 802a4e4: 2200 movs r2, #0
  26720. 802a4e6: f007 ff41 bl 803236c <etharp_query>
  26721. if (result != ERR_OK) {
  26722. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_check: could not perform ARP query\n"));
  26723. }
  26724. dhcp->tries++;
  26725. 802a4ea: 7b63 ldrb r3, [r4, #13]
  26726. 802a4ec: 3301 adds r3, #1
  26727. 802a4ee: 7363 strb r3, [r4, #13]
  26728. msecs = 500;
  26729. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  26730. 802a4f0: 2301 movs r3, #1
  26731. 802a4f2: 8363 strh r3, [r4, #26]
  26732. 802a4f4: bd38 pop {r3, r4, r5, pc}
  26733. 0802a4f6 <dhcp_bind>:
  26734. *
  26735. * @param netif network interface to bind to the offered address
  26736. */
  26737. static void
  26738. dhcp_bind(struct netif *netif)
  26739. {
  26740. 802a4f6: b537 push {r0, r1, r2, r4, r5, lr}
  26741. u32_t timeout;
  26742. struct dhcp *dhcp;
  26743. ip_addr_t sn_mask, gw_addr;
  26744. LWIP_ERROR("dhcp_bind: netif != NULL", (netif != NULL), return;);
  26745. 802a4f8: 4605 mov r5, r0
  26746. 802a4fa: 2800 cmp r0, #0
  26747. 802a4fc: d059 beq.n 802a5b2 <dhcp_bind+0xbc>
  26748. dhcp = netif->dhcp;
  26749. 802a4fe: 6a04 ldr r4, [r0, #32]
  26750. LWIP_ERROR("dhcp_bind: dhcp != NULL", (dhcp != NULL), return;);
  26751. 802a500: 2c00 cmp r4, #0
  26752. 802a502: d056 beq.n 802a5b2 <dhcp_bind+0xbc>
  26753. 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));
  26754. /* temporary DHCP lease? */
  26755. if (dhcp->offered_t1_renew != 0xffffffffUL) {
  26756. 802a504: 6b63 ldr r3, [r4, #52] ; 0x34
  26757. 802a506: 1c58 adds r0, r3, #1
  26758. 802a508: d00d beq.n 802a526 <dhcp_bind+0x30>
  26759. /* set renewal period timer */
  26760. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t1 renewal timer %"U32_F" secs\n", dhcp->offered_t1_renew));
  26761. timeout = (dhcp->offered_t1_renew + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
  26762. 802a50a: 223c movs r2, #60 ; 0x3c
  26763. 802a50c: 331e adds r3, #30
  26764. 802a50e: fbb3 f3f2 udiv r3, r3, r2
  26765. if(timeout > 0xffff) {
  26766. timeout = 0xffff;
  26767. }
  26768. dhcp->t1_timeout = (u16_t)timeout;
  26769. 802a512: f64f 72ff movw r2, #65535 ; 0xffff
  26770. 802a516: 4293 cmp r3, r2
  26771. 802a518: bf28 it cs
  26772. 802a51a: 4613 movcs r3, r2
  26773. 802a51c: b29b uxth r3, r3
  26774. 802a51e: 83a3 strh r3, [r4, #28]
  26775. if (dhcp->t1_timeout == 0) {
  26776. 802a520: b90b cbnz r3, 802a526 <dhcp_bind+0x30>
  26777. dhcp->t1_timeout = 1;
  26778. 802a522: 2301 movs r3, #1
  26779. 802a524: 83a3 strh r3, [r4, #28]
  26780. }
  26781. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t1_renew*1000));
  26782. }
  26783. /* set renewal period timer */
  26784. if (dhcp->offered_t2_rebind != 0xffffffffUL) {
  26785. 802a526: 6ba3 ldr r3, [r4, #56] ; 0x38
  26786. 802a528: 1c59 adds r1, r3, #1
  26787. 802a52a: d00d beq.n 802a548 <dhcp_bind+0x52>
  26788. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t2 rebind timer %"U32_F" secs\n", dhcp->offered_t2_rebind));
  26789. timeout = (dhcp->offered_t2_rebind + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
  26790. 802a52c: 223c movs r2, #60 ; 0x3c
  26791. 802a52e: 331e adds r3, #30
  26792. 802a530: fbb3 f3f2 udiv r3, r3, r2
  26793. if(timeout > 0xffff) {
  26794. timeout = 0xffff;
  26795. }
  26796. dhcp->t2_timeout = (u16_t)timeout;
  26797. 802a534: f64f 72ff movw r2, #65535 ; 0xffff
  26798. 802a538: 4293 cmp r3, r2
  26799. 802a53a: bf28 it cs
  26800. 802a53c: 4613 movcs r3, r2
  26801. 802a53e: b29b uxth r3, r3
  26802. 802a540: 83e3 strh r3, [r4, #30]
  26803. if (dhcp->t2_timeout == 0) {
  26804. 802a542: b90b cbnz r3, 802a548 <dhcp_bind+0x52>
  26805. dhcp->t2_timeout = 1;
  26806. 802a544: 2301 movs r3, #1
  26807. 802a546: 83e3 strh r3, [r4, #30]
  26808. }
  26809. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t2_rebind*1000));
  26810. }
  26811. /* If we have sub 1 minute lease, t2 and t1 will kick in at the same time. */
  26812. if ((dhcp->t1_timeout >= dhcp->t2_timeout) && (dhcp->t2_timeout > 0)) {
  26813. 802a548: 8be3 ldrh r3, [r4, #30]
  26814. 802a54a: 8ba2 ldrh r2, [r4, #28]
  26815. 802a54c: 429a cmp r2, r3
  26816. 802a54e: d302 bcc.n 802a556 <dhcp_bind+0x60>
  26817. 802a550: b10b cbz r3, 802a556 <dhcp_bind+0x60>
  26818. dhcp->t1_timeout = 0;
  26819. 802a552: 2300 movs r3, #0
  26820. 802a554: 83a3 strh r3, [r4, #28]
  26821. }
  26822. if (dhcp->subnet_mask_given) {
  26823. 802a556: 7ba3 ldrb r3, [r4, #14]
  26824. 802a558: b10b cbz r3, 802a55e <dhcp_bind+0x68>
  26825. /* copy offered network mask */
  26826. ip_addr_copy(sn_mask, dhcp->offered_sn_mask);
  26827. 802a55a: 6aa3 ldr r3, [r4, #40] ; 0x28
  26828. 802a55c: e00b b.n 802a576 <dhcp_bind+0x80>
  26829. } else {
  26830. /* subnet mask not given, choose a safe subnet mask given the network class */
  26831. u8_t first_octet = ip4_addr1(&dhcp->offered_ip_addr);
  26832. 802a55e: f894 3024 ldrb.w r3, [r4, #36] ; 0x24
  26833. if (first_octet <= 127) {
  26834. 802a562: 061a lsls r2, r3, #24
  26835. 802a564: d401 bmi.n 802a56a <dhcp_bind+0x74>
  26836. ip4_addr_set_u32(&sn_mask, PP_HTONL(0xff000000UL));
  26837. 802a566: 23ff movs r3, #255 ; 0xff
  26838. 802a568: e005 b.n 802a576 <dhcp_bind+0x80>
  26839. } else if (first_octet >= 192) {
  26840. 802a56a: 2bbf cmp r3, #191 ; 0xbf
  26841. ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffffff00UL));
  26842. 802a56c: bf8c ite hi
  26843. 802a56e: f06f 437f mvnhi.w r3, #4278190080 ; 0xff000000
  26844. } else {
  26845. ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffff0000UL));
  26846. 802a572: f64f 73ff movwls r3, #65535 ; 0xffff
  26847. 802a576: 9300 str r3, [sp, #0]
  26848. }
  26849. }
  26850. ip_addr_copy(gw_addr, dhcp->offered_gw_addr);
  26851. 802a578: 6ae3 ldr r3, [r4, #44] ; 0x2c
  26852. 802a57a: 9301 str r3, [sp, #4]
  26853. /* gateway address not given? */
  26854. if (ip_addr_isany(&gw_addr)) {
  26855. 802a57c: b92b cbnz r3, 802a58a <dhcp_bind+0x94>
  26856. /* copy network address */
  26857. ip_addr_get_network(&gw_addr, &dhcp->offered_ip_addr, &sn_mask);
  26858. 802a57e: 6a63 ldr r3, [r4, #36] ; 0x24
  26859. 802a580: 9a00 ldr r2, [sp, #0]
  26860. 802a582: 4013 ands r3, r2
  26861. /* use first host address on network as gateway */
  26862. ip4_addr_set_u32(&gw_addr, ip4_addr_get_u32(&gw_addr) | PP_HTONL(0x00000001UL));
  26863. 802a584: f043 7380 orr.w r3, r3, #16777216 ; 0x1000000
  26864. 802a588: 9301 str r3, [sp, #4]
  26865. }
  26866. #endif /* LWIP_DHCP_AUTOIP_COOP */
  26867. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): IP: 0x%08"X32_F"\n",
  26868. ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  26869. netif_set_ipaddr(netif, &dhcp->offered_ip_addr);
  26870. 802a58a: 4628 mov r0, r5
  26871. 802a58c: f104 0124 add.w r1, r4, #36 ; 0x24
  26872. 802a590: f000 fd6a bl 802b068 <netif_set_ipaddr>
  26873. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): SN: 0x%08"X32_F"\n",
  26874. ip4_addr_get_u32(&sn_mask)));
  26875. netif_set_netmask(netif, &sn_mask);
  26876. 802a594: 4628 mov r0, r5
  26877. 802a596: 4669 mov r1, sp
  26878. 802a598: f000 fda6 bl 802b0e8 <netif_set_netmask>
  26879. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): GW: 0x%08"X32_F"\n",
  26880. ip4_addr_get_u32(&gw_addr)));
  26881. netif_set_gw(netif, &gw_addr);
  26882. 802a59c: a901 add r1, sp, #4
  26883. 802a59e: 4628 mov r0, r5
  26884. 802a5a0: f000 fd9e bl 802b0e0 <netif_set_gw>
  26885. /* bring the interface up */
  26886. netif_set_up(netif);
  26887. 802a5a4: 4628 mov r0, r5
  26888. 802a5a6: f000 fdf5 bl 802b194 <netif_set_up>
  26889. /* netif is now bound to DHCP leased address */
  26890. dhcp_set_state(dhcp, DHCP_BOUND);
  26891. 802a5aa: 4620 mov r0, r4
  26892. 802a5ac: 210a movs r1, #10
  26893. 802a5ae: f7ff fd1f bl 8029ff0 <dhcp_set_state>
  26894. }
  26895. 802a5b2: bd3e pop {r1, r2, r3, r4, r5, pc}
  26896. 0802a5b4 <dhcp_recv>:
  26897. /**
  26898. * If an incoming DHCP message is in response to us, then trigger the state machine
  26899. */
  26900. static void
  26901. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  26902. {
  26903. 802a5b4: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  26904. 802a5b8: 4692 mov sl, r2
  26905. 802a5ba: b08b sub sp, #44 ; 0x2c
  26906. LWIP_UNUSED_ARG(addr);
  26907. LWIP_UNUSED_ARG(port);
  26908. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  26909. if (p->len < DHCP_MIN_REPLY_LEN) {
  26910. 802a5bc: f8ba 300a ldrh.w r3, [sl, #10]
  26911. */
  26912. static void
  26913. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  26914. {
  26915. struct netif *netif = (struct netif *)arg;
  26916. struct dhcp *dhcp = netif->dhcp;
  26917. 802a5c0: f8d0 8020 ldr.w r8, [r0, #32]
  26918. struct dhcp_msg *reply_msg = (struct dhcp_msg *)p->payload;
  26919. 802a5c4: 6852 ldr r2, [r2, #4]
  26920. LWIP_UNUSED_ARG(addr);
  26921. LWIP_UNUSED_ARG(port);
  26922. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  26923. if (p->len < DHCP_MIN_REPLY_LEN) {
  26924. 802a5c6: 2b2b cmp r3, #43 ; 0x2b
  26925. /**
  26926. * If an incoming DHCP message is in response to us, then trigger the state machine
  26927. */
  26928. static void
  26929. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  26930. {
  26931. 802a5c8: 4605 mov r5, r0
  26932. LWIP_UNUSED_ARG(addr);
  26933. LWIP_UNUSED_ARG(port);
  26934. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  26935. if (p->len < DHCP_MIN_REPLY_LEN) {
  26936. 802a5ca: f240 81b8 bls.w 802a93e <dhcp_recv+0x38a>
  26937. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP reply message or pbuf too short\n"));
  26938. goto free_pbuf_and_return;
  26939. }
  26940. if (reply_msg->op != DHCP_BOOTREPLY) {
  26941. 802a5ce: 7813 ldrb r3, [r2, #0]
  26942. 802a5d0: 2b02 cmp r3, #2
  26943. 802a5d2: f040 81b4 bne.w 802a93e <dhcp_recv+0x38a>
  26944. 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));
  26945. goto free_pbuf_and_return;
  26946. }
  26947. /* iterate through hardware address and match against DHCP message */
  26948. for (i = 0; i < netif->hwaddr_len; i++) {
  26949. 802a5d6: f890 1026 ldrb.w r1, [r0, #38] ; 0x26
  26950. 802a5da: 2300 movs r3, #0
  26951. 802a5dc: e008 b.n 802a5f0 <dhcp_recv+0x3c>
  26952. /**
  26953. * If an incoming DHCP message is in response to us, then trigger the state machine
  26954. */
  26955. static void
  26956. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  26957. 802a5de: 18e8 adds r0, r5, r3
  26958. 802a5e0: 3301 adds r3, #1
  26959. 802a5e2: 18d4 adds r4, r2, r3
  26960. 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));
  26961. goto free_pbuf_and_return;
  26962. }
  26963. /* iterate through hardware address and match against DHCP message */
  26964. for (i = 0; i < netif->hwaddr_len; i++) {
  26965. if (netif->hwaddr[i] != reply_msg->chaddr[i]) {
  26966. 802a5e4: f890 0027 ldrb.w r0, [r0, #39] ; 0x27
  26967. 802a5e8: 7ee4 ldrb r4, [r4, #27]
  26968. 802a5ea: 4284 cmp r4, r0
  26969. 802a5ec: f040 81a7 bne.w 802a93e <dhcp_recv+0x38a>
  26970. if (reply_msg->op != DHCP_BOOTREPLY) {
  26971. 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));
  26972. goto free_pbuf_and_return;
  26973. }
  26974. /* iterate through hardware address and match against DHCP message */
  26975. for (i = 0; i < netif->hwaddr_len; i++) {
  26976. 802a5f0: b2d8 uxtb r0, r3
  26977. 802a5f2: 4288 cmp r0, r1
  26978. 802a5f4: d3f3 bcc.n 802a5de <dhcp_recv+0x2a>
  26979. (u16_t)i, (u16_t)netif->hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i]));
  26980. goto free_pbuf_and_return;
  26981. }
  26982. }
  26983. /* match transaction ID against what we expected */
  26984. if (ntohl(reply_msg->xid) != dhcp->xid) {
  26985. 802a5f6: 6850 ldr r0, [r2, #4]
  26986. 802a5f8: f7ff fcf8 bl 8029fec <lwip_ntohl>
  26987. 802a5fc: f8d8 3000 ldr.w r3, [r8]
  26988. 802a600: 4298 cmp r0, r3
  26989. 802a602: f040 819c bne.w 802a93e <dhcp_recv+0x38a>
  26990. struct pbuf *q;
  26991. int parse_file_as_options = 0;
  26992. int parse_sname_as_options = 0;
  26993. /* clear received options */
  26994. dhcp_clear_all_options(dhcp);
  26995. 802a606: 2100 movs r1, #0
  26996. 802a608: 220a movs r2, #10
  26997. 802a60a: 489d ldr r0, [pc, #628] ; (802a880 <dhcp_recv+0x2cc>)
  26998. 802a60c: f7f7 f8d4 bl 80217b8 <memset>
  26999. /* check that beginning of dhcp_msg (up to and including chaddr) is in first pbuf */
  27000. if (p->len < DHCP_SNAME_OFS) {
  27001. 802a610: f8ba 300a ldrh.w r3, [sl, #10]
  27002. 802a614: 2b2b cmp r3, #43 ; 0x2b
  27003. 802a616: f240 8192 bls.w 802a93e <dhcp_recv+0x38a>
  27004. return ERR_BUF;
  27005. }
  27006. dhcp->msg_in = (struct dhcp_msg *)p->payload;
  27007. 802a61a: f8da 3004 ldr.w r3, [sl, #4]
  27008. /* parse options */
  27009. /* start with options field */
  27010. options_idx = DHCP_OPTIONS_OFS;
  27011. /* parse options to the end of the received packet */
  27012. options_idx_max = p->tot_len;
  27013. 802a61e: f8ba 9008 ldrh.w r9, [sl, #8]
  27014. dhcp_clear_all_options(dhcp);
  27015. /* check that beginning of dhcp_msg (up to and including chaddr) is in first pbuf */
  27016. if (p->len < DHCP_SNAME_OFS) {
  27017. return ERR_BUF;
  27018. }
  27019. dhcp->msg_in = (struct dhcp_msg *)p->payload;
  27020. 802a622: f8c8 3008 str.w r3, [r8, #8]
  27021. u16_t offset_max;
  27022. u16_t options_idx;
  27023. u16_t options_idx_max;
  27024. struct pbuf *q;
  27025. int parse_file_as_options = 0;
  27026. int parse_sname_as_options = 0;
  27027. 802a626: f04f 0b00 mov.w fp, #0
  27028. #endif /* LWIP_DHCP_BOOTP_FILE */
  27029. /* parse options */
  27030. /* start with options field */
  27031. options_idx = DHCP_OPTIONS_OFS;
  27032. 802a62a: 22f0 movs r2, #240 ; 0xf0
  27033. 802a62c: e004 b.n 802a638 <dhcp_recv+0x84>
  27034. parse_file_as_options = 0;
  27035. options_idx = DHCP_FILE_OFS;
  27036. options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
  27037. goto again;
  27038. } else if (parse_sname_as_options) {
  27039. parse_sname_as_options = 0;
  27040. 802a62e: f04f 0b00 mov.w fp, #0
  27041. options_idx = DHCP_SNAME_OFS;
  27042. options_idx_max = DHCP_SNAME_OFS + DHCP_SNAME_LEN;
  27043. 802a632: f04f 096c mov.w r9, #108 ; 0x6c
  27044. options_idx = DHCP_FILE_OFS;
  27045. options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
  27046. goto again;
  27047. } else if (parse_sname_as_options) {
  27048. parse_sname_as_options = 0;
  27049. options_idx = DHCP_SNAME_OFS;
  27050. 802a636: 222c movs r2, #44 ; 0x2c
  27051. #endif /* LWIP_DHCP_BOOTP_FILE */
  27052. /* parse options */
  27053. /* start with options field */
  27054. options_idx = DHCP_OPTIONS_OFS;
  27055. 802a638: 4657 mov r7, sl
  27056. 802a63a: e009 b.n 802a650 <dhcp_recv+0x9c>
  27057. again:
  27058. q = p;
  27059. while((q != NULL) && (options_idx >= q->len)) {
  27060. options_idx -= q->len;
  27061. options_idx_max -= q->len;
  27062. q = q->next;
  27063. 802a63c: 683f ldr r7, [r7, #0]
  27064. /* parse options to the end of the received packet */
  27065. options_idx_max = p->tot_len;
  27066. again:
  27067. q = p;
  27068. while((q != NULL) && (options_idx >= q->len)) {
  27069. options_idx -= q->len;
  27070. 802a63e: 1ad2 subs r2, r2, r3
  27071. options_idx_max -= q->len;
  27072. 802a640: ebc3 0909 rsb r9, r3, r9
  27073. /* parse options to the end of the received packet */
  27074. options_idx_max = p->tot_len;
  27075. again:
  27076. q = p;
  27077. while((q != NULL) && (options_idx >= q->len)) {
  27078. options_idx -= q->len;
  27079. 802a644: b292 uxth r2, r2
  27080. options_idx_max -= q->len;
  27081. 802a646: fa1f f989 uxth.w r9, r9
  27082. options_idx = DHCP_OPTIONS_OFS;
  27083. /* parse options to the end of the received packet */
  27084. options_idx_max = p->tot_len;
  27085. again:
  27086. q = p;
  27087. while((q != NULL) && (options_idx >= q->len)) {
  27088. 802a64a: 2f00 cmp r7, #0
  27089. 802a64c: f000 8177 beq.w 802a93e <dhcp_recv+0x38a>
  27090. 802a650: 897b ldrh r3, [r7, #10]
  27091. 802a652: 429a cmp r2, r3
  27092. 802a654: d2f2 bcs.n 802a63c <dhcp_recv+0x88>
  27093. if (q == NULL) {
  27094. return ERR_BUF;
  27095. }
  27096. offset = options_idx;
  27097. offset_max = options_idx_max;
  27098. options = (u8_t*)q->payload;
  27099. 802a656: 6878 ldr r0, [r7, #4]
  27100. 802a658: 9003 str r0, [sp, #12]
  27101. 802a65a: e0db b.n 802a814 <dhcp_recv+0x260>
  27102. u8_t len;
  27103. u8_t decode_len = 0;
  27104. int decode_idx = -1;
  27105. u16_t val_offset = offset + 2;
  27106. /* len byte might be in the next pbuf */
  27107. if (offset + 1 < q->len) {
  27108. 802a65c: 897b ldrh r3, [r7, #10]
  27109. 802a65e: 1c50 adds r0, r2, #1
  27110. 802a660: 4298 cmp r0, r3
  27111. 802a662: da03 bge.n 802a66c <dhcp_recv+0xb8>
  27112. len = options[offset + 1];
  27113. 802a664: 9803 ldr r0, [sp, #12]
  27114. 802a666: 1883 adds r3, r0, r2
  27115. 802a668: 785b ldrb r3, [r3, #1]
  27116. 802a66a: e003 b.n 802a674 <dhcp_recv+0xc0>
  27117. } else {
  27118. len = (q->next != NULL ? ((u8_t*)q->next->payload)[0] : 0);
  27119. 802a66c: 683b ldr r3, [r7, #0]
  27120. 802a66e: b10b cbz r3, 802a674 <dhcp_recv+0xc0>
  27121. 802a670: 685b ldr r3, [r3, #4]
  27122. 802a672: 781b ldrb r3, [r3, #0]
  27123. }
  27124. /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */
  27125. decode_len = len;
  27126. switch(op) {
  27127. 802a674: 2933 cmp r1, #51 ; 0x33
  27128. 802a676: d038 beq.n 802a6ea <dhcp_recv+0x136>
  27129. 802a678: d807 bhi.n 802a68a <dhcp_recv+0xd6>
  27130. 802a67a: 2901 cmp r1, #1
  27131. 802a67c: d019 beq.n 802a6b2 <dhcp_recv+0xfe>
  27132. 802a67e: d311 bcc.n 802a6a4 <dhcp_recv+0xf0>
  27133. 802a680: 2903 cmp r1, #3
  27134. 802a682: d01d beq.n 802a6c0 <dhcp_recv+0x10c>
  27135. 802a684: 2906 cmp r1, #6
  27136. 802a686: d155 bne.n 802a734 <dhcp_recv+0x180>
  27137. 802a688: e021 b.n 802a6ce <dhcp_recv+0x11a>
  27138. 802a68a: 2936 cmp r1, #54 ; 0x36
  27139. 802a68c: d03d beq.n 802a70a <dhcp_recv+0x156>
  27140. 802a68e: d804 bhi.n 802a69a <dhcp_recv+0xe6>
  27141. 802a690: 2934 cmp r1, #52 ; 0x34
  27142. 802a692: d031 beq.n 802a6f8 <dhcp_recv+0x144>
  27143. 802a694: 2935 cmp r1, #53 ; 0x35
  27144. 802a696: d14d bne.n 802a734 <dhcp_recv+0x180>
  27145. 802a698: e035 b.n 802a706 <dhcp_recv+0x152>
  27146. 802a69a: 293a cmp r1, #58 ; 0x3a
  27147. 802a69c: d03c beq.n 802a718 <dhcp_recv+0x164>
  27148. 802a69e: 293b cmp r1, #59 ; 0x3b
  27149. 802a6a0: d148 bne.n 802a734 <dhcp_recv+0x180>
  27150. 802a6a2: e040 b.n 802a726 <dhcp_recv+0x172>
  27151. /* case(DHCP_OPTION_END): handled above */
  27152. case(DHCP_OPTION_PAD):
  27153. /* special option: no len encoded */
  27154. decode_len = len = 0;
  27155. /* will be increased below */
  27156. offset--;
  27157. 802a6a4: 1e51 subs r1, r2, #1
  27158. decode_len = len;
  27159. switch(op) {
  27160. /* case(DHCP_OPTION_END): handled above */
  27161. case(DHCP_OPTION_PAD):
  27162. /* special option: no len encoded */
  27163. decode_len = len = 0;
  27164. 802a6a6: 2300 movs r3, #0
  27165. /* will be increased below */
  27166. offset--;
  27167. 802a6a8: b289 uxth r1, r1
  27168. /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */
  27169. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  27170. u8_t op = options[offset];
  27171. u8_t len;
  27172. u8_t decode_len = 0;
  27173. int decode_idx = -1;
  27174. 802a6aa: f04f 34ff mov.w r4, #4294967295
  27175. decode_len = len;
  27176. switch(op) {
  27177. /* case(DHCP_OPTION_END): handled above */
  27178. case(DHCP_OPTION_PAD):
  27179. /* special option: no len encoded */
  27180. decode_len = len = 0;
  27181. 802a6ae: 461e mov r6, r3
  27182. 802a6b0: e044 b.n 802a73c <dhcp_recv+0x188>
  27183. /* will be increased below */
  27184. offset--;
  27185. break;
  27186. case(DHCP_OPTION_SUBNET_MASK):
  27187. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  27188. 802a6b2: 2b04 cmp r3, #4
  27189. 802a6b4: f040 8143 bne.w 802a93e <dhcp_recv+0x38a>
  27190. 802a6b8: 461e mov r6, r3
  27191. 802a6ba: 4611 mov r1, r2
  27192. decode_idx = DHCP_OPTION_IDX_SUBNET_MASK;
  27193. 802a6bc: 2406 movs r4, #6
  27194. 802a6be: e03d b.n 802a73c <dhcp_recv+0x188>
  27195. break;
  27196. case(DHCP_OPTION_ROUTER):
  27197. decode_len = 4; /* only copy the first given router */
  27198. LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
  27199. 802a6c0: 2b03 cmp r3, #3
  27200. 802a6c2: f240 813c bls.w 802a93e <dhcp_recv+0x38a>
  27201. 802a6c6: 4611 mov r1, r2
  27202. decode_idx = DHCP_OPTION_IDX_ROUTER;
  27203. 802a6c8: 2407 movs r4, #7
  27204. case(DHCP_OPTION_SUBNET_MASK):
  27205. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  27206. decode_idx = DHCP_OPTION_IDX_SUBNET_MASK;
  27207. break;
  27208. case(DHCP_OPTION_ROUTER):
  27209. decode_len = 4; /* only copy the first given router */
  27210. 802a6ca: 2604 movs r6, #4
  27211. 802a6cc: e036 b.n 802a73c <dhcp_recv+0x188>
  27212. LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
  27213. decode_idx = DHCP_OPTION_IDX_ROUTER;
  27214. break;
  27215. case(DHCP_OPTION_DNS_SERVER):
  27216. /* special case: there might be more than one server */
  27217. LWIP_ERROR("len % 4 == 0", len % 4 == 0, return ERR_VAL;);
  27218. 802a6ce: 0799 lsls r1, r3, #30
  27219. 802a6d0: f040 8135 bne.w 802a93e <dhcp_recv+0x38a>
  27220. /* limit number of DNS servers */
  27221. decode_len = LWIP_MIN(len, 4 * DNS_MAX_SERVERS);
  27222. 802a6d4: 2b08 cmp r3, #8
  27223. 802a6d6: bf34 ite cc
  27224. 802a6d8: 461e movcc r6, r3
  27225. 802a6da: 2608 movcs r6, #8
  27226. 802a6dc: b2f6 uxtb r6, r6
  27227. LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
  27228. 802a6de: 42b3 cmp r3, r6
  27229. 802a6e0: f0c0 812d bcc.w 802a93e <dhcp_recv+0x38a>
  27230. 802a6e4: 4611 mov r1, r2
  27231. decode_idx = DHCP_OPTION_IDX_DNS_SERVER;
  27232. 802a6e6: 2408 movs r4, #8
  27233. 802a6e8: e028 b.n 802a73c <dhcp_recv+0x188>
  27234. break;
  27235. case(DHCP_OPTION_LEASE_TIME):
  27236. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  27237. 802a6ea: 2b04 cmp r3, #4
  27238. 802a6ec: f040 8127 bne.w 802a93e <dhcp_recv+0x38a>
  27239. 802a6f0: 461e mov r6, r3
  27240. 802a6f2: 4611 mov r1, r2
  27241. decode_idx = DHCP_OPTION_IDX_LEASE_TIME;
  27242. 802a6f4: 2403 movs r4, #3
  27243. 802a6f6: e021 b.n 802a73c <dhcp_recv+0x188>
  27244. break;
  27245. case(DHCP_OPTION_OVERLOAD):
  27246. LWIP_ERROR("len == 1", len == 1, return ERR_VAL;);
  27247. 802a6f8: 2b01 cmp r3, #1
  27248. 802a6fa: f040 8120 bne.w 802a93e <dhcp_recv+0x38a>
  27249. 802a6fe: 461e mov r6, r3
  27250. 802a700: 4611 mov r1, r2
  27251. decode_idx = DHCP_OPTION_IDX_OVERLOAD;
  27252. 802a702: 2400 movs r4, #0
  27253. 802a704: e01a b.n 802a73c <dhcp_recv+0x188>
  27254. break;
  27255. case(DHCP_OPTION_MESSAGE_TYPE):
  27256. LWIP_ERROR("len == 1", len == 1, return ERR_VAL;);
  27257. 802a706: 2b01 cmp r3, #1
  27258. 802a708: e007 b.n 802a71a <dhcp_recv+0x166>
  27259. decode_idx = DHCP_OPTION_IDX_MSG_TYPE;
  27260. break;
  27261. case(DHCP_OPTION_SERVER_ID):
  27262. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  27263. 802a70a: 2b04 cmp r3, #4
  27264. 802a70c: f040 8117 bne.w 802a93e <dhcp_recv+0x38a>
  27265. 802a710: 461e mov r6, r3
  27266. 802a712: 4611 mov r1, r2
  27267. decode_idx = DHCP_OPTION_IDX_SERVER_ID;
  27268. 802a714: 2402 movs r4, #2
  27269. 802a716: e011 b.n 802a73c <dhcp_recv+0x188>
  27270. break;
  27271. case(DHCP_OPTION_T1):
  27272. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  27273. 802a718: 2b04 cmp r3, #4
  27274. 802a71a: f040 8110 bne.w 802a93e <dhcp_recv+0x38a>
  27275. 802a71e: 461e mov r6, r3
  27276. 802a720: 4611 mov r1, r2
  27277. decode_idx = DHCP_OPTION_IDX_T1;
  27278. 802a722: 461c mov r4, r3
  27279. 802a724: e00a b.n 802a73c <dhcp_recv+0x188>
  27280. break;
  27281. case(DHCP_OPTION_T2):
  27282. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  27283. 802a726: 2b04 cmp r3, #4
  27284. 802a728: f040 8109 bne.w 802a93e <dhcp_recv+0x38a>
  27285. 802a72c: 461e mov r6, r3
  27286. 802a72e: 4611 mov r1, r2
  27287. decode_idx = DHCP_OPTION_IDX_T2;
  27288. 802a730: 2405 movs r4, #5
  27289. 802a732: e003 b.n 802a73c <dhcp_recv+0x188>
  27290. } else {
  27291. len = (q->next != NULL ? ((u8_t*)q->next->payload)[0] : 0);
  27292. }
  27293. /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */
  27294. decode_len = len;
  27295. switch(op) {
  27296. 802a734: 4611 mov r1, r2
  27297. /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */
  27298. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  27299. u8_t op = options[offset];
  27300. u8_t len;
  27301. u8_t decode_len = 0;
  27302. int decode_idx = -1;
  27303. 802a736: f04f 34ff mov.w r4, #4294967295
  27304. case(DHCP_OPTION_T2):
  27305. LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
  27306. decode_idx = DHCP_OPTION_IDX_T2;
  27307. break;
  27308. default:
  27309. decode_len = 0;
  27310. 802a73a: 2600 movs r6, #0
  27311. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  27312. break;
  27313. }
  27314. offset += len + 2;
  27315. 802a73c: 3102 adds r1, #2
  27316. 802a73e: fa13 f381 uxtah r3, r3, r1
  27317. 802a742: b29b uxth r3, r3
  27318. 802a744: 9301 str r3, [sp, #4]
  27319. if (decode_len > 0) {
  27320. 802a746: 2e00 cmp r6, #0
  27321. 802a748: d04f beq.n 802a7ea <dhcp_recv+0x236>
  27322. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  27323. u8_t op = options[offset];
  27324. u8_t len;
  27325. u8_t decode_len = 0;
  27326. int decode_idx = -1;
  27327. u16_t val_offset = offset + 2;
  27328. 802a74a: 3202 adds r2, #2
  27329. 802a74c: b292 uxth r2, r2
  27330. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  27331. break;
  27332. }
  27333. offset += len + 2;
  27334. if (decode_len > 0) {
  27335. u32_t value = 0;
  27336. 802a74e: a90a add r1, sp, #40 ; 0x28
  27337. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  27338. u8_t op = options[offset];
  27339. u8_t len;
  27340. u8_t decode_len = 0;
  27341. int decode_idx = -1;
  27342. u16_t val_offset = offset + 2;
  27343. 802a750: 9205 str r2, [sp, #20]
  27344. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  27345. break;
  27346. }
  27347. offset += len + 2;
  27348. if (decode_len > 0) {
  27349. u32_t value = 0;
  27350. 802a752: 2300 movs r3, #0
  27351. /**
  27352. * If an incoming DHCP message is in response to us, then trigger the state machine
  27353. */
  27354. static void
  27355. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  27356. 802a754: 4a4b ldr r2, [pc, #300] ; (802a884 <dhcp_recv+0x2d0>)
  27357. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  27358. break;
  27359. }
  27360. offset += len + 2;
  27361. if (decode_len > 0) {
  27362. u32_t value = 0;
  27363. 802a756: f841 3d04 str.w r3, [r1, #-4]!
  27364. /**
  27365. * If an incoming DHCP message is in response to us, then trigger the state machine
  27366. */
  27367. static void
  27368. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  27369. 802a75a: eb02 0284 add.w r2, r2, r4, lsl #2
  27370. LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op));
  27371. break;
  27372. }
  27373. offset += len + 2;
  27374. if (decode_len > 0) {
  27375. u32_t value = 0;
  27376. 802a75e: 9104 str r1, [sp, #16]
  27377. /**
  27378. * If an incoming DHCP message is in response to us, then trigger the state machine
  27379. */
  27380. static void
  27381. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  27382. 802a760: 9206 str r2, [sp, #24]
  27383. 802a762: 9302 str r3, [sp, #8]
  27384. 802a764: 9805 ldr r0, [sp, #20]
  27385. 802a766: 9902 ldr r1, [sp, #8]
  27386. if (decode_len > 0) {
  27387. u32_t value = 0;
  27388. u16_t copy_len;
  27389. decode_next:
  27390. LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
  27391. if (!dhcp_option_given(dhcp, decode_idx)) {
  27392. 802a768: 4a45 ldr r2, [pc, #276] ; (802a880 <dhcp_recv+0x2cc>)
  27393. /**
  27394. * If an incoming DHCP message is in response to us, then trigger the state machine
  27395. */
  27396. static void
  27397. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  27398. 802a76a: 1843 adds r3, r0, r1
  27399. if (decode_len > 0) {
  27400. u32_t value = 0;
  27401. u16_t copy_len;
  27402. decode_next:
  27403. LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
  27404. if (!dhcp_option_given(dhcp, decode_idx)) {
  27405. 802a76c: 4844 ldr r0, [pc, #272] ; (802a880 <dhcp_recv+0x2cc>)
  27406. 802a76e: 18a2 adds r2, r4, r2
  27407. 802a770: 9207 str r2, [sp, #28]
  27408. 802a772: 5c22 ldrb r2, [r4, r0]
  27409. /**
  27410. * If an incoming DHCP message is in response to us, then trigger the state machine
  27411. */
  27412. static void
  27413. dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  27414. 802a774: ebc1 0c06 rsb ip, r1, r6
  27415. 802a778: b29b uxth r3, r3
  27416. 802a77a: fa5f fc8c uxtb.w ip, ip
  27417. if (decode_len > 0) {
  27418. u32_t value = 0;
  27419. u16_t copy_len;
  27420. decode_next:
  27421. LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
  27422. if (!dhcp_option_given(dhcp, decode_idx)) {
  27423. 802a77e: 2a00 cmp r2, #0
  27424. 802a780: d133 bne.n 802a7ea <dhcp_recv+0x236>
  27425. copy_len = LWIP_MIN(decode_len, 4);
  27426. pbuf_copy_partial(q, &value, copy_len, val_offset);
  27427. 802a782: f1bc 0f03 cmp.w ip, #3
  27428. 802a786: bf94 ite ls
  27429. 802a788: 4662 movls r2, ip
  27430. 802a78a: 2204 movhi r2, #4
  27431. 802a78c: 4638 mov r0, r7
  27432. 802a78e: 9904 ldr r1, [sp, #16]
  27433. 802a790: f8cd c000 str.w ip, [sp]
  27434. 802a794: f000 feaa bl 802b4ec <pbuf_copy_partial>
  27435. if (decode_len > 4) {
  27436. 802a798: f8dd c000 ldr.w ip, [sp]
  27437. 802a79c: f1bc 0f04 cmp.w ip, #4
  27438. 802a7a0: d90f bls.n 802a7c2 <dhcp_recv+0x20e>
  27439. /* decode more than one u32_t */
  27440. LWIP_ERROR("decode_len % 4 == 0", decode_len % 4 == 0, return ERR_VAL;);
  27441. 802a7a2: f01c 0f03 tst.w ip, #3
  27442. 802a7a6: f040 80ca bne.w 802a93e <dhcp_recv+0x38a>
  27443. dhcp_got_option(dhcp, decode_idx);
  27444. 802a7aa: 9907 ldr r1, [sp, #28]
  27445. dhcp_set_option_value(dhcp, decode_idx, htonl(value));
  27446. 802a7ac: 9809 ldr r0, [sp, #36] ; 0x24
  27447. copy_len = LWIP_MIN(decode_len, 4);
  27448. pbuf_copy_partial(q, &value, copy_len, val_offset);
  27449. if (decode_len > 4) {
  27450. /* decode more than one u32_t */
  27451. LWIP_ERROR("decode_len % 4 == 0", decode_len % 4 == 0, return ERR_VAL;);
  27452. dhcp_got_option(dhcp, decode_idx);
  27453. 802a7ae: 2201 movs r2, #1
  27454. 802a7b0: 700a strb r2, [r1, #0]
  27455. dhcp_set_option_value(dhcp, decode_idx, htonl(value));
  27456. 802a7b2: f7ff fc19 bl 8029fe8 <lwip_htonl>
  27457. 802a7b6: 9b02 ldr r3, [sp, #8]
  27458. 802a7b8: 9906 ldr r1, [sp, #24]
  27459. decode_len -= 4;
  27460. val_offset += 4;
  27461. decode_idx++;
  27462. 802a7ba: 3401 adds r4, #1
  27463. pbuf_copy_partial(q, &value, copy_len, val_offset);
  27464. if (decode_len > 4) {
  27465. /* decode more than one u32_t */
  27466. LWIP_ERROR("decode_len % 4 == 0", decode_len % 4 == 0, return ERR_VAL;);
  27467. dhcp_got_option(dhcp, decode_idx);
  27468. dhcp_set_option_value(dhcp, decode_idx, htonl(value));
  27469. 802a7bc: 50c8 str r0, [r1, r3]
  27470. 802a7be: 3304 adds r3, #4
  27471. 802a7c0: e7cf b.n 802a762 <dhcp_recv+0x1ae>
  27472. decode_len -= 4;
  27473. val_offset += 4;
  27474. decode_idx++;
  27475. goto decode_next;
  27476. } else if (decode_len == 4) {
  27477. 802a7c2: d104 bne.n 802a7ce <dhcp_recv+0x21a>
  27478. value = ntohl(value);
  27479. 802a7c4: 9809 ldr r0, [sp, #36] ; 0x24
  27480. 802a7c6: f7ff fc11 bl 8029fec <lwip_ntohl>
  27481. 802a7ca: 9009 str r0, [sp, #36] ; 0x24
  27482. 802a7cc: e006 b.n 802a7dc <dhcp_recv+0x228>
  27483. } else {
  27484. LWIP_ERROR("invalid decode_len", decode_len == 1, return ERR_VAL;);
  27485. 802a7ce: f1bc 0f01 cmp.w ip, #1
  27486. 802a7d2: f040 80b4 bne.w 802a93e <dhcp_recv+0x38a>
  27487. value = ((u8_t*)&value)[0];
  27488. 802a7d6: f89d 3024 ldrb.w r3, [sp, #36] ; 0x24
  27489. 802a7da: 9309 str r3, [sp, #36] ; 0x24
  27490. }
  27491. dhcp_got_option(dhcp, decode_idx);
  27492. 802a7dc: 4a28 ldr r2, [pc, #160] ; (802a880 <dhcp_recv+0x2cc>)
  27493. dhcp_set_option_value(dhcp, decode_idx, value);
  27494. 802a7de: 4829 ldr r0, [pc, #164] ; (802a884 <dhcp_recv+0x2d0>)
  27495. value = ntohl(value);
  27496. } else {
  27497. LWIP_ERROR("invalid decode_len", decode_len == 1, return ERR_VAL;);
  27498. value = ((u8_t*)&value)[0];
  27499. }
  27500. dhcp_got_option(dhcp, decode_idx);
  27501. 802a7e0: 2301 movs r3, #1
  27502. 802a7e2: 5513 strb r3, [r2, r4]
  27503. dhcp_set_option_value(dhcp, decode_idx, value);
  27504. 802a7e4: 9b09 ldr r3, [sp, #36] ; 0x24
  27505. 802a7e6: f840 3024 str.w r3, [r0, r4, lsl #2]
  27506. }
  27507. }
  27508. if (offset >= q->len) {
  27509. 802a7ea: 897b ldrh r3, [r7, #10]
  27510. 802a7ec: 9901 ldr r1, [sp, #4]
  27511. 802a7ee: 4299 cmp r1, r3
  27512. 802a7f0: d30f bcc.n 802a812 <dhcp_recv+0x25e>
  27513. offset -= q->len;
  27514. 802a7f2: 1aca subs r2, r1, r3
  27515. offset_max -= q->len;
  27516. 802a7f4: ebc3 0909 rsb r9, r3, r9
  27517. dhcp_got_option(dhcp, decode_idx);
  27518. dhcp_set_option_value(dhcp, decode_idx, value);
  27519. }
  27520. }
  27521. if (offset >= q->len) {
  27522. offset -= q->len;
  27523. 802a7f8: b292 uxth r2, r2
  27524. offset_max -= q->len;
  27525. 802a7fa: fa1f f989 uxth.w r9, r9
  27526. if ((offset < offset_max) && offset_max) {
  27527. 802a7fe: 454a cmp r2, r9
  27528. dhcp_got_option(dhcp, decode_idx);
  27529. dhcp_set_option_value(dhcp, decode_idx, value);
  27530. }
  27531. }
  27532. if (offset >= q->len) {
  27533. offset -= q->len;
  27534. 802a800: 9201 str r2, [sp, #4]
  27535. offset_max -= q->len;
  27536. if ((offset < offset_max) && offset_max) {
  27537. 802a802: d303 bcc.n 802a80c <dhcp_recv+0x258>
  27538. break;
  27539. }
  27540. }
  27541. }
  27542. /* is this an overloaded message? */
  27543. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
  27544. 802a804: 4a1e ldr r2, [pc, #120] ; (802a880 <dhcp_recv+0x2cc>)
  27545. 802a806: 7813 ldrb r3, [r2, #0]
  27546. 802a808: b963 cbnz r3, 802a824 <dhcp_recv+0x270>
  27547. 802a80a: e09f b.n 802a94c <dhcp_recv+0x398>
  27548. }
  27549. if (offset >= q->len) {
  27550. offset -= q->len;
  27551. offset_max -= q->len;
  27552. if ((offset < offset_max) && offset_max) {
  27553. q = q->next;
  27554. 802a80c: 683f ldr r7, [r7, #0]
  27555. LWIP_ASSERT("next pbuf was null", q);
  27556. options = (u8_t*)q->payload;
  27557. 802a80e: 687b ldr r3, [r7, #4]
  27558. 802a810: 9303 str r3, [sp, #12]
  27559. u32_t value = 0;
  27560. u16_t copy_len;
  27561. decode_next:
  27562. LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
  27563. if (!dhcp_option_given(dhcp, decode_idx)) {
  27564. copy_len = LWIP_MIN(decode_len, 4);
  27565. 802a812: 9a01 ldr r2, [sp, #4]
  27566. }
  27567. offset = options_idx;
  27568. offset_max = options_idx_max;
  27569. options = (u8_t*)q->payload;
  27570. /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */
  27571. while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
  27572. 802a814: 9803 ldr r0, [sp, #12]
  27573. 802a816: 5c81 ldrb r1, [r0, r2]
  27574. 802a818: 29ff cmp r1, #255 ; 0xff
  27575. 802a81a: d0f3 beq.n 802a804 <dhcp_recv+0x250>
  27576. 802a81c: 454a cmp r2, r9
  27577. 802a81e: f4ff af1d bcc.w 802a65c <dhcp_recv+0xa8>
  27578. 802a822: e7ef b.n 802a804 <dhcp_recv+0x250>
  27579. }
  27580. }
  27581. }
  27582. /* is this an overloaded message? */
  27583. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
  27584. u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  27585. 802a824: 4b17 ldr r3, [pc, #92] ; (802a884 <dhcp_recv+0x2d0>)
  27586. dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  27587. 802a826: 4916 ldr r1, [pc, #88] ; (802a880 <dhcp_recv+0x2cc>)
  27588. }
  27589. }
  27590. }
  27591. /* is this an overloaded message? */
  27592. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
  27593. u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  27594. 802a828: 681b ldr r3, [r3, #0]
  27595. dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  27596. 802a82a: 2200 movs r2, #0
  27597. if (overload == DHCP_OVERLOAD_FILE) {
  27598. 802a82c: 2b01 cmp r3, #1
  27599. }
  27600. }
  27601. /* is this an overloaded message? */
  27602. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
  27603. u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  27604. dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD);
  27605. 802a82e: 700a strb r2, [r1, #0]
  27606. if (overload == DHCP_OVERLOAD_FILE) {
  27607. 802a830: f000 8093 beq.w 802a95a <dhcp_recv+0x3a6>
  27608. parse_file_as_options = 1;
  27609. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded file field\n"));
  27610. } else if (overload == DHCP_OVERLOAD_SNAME) {
  27611. 802a834: 2b02 cmp r3, #2
  27612. 802a836: f43f aefa beq.w 802a62e <dhcp_recv+0x7a>
  27613. parse_sname_as_options = 1;
  27614. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname field\n"));
  27615. } else if (overload == DHCP_OVERLOAD_SNAME_FILE) {
  27616. 802a83a: 2b03 cmp r3, #3
  27617. 802a83c: f040 8086 bne.w 802a94c <dhcp_recv+0x398>
  27618. 802a840: e089 b.n 802a956 <dhcp_recv+0x3a2>
  27619. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP_OPTION_MESSAGE_TYPE option not found\n"));
  27620. goto free_pbuf_and_return;
  27621. }
  27622. /* read DHCP message type */
  27623. msg_type = (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE);
  27624. 802a842: 4a10 ldr r2, [pc, #64] ; (802a884 <dhcp_recv+0x2d0>)
  27625. 802a844: 7911 ldrb r1, [r2, #4]
  27626. /* message type is DHCP ACK? */
  27627. if (msg_type == DHCP_ACK) {
  27628. 802a846: 2905 cmp r1, #5
  27629. 802a848: d140 bne.n 802a8cc <dhcp_recv+0x318>
  27630. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_ACK received\n"));
  27631. /* in requesting state? */
  27632. if (dhcp->state == DHCP_REQUESTING) {
  27633. 802a84a: f898 100c ldrb.w r1, [r8, #12]
  27634. 802a84e: 2901 cmp r1, #1
  27635. 802a850: d135 bne.n 802a8be <dhcp_recv+0x30a>
  27636. * @param netif the netif under DHCP control
  27637. */
  27638. static void
  27639. dhcp_handle_ack(struct netif *netif)
  27640. {
  27641. struct dhcp *dhcp = netif->dhcp;
  27642. 802a852: 6a2c ldr r4, [r5, #32]
  27643. #if LWIP_DHCP_BOOTP_FILE
  27644. ip_addr_set_zero(&dhcp->offered_si_addr);
  27645. #endif /* LWIP_DHCP_BOOTP_FILE */
  27646. /* lease time given? */
  27647. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) {
  27648. 802a854: 78db ldrb r3, [r3, #3]
  27649. #if LWIP_DNS
  27650. u8_t n;
  27651. #endif /* LWIP_DNS */
  27652. /* clear options we might not get from the ACK */
  27653. ip_addr_set_zero(&dhcp->offered_sn_mask);
  27654. 802a856: f8c4 b028 str.w fp, [r4, #40] ; 0x28
  27655. ip_addr_set_zero(&dhcp->offered_gw_addr);
  27656. 802a85a: f8c4 b02c str.w fp, [r4, #44] ; 0x2c
  27657. #if LWIP_DHCP_BOOTP_FILE
  27658. ip_addr_set_zero(&dhcp->offered_si_addr);
  27659. #endif /* LWIP_DHCP_BOOTP_FILE */
  27660. /* lease time given? */
  27661. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) {
  27662. 802a85e: b10b cbz r3, 802a864 <dhcp_recv+0x2b0>
  27663. /* remember offered lease time */
  27664. dhcp->offered_t0_lease = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_LEASE_TIME);
  27665. 802a860: 68d3 ldr r3, [r2, #12]
  27666. 802a862: 6323 str r3, [r4, #48] ; 0x30
  27667. }
  27668. /* renewal period given? */
  27669. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T1)) {
  27670. 802a864: 4b06 ldr r3, [pc, #24] ; (802a880 <dhcp_recv+0x2cc>)
  27671. 802a866: 791a ldrb r2, [r3, #4]
  27672. 802a868: b112 cbz r2, 802a870 <dhcp_recv+0x2bc>
  27673. /* remember given renewal period */
  27674. dhcp->offered_t1_renew = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T1);
  27675. 802a86a: 4a06 ldr r2, [pc, #24] ; (802a884 <dhcp_recv+0x2d0>)
  27676. 802a86c: 6912 ldr r2, [r2, #16]
  27677. 802a86e: e001 b.n 802a874 <dhcp_recv+0x2c0>
  27678. } else {
  27679. /* calculate safe periods for renewal */
  27680. dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2;
  27681. 802a870: 6b22 ldr r2, [r4, #48] ; 0x30
  27682. 802a872: 0852 lsrs r2, r2, #1
  27683. }
  27684. /* renewal period given? */
  27685. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T2)) {
  27686. 802a874: 795b ldrb r3, [r3, #5]
  27687. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T1)) {
  27688. /* remember given renewal period */
  27689. dhcp->offered_t1_renew = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T1);
  27690. } else {
  27691. /* calculate safe periods for renewal */
  27692. dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2;
  27693. 802a876: 6362 str r2, [r4, #52] ; 0x34
  27694. }
  27695. /* renewal period given? */
  27696. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T2)) {
  27697. 802a878: b133 cbz r3, 802a888 <dhcp_recv+0x2d4>
  27698. /* remember given rebind period */
  27699. dhcp->offered_t2_rebind = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T2);
  27700. 802a87a: 4b02 ldr r3, [pc, #8] ; (802a884 <dhcp_recv+0x2d0>)
  27701. 802a87c: 695b ldr r3, [r3, #20]
  27702. 802a87e: e004 b.n 802a88a <dhcp_recv+0x2d6>
  27703. 802a880: 2000f924 .word 0x2000f924
  27704. 802a884: 2000f930 .word 0x2000f930
  27705. } else {
  27706. /* calculate safe periods for rebinding */
  27707. dhcp->offered_t2_rebind = dhcp->offered_t0_lease;
  27708. 802a888: 6b23 ldr r3, [r4, #48] ; 0x30
  27709. 802a88a: 63a3 str r3, [r4, #56] ; 0x38
  27710. }
  27711. /* (y)our internet address */
  27712. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  27713. 802a88c: 68a3 ldr r3, [r4, #8]
  27714. boot file name copied in dhcp_parse_reply if not overloaded */
  27715. ip_addr_copy(dhcp->offered_si_addr, dhcp->msg_in->siaddr);
  27716. #endif /* LWIP_DHCP_BOOTP_FILE */
  27717. /* subnet mask given? */
  27718. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {
  27719. 802a88e: 4a39 ldr r2, [pc, #228] ; (802a974 <dhcp_recv+0x3c0>)
  27720. /* calculate safe periods for rebinding */
  27721. dhcp->offered_t2_rebind = dhcp->offered_t0_lease;
  27722. }
  27723. /* (y)our internet address */
  27724. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  27725. 802a890: 691b ldr r3, [r3, #16]
  27726. 802a892: 6263 str r3, [r4, #36] ; 0x24
  27727. boot file name copied in dhcp_parse_reply if not overloaded */
  27728. ip_addr_copy(dhcp->offered_si_addr, dhcp->msg_in->siaddr);
  27729. #endif /* LWIP_DHCP_BOOTP_FILE */
  27730. /* subnet mask given? */
  27731. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {
  27732. 802a894: 7993 ldrb r3, [r2, #6]
  27733. 802a896: 4616 mov r6, r2
  27734. 802a898: b12b cbz r3, 802a8a6 <dhcp_recv+0x2f2>
  27735. /* remember given subnet mask */
  27736. ip4_addr_set_u32(&dhcp->offered_sn_mask, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)));
  27737. 802a89a: 4b37 ldr r3, [pc, #220] ; (802a978 <dhcp_recv+0x3c4>)
  27738. 802a89c: 6998 ldr r0, [r3, #24]
  27739. 802a89e: f7ff fba3 bl 8029fe8 <lwip_htonl>
  27740. dhcp->subnet_mask_given = 1;
  27741. 802a8a2: 2301 movs r3, #1
  27742. #endif /* LWIP_DHCP_BOOTP_FILE */
  27743. /* subnet mask given? */
  27744. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {
  27745. /* remember given subnet mask */
  27746. ip4_addr_set_u32(&dhcp->offered_sn_mask, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)));
  27747. 802a8a4: 62a0 str r0, [r4, #40] ; 0x28
  27748. dhcp->subnet_mask_given = 1;
  27749. } else {
  27750. dhcp->subnet_mask_given = 0;
  27751. 802a8a6: 73a3 strb r3, [r4, #14]
  27752. }
  27753. /* gateway router */
  27754. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_ROUTER)) {
  27755. 802a8a8: 79f3 ldrb r3, [r6, #7]
  27756. 802a8aa: b123 cbz r3, 802a8b6 <dhcp_recv+0x302>
  27757. ip4_addr_set_u32(&dhcp->offered_gw_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_ROUTER)));
  27758. 802a8ac: 4b32 ldr r3, [pc, #200] ; (802a978 <dhcp_recv+0x3c4>)
  27759. 802a8ae: 69d8 ldr r0, [r3, #28]
  27760. 802a8b0: f7ff fb9a bl 8029fe8 <lwip_htonl>
  27761. 802a8b4: 62e0 str r0, [r4, #44] ; 0x2c
  27762. /* in requesting state? */
  27763. if (dhcp->state == DHCP_REQUESTING) {
  27764. dhcp_handle_ack(netif);
  27765. #if DHCP_DOES_ARP_CHECK
  27766. /* check if the acknowledged lease address is already in use */
  27767. dhcp_check(netif);
  27768. 802a8b6: 4628 mov r0, r5
  27769. 802a8b8: f7ff fe0a bl 802a4d0 <dhcp_check>
  27770. 802a8bc: e03f b.n 802a93e <dhcp_recv+0x38a>
  27771. /* bind interface to the acknowledged lease address */
  27772. dhcp_bind(netif);
  27773. #endif
  27774. }
  27775. /* already bound to the given lease address? */
  27776. else if ((dhcp->state == DHCP_REBOOTING) || (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING)) {
  27777. 802a8be: 3903 subs r1, #3
  27778. 802a8c0: 2902 cmp r1, #2
  27779. 802a8c2: d83c bhi.n 802a93e <dhcp_recv+0x38a>
  27780. dhcp_bind(netif);
  27781. 802a8c4: 4628 mov r0, r5
  27782. 802a8c6: f7ff fe16 bl 802a4f6 <dhcp_bind>
  27783. 802a8ca: e038 b.n 802a93e <dhcp_recv+0x38a>
  27784. }
  27785. }
  27786. /* received a DHCP_NAK in appropriate state? */
  27787. else if ((msg_type == DHCP_NAK) &&
  27788. 802a8cc: 2906 cmp r1, #6
  27789. 802a8ce: d121 bne.n 802a914 <dhcp_recv+0x360>
  27790. 802a8d0: f898 300c ldrb.w r3, [r8, #12]
  27791. 802a8d4: 2b05 cmp r3, #5
  27792. 802a8d6: d832 bhi.n 802a93e <dhcp_recv+0x38a>
  27793. 802a8d8: f998 300c ldrsb.w r3, [r8, #12]
  27794. 802a8dc: f04f 42b8 mov.w r2, #1543503872 ; 0x5c000000
  27795. 802a8e0: 409a lsls r2, r3
  27796. 802a8e2: d52c bpl.n 802a93e <dhcp_recv+0x38a>
  27797. {
  27798. struct dhcp *dhcp = netif->dhcp;
  27799. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_nak(netif=%p) %c%c%"U16_F"\n",
  27800. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  27801. /* Set the interface down since the address must no longer be used, as per RFC2131 */
  27802. netif_set_down(netif);
  27803. 802a8e4: 4628 mov r0, r5
  27804. * @param netif the netif under DHCP control
  27805. */
  27806. static void
  27807. dhcp_handle_nak(struct netif *netif)
  27808. {
  27809. struct dhcp *dhcp = netif->dhcp;
  27810. 802a8e6: 6a2c ldr r4, [r5, #32]
  27811. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_nak(netif=%p) %c%c%"U16_F"\n",
  27812. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  27813. /* Set the interface down since the address must no longer be used, as per RFC2131 */
  27814. netif_set_down(netif);
  27815. 802a8e8: f000 fc6e bl 802b1c8 <netif_set_down>
  27816. /* remove IP address from interface */
  27817. netif_set_ipaddr(netif, IP_ADDR_ANY);
  27818. 802a8ec: 4628 mov r0, r5
  27819. 802a8ee: 4923 ldr r1, [pc, #140] ; (802a97c <dhcp_recv+0x3c8>)
  27820. 802a8f0: f000 fbba bl 802b068 <netif_set_ipaddr>
  27821. netif_set_gw(netif, IP_ADDR_ANY);
  27822. 802a8f4: 4628 mov r0, r5
  27823. 802a8f6: 4921 ldr r1, [pc, #132] ; (802a97c <dhcp_recv+0x3c8>)
  27824. 802a8f8: f000 fbf2 bl 802b0e0 <netif_set_gw>
  27825. netif_set_netmask(netif, IP_ADDR_ANY);
  27826. 802a8fc: 4628 mov r0, r5
  27827. 802a8fe: 491f ldr r1, [pc, #124] ; (802a97c <dhcp_recv+0x3c8>)
  27828. 802a900: f000 fbf2 bl 802b0e8 <netif_set_netmask>
  27829. /* Change to a defined state */
  27830. dhcp_set_state(dhcp, DHCP_BACKING_OFF);
  27831. 802a904: 4620 mov r0, r4
  27832. 802a906: 210c movs r1, #12
  27833. 802a908: f7ff fb72 bl 8029ff0 <dhcp_set_state>
  27834. /* We can immediately restart discovery */
  27835. dhcp_discover(netif);
  27836. 802a90c: 4628 mov r0, r5
  27837. 802a90e: f7ff fc7f bl 802a210 <dhcp_discover>
  27838. 802a912: e014 b.n 802a93e <dhcp_recv+0x38a>
  27839. (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING ))) {
  27840. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_NAK received\n"));
  27841. dhcp_handle_nak(netif);
  27842. }
  27843. /* received a DHCP_OFFER in DHCP_SELECTING state? */
  27844. else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_SELECTING)) {
  27845. 802a914: 2902 cmp r1, #2
  27846. 802a916: d112 bne.n 802a93e <dhcp_recv+0x38a>
  27847. 802a918: f898 100c ldrb.w r1, [r8, #12]
  27848. 802a91c: 2906 cmp r1, #6
  27849. 802a91e: d10e bne.n 802a93e <dhcp_recv+0x38a>
  27850. {
  27851. struct dhcp *dhcp = netif->dhcp;
  27852. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n",
  27853. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  27854. /* obtain the server address */
  27855. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
  27856. 802a920: 789b ldrb r3, [r3, #2]
  27857. dhcp_handle_nak(netif);
  27858. }
  27859. /* received a DHCP_OFFER in DHCP_SELECTING state? */
  27860. else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_SELECTING)) {
  27861. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_OFFER received in DHCP_SELECTING state\n"));
  27862. dhcp->request_timeout = 0;
  27863. 802a922: f8a8 b01a strh.w fp, [r8, #26]
  27864. * @param netif the netif under DHCP control
  27865. */
  27866. static void
  27867. dhcp_handle_offer(struct netif *netif)
  27868. {
  27869. struct dhcp *dhcp = netif->dhcp;
  27870. 802a926: 6a2c ldr r4, [r5, #32]
  27871. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n",
  27872. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  27873. /* obtain the server address */
  27874. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
  27875. 802a928: b14b cbz r3, 802a93e <dhcp_recv+0x38a>
  27876. ip4_addr_set_u32(&dhcp->server_ip_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID)));
  27877. 802a92a: 6890 ldr r0, [r2, #8]
  27878. 802a92c: f7ff fb5c bl 8029fe8 <lwip_htonl>
  27879. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n",
  27880. ip4_addr_get_u32(&dhcp->server_ip_addr)));
  27881. /* remember offered address */
  27882. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  27883. 802a930: 68a3 ldr r3, [r4, #8]
  27884. struct dhcp *dhcp = netif->dhcp;
  27885. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n",
  27886. (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
  27887. /* obtain the server address */
  27888. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
  27889. ip4_addr_set_u32(&dhcp->server_ip_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID)));
  27890. 802a932: 6220 str r0, [r4, #32]
  27891. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n",
  27892. ip4_addr_get_u32(&dhcp->server_ip_addr)));
  27893. /* remember offered address */
  27894. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  27895. 802a934: 691b ldr r3, [r3, #16]
  27896. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): offer for 0x%08"X32_F"\n",
  27897. ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  27898. dhcp_select(netif);
  27899. 802a936: 4628 mov r0, r5
  27900. if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
  27901. ip4_addr_set_u32(&dhcp->server_ip_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID)));
  27902. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n",
  27903. ip4_addr_get_u32(&dhcp->server_ip_addr)));
  27904. /* remember offered address */
  27905. ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
  27906. 802a938: 6263 str r3, [r4, #36] ; 0x24
  27907. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): offer for 0x%08"X32_F"\n",
  27908. ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  27909. dhcp_select(netif);
  27910. 802a93a: f7ff fd57 bl 802a3ec <dhcp_select>
  27911. dhcp->request_timeout = 0;
  27912. /* remember offered lease */
  27913. dhcp_handle_offer(netif);
  27914. }
  27915. free_pbuf_and_return:
  27916. dhcp->msg_in = NULL;
  27917. 802a93e: 2300 movs r3, #0
  27918. 802a940: f8c8 3008 str.w r3, [r8, #8]
  27919. pbuf_free(p);
  27920. 802a944: 4650 mov r0, sl
  27921. 802a946: f000 fc83 bl 802b250 <pbuf_free>
  27922. 802a94a: e010 b.n 802a96e <dhcp_recv+0x3ba>
  27923. /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */
  27924. parse_file_as_options = 0;
  27925. options_idx = DHCP_FILE_OFS;
  27926. options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
  27927. goto again;
  27928. } else if (parse_sname_as_options) {
  27929. 802a94c: f1bb 0f00 cmp.w fp, #0
  27930. 802a950: f47f ae6d bne.w 802a62e <dhcp_recv+0x7a>
  27931. 802a954: e005 b.n 802a962 <dhcp_recv+0x3ae>
  27932. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded file field\n"));
  27933. } else if (overload == DHCP_OVERLOAD_SNAME) {
  27934. parse_sname_as_options = 1;
  27935. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname field\n"));
  27936. } else if (overload == DHCP_OVERLOAD_SNAME_FILE) {
  27937. parse_sname_as_options = 1;
  27938. 802a956: f04f 0b01 mov.w fp, #1
  27939. }
  27940. if (parse_file_as_options) {
  27941. /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */
  27942. parse_file_as_options = 0;
  27943. options_idx = DHCP_FILE_OFS;
  27944. options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
  27945. 802a95a: f04f 09ec mov.w r9, #236 ; 0xec
  27946. #endif /* LWIP_DHCP_BOOTP_FILE */
  27947. }
  27948. if (parse_file_as_options) {
  27949. /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */
  27950. parse_file_as_options = 0;
  27951. options_idx = DHCP_FILE_OFS;
  27952. 802a95e: 226c movs r2, #108 ; 0x6c
  27953. 802a960: e66a b.n 802a638 <dhcp_recv+0x84>
  27954. goto free_pbuf_and_return;
  27955. }
  27956. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("searching DHCP_OPTION_MESSAGE_TYPE\n"));
  27957. /* obtain pointer to DHCP message type */
  27958. if (!dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE)) {
  27959. 802a962: 4b04 ldr r3, [pc, #16] ; (802a974 <dhcp_recv+0x3c0>)
  27960. 802a964: 785a ldrb r2, [r3, #1]
  27961. 802a966: 2a00 cmp r2, #0
  27962. 802a968: f47f af6b bne.w 802a842 <dhcp_recv+0x28e>
  27963. 802a96c: e7e7 b.n 802a93e <dhcp_recv+0x38a>
  27964. dhcp_handle_offer(netif);
  27965. }
  27966. free_pbuf_and_return:
  27967. dhcp->msg_in = NULL;
  27968. pbuf_free(p);
  27969. }
  27970. 802a96e: b00b add sp, #44 ; 0x2c
  27971. 802a970: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  27972. 802a974: 2000f924 .word 0x2000f924
  27973. 802a978: 2000f930 .word 0x2000f930
  27974. 802a97c: 0803abfc .word 0x0803abfc
  27975. 0802a980 <dhcp_arp_reply>:
  27976. *
  27977. * @param netif the network interface on which the reply was received
  27978. * @param addr The IP address we received a reply from
  27979. */
  27980. void dhcp_arp_reply(struct netif *netif, ip_addr_t *addr)
  27981. {
  27982. 802a980: b537 push {r0, r1, r2, r4, r5, lr}
  27983. LWIP_ERROR("netif != NULL", (netif != NULL), return;);
  27984. 802a982: 4605 mov r5, r0
  27985. 802a984: 2800 cmp r0, #0
  27986. 802a986: d037 beq.n 802a9f8 <dhcp_arp_reply+0x78>
  27987. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_arp_reply()\n"));
  27988. /* is a DHCP client doing an ARP check? */
  27989. if ((netif->dhcp != NULL) && (netif->dhcp->state == DHCP_CHECKING)) {
  27990. 802a988: 6a04 ldr r4, [r0, #32]
  27991. 802a98a: 2c00 cmp r4, #0
  27992. 802a98c: d034 beq.n 802a9f8 <dhcp_arp_reply+0x78>
  27993. 802a98e: 7b23 ldrb r3, [r4, #12]
  27994. 802a990: 2b08 cmp r3, #8
  27995. 802a992: d131 bne.n 802a9f8 <dhcp_arp_reply+0x78>
  27996. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_arp_reply(): CHECKING, arp reply for 0x%08"X32_F"\n",
  27997. ip4_addr_get_u32(addr)));
  27998. /* did a host respond with the address we
  27999. were offered by the DHCP server? */
  28000. if (ip_addr_cmp(addr, &netif->dhcp->offered_ip_addr)) {
  28001. 802a994: 680a ldr r2, [r1, #0]
  28002. 802a996: 6a63 ldr r3, [r4, #36] ; 0x24
  28003. 802a998: 429a cmp r2, r3
  28004. 802a99a: d12d bne.n 802a9f8 <dhcp_arp_reply+0x78>
  28005. {
  28006. struct dhcp *dhcp = netif->dhcp;
  28007. err_t result = ERR_OK;
  28008. u16_t msecs;
  28009. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline()\n"));
  28010. dhcp_set_state(dhcp, DHCP_BACKING_OFF);
  28011. 802a99c: 4620 mov r0, r4
  28012. 802a99e: 210c movs r1, #12
  28013. 802a9a0: f7ff fb26 bl 8029ff0 <dhcp_set_state>
  28014. /* create and initialize the DHCP message header */
  28015. result = dhcp_create_msg(netif, dhcp, DHCP_DECLINE);
  28016. 802a9a4: 4628 mov r0, r5
  28017. 802a9a6: 4621 mov r1, r4
  28018. 802a9a8: 2204 movs r2, #4
  28019. 802a9aa: f7ff fb85 bl 802a0b8 <dhcp_create_msg>
  28020. if (result == ERR_OK) {
  28021. 802a9ae: b9f0 cbnz r0, 802a9ee <dhcp_arp_reply+0x6e>
  28022. dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
  28023. 802a9b0: 2204 movs r2, #4
  28024. 802a9b2: 2132 movs r1, #50 ; 0x32
  28025. 802a9b4: 4620 mov r0, r4
  28026. 802a9b6: f7ff fb23 bl 802a000 <dhcp_option>
  28027. dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
  28028. 802a9ba: 6a60 ldr r0, [r4, #36] ; 0x24
  28029. 802a9bc: f7ff fb16 bl 8029fec <lwip_ntohl>
  28030. 802a9c0: 4601 mov r1, r0
  28031. 802a9c2: 4620 mov r0, r4
  28032. 802a9c4: f7ff fb43 bl 802a04e <dhcp_option_long>
  28033. dhcp_option_trailer(dhcp);
  28034. 802a9c8: 4620 mov r0, r4
  28035. 802a9ca: f7ff fb60 bl 802a08e <dhcp_option_trailer>
  28036. /* resize pbuf to reflect true size of options */
  28037. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  28038. 802a9ce: 8b21 ldrh r1, [r4, #24]
  28039. 802a9d0: 6920 ldr r0, [r4, #16]
  28040. 802a9d2: 31f0 adds r1, #240 ; 0xf0
  28041. 802a9d4: b289 uxth r1, r1
  28042. 802a9d6: f000 fc62 bl 802b29e <pbuf_realloc>
  28043. /* per section 4.4.4, broadcast DECLINE messages */
  28044. udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
  28045. 802a9da: 9500 str r5, [sp, #0]
  28046. 802a9dc: 6860 ldr r0, [r4, #4]
  28047. 802a9de: 6921 ldr r1, [r4, #16]
  28048. 802a9e0: 4a06 ldr r2, [pc, #24] ; (802a9fc <dhcp_arp_reply+0x7c>)
  28049. 802a9e2: 2343 movs r3, #67 ; 0x43
  28050. 802a9e4: f003 f8d4 bl 802db90 <udp_sendto_if>
  28051. dhcp_delete_msg(dhcp);
  28052. 802a9e8: 4620 mov r0, r4
  28053. 802a9ea: f7ff fc05 bl 802a1f8 <dhcp_delete_msg>
  28054. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_decline: BACKING OFF\n"));
  28055. } else {
  28056. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  28057. ("dhcp_decline: could not allocate DHCP request\n"));
  28058. }
  28059. dhcp->tries++;
  28060. 802a9ee: 7b63 ldrb r3, [r4, #13]
  28061. 802a9f0: 3301 adds r3, #1
  28062. 802a9f2: 7363 strb r3, [r4, #13]
  28063. msecs = 10*1000;
  28064. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  28065. 802a9f4: 2314 movs r3, #20
  28066. 802a9f6: 8363 strh r3, [r4, #26]
  28067. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,
  28068. ("dhcp_arp_reply(): arp reply matched with offered address, declining\n"));
  28069. dhcp_decline(netif);
  28070. }
  28071. }
  28072. }
  28073. 802a9f8: bd3e pop {r1, r2, r3, r4, r5, pc}
  28074. 802a9fa: bf00 nop
  28075. 802a9fc: 0803abf8 .word 0x0803abf8
  28076. 0802aa00 <dhcp_renew>:
  28077. *
  28078. * @param netif network interface which must renew its lease
  28079. */
  28080. err_t
  28081. dhcp_renew(struct netif *netif)
  28082. {
  28083. 802aa00: b573 push {r0, r1, r4, r5, r6, lr}
  28084. struct dhcp *dhcp = netif->dhcp;
  28085. 802aa02: 6a04 ldr r4, [r0, #32]
  28086. *
  28087. * @param netif network interface which must renew its lease
  28088. */
  28089. err_t
  28090. dhcp_renew(struct netif *netif)
  28091. {
  28092. 802aa04: 4605 mov r5, r0
  28093. struct dhcp *dhcp = netif->dhcp;
  28094. err_t result;
  28095. u16_t msecs;
  28096. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_renew()\n"));
  28097. dhcp_set_state(dhcp, DHCP_RENEWING);
  28098. 802aa06: 2105 movs r1, #5
  28099. 802aa08: 4620 mov r0, r4
  28100. 802aa0a: f7ff faf1 bl 8029ff0 <dhcp_set_state>
  28101. /* create and initialize the DHCP message header */
  28102. result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
  28103. 802aa0e: 4628 mov r0, r5
  28104. 802aa10: 4621 mov r1, r4
  28105. 802aa12: 2203 movs r2, #3
  28106. 802aa14: f7ff fb50 bl 802a0b8 <dhcp_create_msg>
  28107. if (result == ERR_OK) {
  28108. 802aa18: 4606 mov r6, r0
  28109. 802aa1a: b9e0 cbnz r0, 802aa56 <dhcp_renew+0x56>
  28110. dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
  28111. 802aa1c: 2202 movs r2, #2
  28112. 802aa1e: 4620 mov r0, r4
  28113. 802aa20: 2139 movs r1, #57 ; 0x39
  28114. 802aa22: f7ff faed bl 802a000 <dhcp_option>
  28115. dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
  28116. 802aa26: 8ca9 ldrh r1, [r5, #36] ; 0x24
  28117. 802aa28: 4620 mov r0, r4
  28118. 802aa2a: f7ff fb00 bl 802a02e <dhcp_option_short>
  28119. #if LWIP_NETIF_HOSTNAME
  28120. dhcp_option_hostname(dhcp, netif);
  28121. #endif /* LWIP_NETIF_HOSTNAME */
  28122. /* append DHCP message trailer */
  28123. dhcp_option_trailer(dhcp);
  28124. 802aa2e: 4620 mov r0, r4
  28125. 802aa30: f7ff fb2d bl 802a08e <dhcp_option_trailer>
  28126. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  28127. 802aa34: 8b21 ldrh r1, [r4, #24]
  28128. 802aa36: 6920 ldr r0, [r4, #16]
  28129. 802aa38: 31f0 adds r1, #240 ; 0xf0
  28130. 802aa3a: b289 uxth r1, r1
  28131. 802aa3c: f000 fc2f bl 802b29e <pbuf_realloc>
  28132. udp_sendto_if(dhcp->pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif);
  28133. 802aa40: 9500 str r5, [sp, #0]
  28134. 802aa42: 6860 ldr r0, [r4, #4]
  28135. 802aa44: 6921 ldr r1, [r4, #16]
  28136. 802aa46: f104 0220 add.w r2, r4, #32
  28137. 802aa4a: 2343 movs r3, #67 ; 0x43
  28138. 802aa4c: f003 f8a0 bl 802db90 <udp_sendto_if>
  28139. dhcp_delete_msg(dhcp);
  28140. 802aa50: 4620 mov r0, r4
  28141. 802aa52: f7ff fbd1 bl 802a1f8 <dhcp_delete_msg>
  28142. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew: RENEWING\n"));
  28143. } else {
  28144. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_renew: could not allocate DHCP request\n"));
  28145. }
  28146. dhcp->tries++;
  28147. 802aa56: 7b63 ldrb r3, [r4, #13]
  28148. 802aa58: 3301 adds r3, #1
  28149. 802aa5a: b2db uxtb r3, r3
  28150. /* back-off on retries, but to a maximum of 20 seconds */
  28151. msecs = dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000;
  28152. 802aa5c: 2b09 cmp r3, #9
  28153. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew: RENEWING\n"));
  28154. } else {
  28155. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_renew: could not allocate DHCP request\n"));
  28156. }
  28157. dhcp->tries++;
  28158. 802aa5e: 7363 strb r3, [r4, #13]
  28159. /* back-off on retries, but to a maximum of 20 seconds */
  28160. msecs = dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000;
  28161. 802aa60: d804 bhi.n 802aa6c <dhcp_renew+0x6c>
  28162. 802aa62: f44f 62fa mov.w r2, #2000 ; 0x7d0
  28163. 802aa66: 4353 muls r3, r2
  28164. 802aa68: b29b uxth r3, r3
  28165. 802aa6a: e001 b.n 802aa70 <dhcp_renew+0x70>
  28166. 802aa6c: f644 6320 movw r3, #20000 ; 0x4e20
  28167. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  28168. 802aa70: f44f 72fa mov.w r2, #500 ; 0x1f4
  28169. 802aa74: f203 13f3 addw r3, r3, #499 ; 0x1f3
  28170. 802aa78: fb93 f3f2 sdiv r3, r3, r2
  28171. 802aa7c: 8363 strh r3, [r4, #26]
  28172. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew(): set request timeout %"U16_F" msecs\n", msecs));
  28173. return result;
  28174. }
  28175. 802aa7e: 4630 mov r0, r6
  28176. 802aa80: bd7c pop {r2, r3, r4, r5, r6, pc}
  28177. 802aa82: 0000 movs r0, r0
  28178. 0802aa84 <dhcp_coarse_tmr>:
  28179. /**
  28180. * The DHCP timer that checks for lease renewal/rebind timeouts.
  28181. */
  28182. void
  28183. dhcp_coarse_tmr()
  28184. {
  28185. 802aa84: b538 push {r3, r4, r5, lr}
  28186. struct netif *netif = netif_list;
  28187. 802aa86: 4b15 ldr r3, [pc, #84] ; (802aadc <dhcp_coarse_tmr+0x58>)
  28188. 802aa88: 4d15 ldr r5, [pc, #84] ; (802aae0 <dhcp_coarse_tmr+0x5c>)
  28189. 802aa8a: 681c ldr r4, [r3, #0]
  28190. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_coarse_tmr()\n"));
  28191. /* iterate through all network interfaces */
  28192. while (netif != NULL) {
  28193. 802aa8c: e023 b.n 802aad6 <dhcp_coarse_tmr+0x52>
  28194. /* only act on DHCP configured interfaces */
  28195. if (netif->dhcp != NULL) {
  28196. 802aa8e: 6a23 ldr r3, [r4, #32]
  28197. 802aa90: b303 cbz r3, 802aad4 <dhcp_coarse_tmr+0x50>
  28198. /* timer is active (non zero), and triggers (zeroes) now? */
  28199. if (netif->dhcp->t2_timeout-- == 1) {
  28200. 802aa92: 8bda ldrh r2, [r3, #30]
  28201. 802aa94: 1e51 subs r1, r2, #1
  28202. 802aa96: 2a01 cmp r2, #1
  28203. 802aa98: 83d9 strh r1, [r3, #30]
  28204. 802aa9a: d10b bne.n 802aab4 <dhcp_coarse_tmr+0x30>
  28205. 802aa9c: 7b1a ldrb r2, [r3, #12]
  28206. 802aa9e: 2a0a cmp r2, #10
  28207. 802aaa0: d818 bhi.n 802aad4 <dhcp_coarse_tmr+0x50>
  28208. 802aaa2: f993 300c ldrsb.w r3, [r3, #12]
  28209. 802aaa6: fa15 f303 lsls.w r3, r5, r3
  28210. 802aaaa: d513 bpl.n 802aad4 <dhcp_coarse_tmr+0x50>
  28211. /* just retry to rebind */
  28212. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
  28213. ("dhcp_t2_timeout(): must rebind\n"));
  28214. /* This slightly different to RFC2131: DHCPREQUEST will be sent from state
  28215. DHCP_REBINDING, not DHCP_BOUND */
  28216. dhcp_rebind(netif);
  28217. 802aaac: 4620 mov r0, r4
  28218. 802aaae: f7ff fc0b bl 802a2c8 <dhcp_rebind>
  28219. 802aab2: e00f b.n 802aad4 <dhcp_coarse_tmr+0x50>
  28220. if (netif->dhcp->t2_timeout-- == 1) {
  28221. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t2 timeout\n"));
  28222. /* this clients' rebind timeout triggered */
  28223. dhcp_t2_timeout(netif);
  28224. /* timer is active (non zero), and triggers (zeroes) now */
  28225. } else if (netif->dhcp->t1_timeout-- == 1) {
  28226. 802aab4: 8b9a ldrh r2, [r3, #28]
  28227. 802aab6: 1e51 subs r1, r2, #1
  28228. 802aab8: 2a01 cmp r2, #1
  28229. 802aaba: 8399 strh r1, [r3, #28]
  28230. 802aabc: d10a bne.n 802aad4 <dhcp_coarse_tmr+0x50>
  28231. 802aabe: 7b1a ldrb r2, [r3, #12]
  28232. 802aac0: 2a0a cmp r2, #10
  28233. 802aac2: d807 bhi.n 802aad4 <dhcp_coarse_tmr+0x50>
  28234. 802aac4: f993 300c ldrsb.w r3, [r3, #12]
  28235. 802aac8: fa15 f303 lsls.w r3, r5, r3
  28236. 802aacc: d502 bpl.n 802aad4 <dhcp_coarse_tmr+0x50>
  28237. * eventually time-out if renew tries fail. */
  28238. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
  28239. ("dhcp_t1_timeout(): must renew\n"));
  28240. /* This slightly different to RFC2131: DHCPREQUEST will be sent from state
  28241. DHCP_RENEWING, not DHCP_BOUND */
  28242. dhcp_renew(netif);
  28243. 802aace: 4620 mov r0, r4
  28244. 802aad0: f7ff ff96 bl 802aa00 <dhcp_renew>
  28245. /* this clients' renewal timeout triggered */
  28246. dhcp_t1_timeout(netif);
  28247. }
  28248. }
  28249. /* proceed to next netif */
  28250. netif = netif->next;
  28251. 802aad4: 6824 ldr r4, [r4, #0]
  28252. dhcp_coarse_tmr()
  28253. {
  28254. struct netif *netif = netif_list;
  28255. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_coarse_tmr()\n"));
  28256. /* iterate through all network interfaces */
  28257. while (netif != NULL) {
  28258. 802aad6: 2c00 cmp r4, #0
  28259. 802aad8: d1d9 bne.n 802aa8e <dhcp_coarse_tmr+0xa>
  28260. }
  28261. }
  28262. /* proceed to next netif */
  28263. netif = netif->next;
  28264. }
  28265. }
  28266. 802aada: bd38 pop {r3, r4, r5, pc}
  28267. 802aadc: 20010d6c .word 0x20010d6c
  28268. 802aae0: 44200000 .word 0x44200000
  28269. 0802aae4 <dhcp_release>:
  28270. *
  28271. * @param netif network interface which must release its lease
  28272. */
  28273. err_t
  28274. dhcp_release(struct netif *netif)
  28275. {
  28276. 802aae4: b573 push {r0, r1, r4, r5, r6, lr}
  28277. struct dhcp *dhcp = netif->dhcp;
  28278. 802aae6: 6a04 ldr r4, [r0, #32]
  28279. *
  28280. * @param netif network interface which must release its lease
  28281. */
  28282. err_t
  28283. dhcp_release(struct netif *netif)
  28284. {
  28285. 802aae8: 4605 mov r5, r0
  28286. err_t result;
  28287. u16_t msecs;
  28288. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_release()\n"));
  28289. /* idle DHCP client */
  28290. dhcp_set_state(dhcp, DHCP_OFF);
  28291. 802aaea: 2100 movs r1, #0
  28292. 802aaec: 4620 mov r0, r4
  28293. 802aaee: f7ff fa7f bl 8029ff0 <dhcp_set_state>
  28294. /* clean old DHCP offer */
  28295. ip_addr_set_zero(&dhcp->server_ip_addr);
  28296. 802aaf2: 2300 movs r3, #0
  28297. 802aaf4: 6223 str r3, [r4, #32]
  28298. ip_addr_set_zero(&dhcp->offered_ip_addr);
  28299. 802aaf6: 6263 str r3, [r4, #36] ; 0x24
  28300. ip_addr_set_zero(&dhcp->offered_sn_mask);
  28301. 802aaf8: 62a3 str r3, [r4, #40] ; 0x28
  28302. ip_addr_set_zero(&dhcp->offered_gw_addr);
  28303. 802aafa: 62e3 str r3, [r4, #44] ; 0x2c
  28304. #if LWIP_DHCP_BOOTP_FILE
  28305. ip_addr_set_zero(&dhcp->offered_si_addr);
  28306. #endif /* LWIP_DHCP_BOOTP_FILE */
  28307. dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0;
  28308. 802aafc: 63a3 str r3, [r4, #56] ; 0x38
  28309. 802aafe: 6363 str r3, [r4, #52] ; 0x34
  28310. 802ab00: 6323 str r3, [r4, #48] ; 0x30
  28311. /* create and initialize the DHCP message header */
  28312. result = dhcp_create_msg(netif, dhcp, DHCP_RELEASE);
  28313. 802ab02: 4628 mov r0, r5
  28314. 802ab04: 4621 mov r1, r4
  28315. 802ab06: 2207 movs r2, #7
  28316. 802ab08: f7ff fad6 bl 802a0b8 <dhcp_create_msg>
  28317. if (result == ERR_OK) {
  28318. 802ab0c: 4606 mov r6, r0
  28319. 802ab0e: b998 cbnz r0, 802ab38 <dhcp_release+0x54>
  28320. dhcp_option_trailer(dhcp);
  28321. 802ab10: 4620 mov r0, r4
  28322. 802ab12: f7ff fabc bl 802a08e <dhcp_option_trailer>
  28323. pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
  28324. 802ab16: 8b21 ldrh r1, [r4, #24]
  28325. 802ab18: 6920 ldr r0, [r4, #16]
  28326. 802ab1a: 31f0 adds r1, #240 ; 0xf0
  28327. 802ab1c: b289 uxth r1, r1
  28328. 802ab1e: f000 fbbe bl 802b29e <pbuf_realloc>
  28329. udp_sendto_if(dhcp->pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif);
  28330. 802ab22: 9500 str r5, [sp, #0]
  28331. 802ab24: 6860 ldr r0, [r4, #4]
  28332. 802ab26: 6921 ldr r1, [r4, #16]
  28333. 802ab28: f104 0220 add.w r2, r4, #32
  28334. 802ab2c: 2343 movs r3, #67 ; 0x43
  28335. 802ab2e: f003 f82f bl 802db90 <udp_sendto_if>
  28336. dhcp_delete_msg(dhcp);
  28337. 802ab32: 4620 mov r0, r4
  28338. 802ab34: f7ff fb60 bl 802a1f8 <dhcp_delete_msg>
  28339. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release: RELEASED, DHCP_OFF\n"));
  28340. } else {
  28341. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n"));
  28342. }
  28343. dhcp->tries++;
  28344. 802ab38: 7b63 ldrb r3, [r4, #13]
  28345. 802ab3a: 3301 adds r3, #1
  28346. 802ab3c: b2db uxtb r3, r3
  28347. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  28348. 802ab3e: 2b09 cmp r3, #9
  28349. dhcp_delete_msg(dhcp);
  28350. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release: RELEASED, DHCP_OFF\n"));
  28351. } else {
  28352. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n"));
  28353. }
  28354. dhcp->tries++;
  28355. 802ab40: 7363 strb r3, [r4, #13]
  28356. msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
  28357. 802ab42: d804 bhi.n 802ab4e <dhcp_release+0x6a>
  28358. 802ab44: f44f 727a mov.w r2, #1000 ; 0x3e8
  28359. 802ab48: 4353 muls r3, r2
  28360. 802ab4a: b29b uxth r3, r3
  28361. 802ab4c: e001 b.n 802ab52 <dhcp_release+0x6e>
  28362. 802ab4e: f242 7310 movw r3, #10000 ; 0x2710
  28363. dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
  28364. 802ab52: f44f 72fa mov.w r2, #500 ; 0x1f4
  28365. 802ab56: f203 13f3 addw r3, r3, #499 ; 0x1f3
  28366. 802ab5a: fb93 f3f2 sdiv r3, r3, r2
  28367. 802ab5e: 8363 strh r3, [r4, #26]
  28368. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release(): set request timeout %"U16_F" msecs\n", msecs));
  28369. /* bring the interface down */
  28370. netif_set_down(netif);
  28371. 802ab60: 4628 mov r0, r5
  28372. 802ab62: f000 fb31 bl 802b1c8 <netif_set_down>
  28373. /* remove IP address from interface */
  28374. netif_set_ipaddr(netif, IP_ADDR_ANY);
  28375. 802ab66: 4628 mov r0, r5
  28376. 802ab68: 4906 ldr r1, [pc, #24] ; (802ab84 <dhcp_release+0xa0>)
  28377. 802ab6a: f000 fa7d bl 802b068 <netif_set_ipaddr>
  28378. netif_set_gw(netif, IP_ADDR_ANY);
  28379. 802ab6e: 4628 mov r0, r5
  28380. 802ab70: 4904 ldr r1, [pc, #16] ; (802ab84 <dhcp_release+0xa0>)
  28381. 802ab72: f000 fab5 bl 802b0e0 <netif_set_gw>
  28382. netif_set_netmask(netif, IP_ADDR_ANY);
  28383. 802ab76: 4628 mov r0, r5
  28384. 802ab78: 4902 ldr r1, [pc, #8] ; (802ab84 <dhcp_release+0xa0>)
  28385. 802ab7a: f000 fab5 bl 802b0e8 <netif_set_netmask>
  28386. return result;
  28387. }
  28388. 802ab7e: 4630 mov r0, r6
  28389. 802ab80: bd7c pop {r2, r3, r4, r5, r6, pc}
  28390. 802ab82: bf00 nop
  28391. 802ab84: 0803abfc .word 0x0803abfc
  28392. 0802ab88 <dhcp_fine_tmr>:
  28393. * A DHCP server is expected to respond within a short period of time.
  28394. * This timer checks whether an outstanding DHCP request is timed out.
  28395. */
  28396. void
  28397. dhcp_fine_tmr()
  28398. {
  28399. 802ab88: b538 push {r3, r4, r5, lr}
  28400. struct netif *netif = netif_list;
  28401. 802ab8a: 4b26 ldr r3, [pc, #152] ; (802ac24 <dhcp_fine_tmr+0x9c>)
  28402. /* timer is active (non zero), and is about to trigger now */
  28403. if (netif->dhcp->request_timeout > 1) {
  28404. netif->dhcp->request_timeout--;
  28405. }
  28406. else if (netif->dhcp->request_timeout == 1) {
  28407. netif->dhcp->request_timeout--;
  28408. 802ab8c: 2500 movs r5, #0
  28409. * This timer checks whether an outstanding DHCP request is timed out.
  28410. */
  28411. void
  28412. dhcp_fine_tmr()
  28413. {
  28414. struct netif *netif = netif_list;
  28415. 802ab8e: 681c ldr r4, [r3, #0]
  28416. /* loop through netif's */
  28417. while (netif != NULL) {
  28418. 802ab90: e044 b.n 802ac1c <dhcp_fine_tmr+0x94>
  28419. /* only act on DHCP configured interfaces */
  28420. if (netif->dhcp != NULL) {
  28421. 802ab92: 6a23 ldr r3, [r4, #32]
  28422. 802ab94: 2b00 cmp r3, #0
  28423. 802ab96: d040 beq.n 802ac1a <dhcp_fine_tmr+0x92>
  28424. /* timer is active (non zero), and is about to trigger now */
  28425. if (netif->dhcp->request_timeout > 1) {
  28426. 802ab98: 8b5a ldrh r2, [r3, #26]
  28427. 802ab9a: 2a01 cmp r2, #1
  28428. 802ab9c: d902 bls.n 802aba4 <dhcp_fine_tmr+0x1c>
  28429. netif->dhcp->request_timeout--;
  28430. 802ab9e: 3a01 subs r2, #1
  28431. 802aba0: 835a strh r2, [r3, #26]
  28432. 802aba2: e03a b.n 802ac1a <dhcp_fine_tmr+0x92>
  28433. }
  28434. else if (netif->dhcp->request_timeout == 1) {
  28435. 802aba4: d139 bne.n 802ac1a <dhcp_fine_tmr+0x92>
  28436. dhcp_timeout(struct netif *netif)
  28437. {
  28438. struct dhcp *dhcp = netif->dhcp;
  28439. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout()\n"));
  28440. /* back-off period has passed, or server selection timed out */
  28441. if ((dhcp->state == DHCP_BACKING_OFF) || (dhcp->state == DHCP_SELECTING)) {
  28442. 802aba6: 7b1a ldrb r2, [r3, #12]
  28443. /* timer is active (non zero), and is about to trigger now */
  28444. if (netif->dhcp->request_timeout > 1) {
  28445. netif->dhcp->request_timeout--;
  28446. }
  28447. else if (netif->dhcp->request_timeout == 1) {
  28448. netif->dhcp->request_timeout--;
  28449. 802aba8: 835d strh r5, [r3, #26]
  28450. dhcp_timeout(struct netif *netif)
  28451. {
  28452. struct dhcp *dhcp = netif->dhcp;
  28453. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout()\n"));
  28454. /* back-off period has passed, or server selection timed out */
  28455. if ((dhcp->state == DHCP_BACKING_OFF) || (dhcp->state == DHCP_SELECTING)) {
  28456. 802abaa: 2a0c cmp r2, #12
  28457. 802abac: d028 beq.n 802ac00 <dhcp_fine_tmr+0x78>
  28458. 802abae: 2a06 cmp r2, #6
  28459. 802abb0: d100 bne.n 802abb4 <dhcp_fine_tmr+0x2c>
  28460. 802abb2: e025 b.n 802ac00 <dhcp_fine_tmr+0x78>
  28461. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout(): restarting discovery\n"));
  28462. dhcp_discover(netif);
  28463. /* receiving the requested lease timed out */
  28464. } else if (dhcp->state == DHCP_REQUESTING) {
  28465. 802abb4: 2a01 cmp r2, #1
  28466. 802abb6: d106 bne.n 802abc6 <dhcp_fine_tmr+0x3e>
  28467. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, DHCP request timed out\n"));
  28468. if (dhcp->tries <= 5) {
  28469. 802abb8: 7b5b ldrb r3, [r3, #13]
  28470. 802abba: 2b05 cmp r3, #5
  28471. dhcp_select(netif);
  28472. 802abbc: 4620 mov r0, r4
  28473. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout(): restarting discovery\n"));
  28474. dhcp_discover(netif);
  28475. /* receiving the requested lease timed out */
  28476. } else if (dhcp->state == DHCP_REQUESTING) {
  28477. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, DHCP request timed out\n"));
  28478. if (dhcp->tries <= 5) {
  28479. 802abbe: d81d bhi.n 802abfc <dhcp_fine_tmr+0x74>
  28480. dhcp_select(netif);
  28481. 802abc0: f7ff fc14 bl 802a3ec <dhcp_select>
  28482. 802abc4: e029 b.n 802ac1a <dhcp_fine_tmr+0x92>
  28483. dhcp_release(netif);
  28484. dhcp_discover(netif);
  28485. }
  28486. #if DHCP_DOES_ARP_CHECK
  28487. /* received no ARP reply for the offered address (which is good) */
  28488. } else if (dhcp->state == DHCP_CHECKING) {
  28489. 802abc6: 2a08 cmp r2, #8
  28490. 802abc8: d109 bne.n 802abde <dhcp_fine_tmr+0x56>
  28491. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): CHECKING, ARP request timed out\n"));
  28492. if (dhcp->tries <= 1) {
  28493. 802abca: 7b5b ldrb r3, [r3, #13]
  28494. 802abcc: 2b01 cmp r3, #1
  28495. dhcp_check(netif);
  28496. 802abce: 4620 mov r0, r4
  28497. }
  28498. #if DHCP_DOES_ARP_CHECK
  28499. /* received no ARP reply for the offered address (which is good) */
  28500. } else if (dhcp->state == DHCP_CHECKING) {
  28501. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): CHECKING, ARP request timed out\n"));
  28502. if (dhcp->tries <= 1) {
  28503. 802abd0: d802 bhi.n 802abd8 <dhcp_fine_tmr+0x50>
  28504. dhcp_check(netif);
  28505. 802abd2: f7ff fc7d bl 802a4d0 <dhcp_check>
  28506. 802abd6: e020 b.n 802ac1a <dhcp_fine_tmr+0x92>
  28507. /* no ARP replies on the offered address,
  28508. looks like the IP address is indeed free */
  28509. } else {
  28510. /* bind the interface to the offered address */
  28511. dhcp_bind(netif);
  28512. 802abd8: f7ff fc8d bl 802a4f6 <dhcp_bind>
  28513. 802abdc: e01d b.n 802ac1a <dhcp_fine_tmr+0x92>
  28514. }
  28515. #endif /* DHCP_DOES_ARP_CHECK */
  28516. }
  28517. /* did not get response to renew request? */
  28518. else if (dhcp->state == DHCP_RENEWING) {
  28519. 802abde: 2a05 cmp r2, #5
  28520. 802abe0: d103 bne.n 802abea <dhcp_fine_tmr+0x62>
  28521. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RENEWING, DHCP request timed out\n"));
  28522. /* just retry renewal */
  28523. /* note that the rebind timer will eventually time-out if renew does not work */
  28524. dhcp_renew(netif);
  28525. 802abe2: 4620 mov r0, r4
  28526. 802abe4: f7ff ff0c bl 802aa00 <dhcp_renew>
  28527. 802abe8: e017 b.n 802ac1a <dhcp_fine_tmr+0x92>
  28528. /* did not get response to rebind request? */
  28529. } else if (dhcp->state == DHCP_REBINDING) {
  28530. 802abea: 2a04 cmp r2, #4
  28531. 802abec: d10a bne.n 802ac04 <dhcp_fine_tmr+0x7c>
  28532. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REBINDING, DHCP request timed out\n"));
  28533. if (dhcp->tries <= 8) {
  28534. 802abee: 7b5b ldrb r3, [r3, #13]
  28535. 802abf0: 2b08 cmp r3, #8
  28536. dhcp_rebind(netif);
  28537. 802abf2: 4620 mov r0, r4
  28538. /* note that the rebind timer will eventually time-out if renew does not work */
  28539. dhcp_renew(netif);
  28540. /* did not get response to rebind request? */
  28541. } else if (dhcp->state == DHCP_REBINDING) {
  28542. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REBINDING, DHCP request timed out\n"));
  28543. if (dhcp->tries <= 8) {
  28544. 802abf4: d802 bhi.n 802abfc <dhcp_fine_tmr+0x74>
  28545. dhcp_rebind(netif);
  28546. 802abf6: f7ff fb67 bl 802a2c8 <dhcp_rebind>
  28547. 802abfa: e00e b.n 802ac1a <dhcp_fine_tmr+0x92>
  28548. } else {
  28549. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RELEASING, DISCOVERING\n"));
  28550. dhcp_release(netif);
  28551. 802abfc: f7ff ff72 bl 802aae4 <dhcp_release>
  28552. dhcp_discover(netif);
  28553. 802ac00: 4620 mov r0, r4
  28554. 802ac02: e008 b.n 802ac16 <dhcp_fine_tmr+0x8e>
  28555. }
  28556. } else if (dhcp->state == DHCP_REBOOTING) {
  28557. 802ac04: 2a03 cmp r2, #3
  28558. 802ac06: d108 bne.n 802ac1a <dhcp_fine_tmr+0x92>
  28559. if (dhcp->tries < REBOOT_TRIES) {
  28560. 802ac08: 7b5b ldrb r3, [r3, #13]
  28561. 802ac0a: 2b01 cmp r3, #1
  28562. dhcp_reboot(netif);
  28563. 802ac0c: 4620 mov r0, r4
  28564. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RELEASING, DISCOVERING\n"));
  28565. dhcp_release(netif);
  28566. dhcp_discover(netif);
  28567. }
  28568. } else if (dhcp->state == DHCP_REBOOTING) {
  28569. if (dhcp->tries < REBOOT_TRIES) {
  28570. 802ac0e: d802 bhi.n 802ac16 <dhcp_fine_tmr+0x8e>
  28571. dhcp_reboot(netif);
  28572. 802ac10: f7ff fb9c bl 802a34c <dhcp_reboot>
  28573. 802ac14: e001 b.n 802ac1a <dhcp_fine_tmr+0x92>
  28574. } else {
  28575. dhcp_discover(netif);
  28576. 802ac16: f7ff fafb bl 802a210 <dhcp_discover>
  28577. /* this client's request timeout triggered */
  28578. dhcp_timeout(netif);
  28579. }
  28580. }
  28581. /* proceed to next network interface */
  28582. netif = netif->next;
  28583. 802ac1a: 6824 ldr r4, [r4, #0]
  28584. void
  28585. dhcp_fine_tmr()
  28586. {
  28587. struct netif *netif = netif_list;
  28588. /* loop through netif's */
  28589. while (netif != NULL) {
  28590. 802ac1c: 2c00 cmp r4, #0
  28591. 802ac1e: d1b8 bne.n 802ab92 <dhcp_fine_tmr+0xa>
  28592. }
  28593. }
  28594. /* proceed to next network interface */
  28595. netif = netif->next;
  28596. }
  28597. }
  28598. 802ac20: bd38 pop {r3, r4, r5, pc}
  28599. 802ac22: bf00 nop
  28600. 802ac24: 20010d6c .word 0x20010d6c
  28601. 0802ac28 <dhcp_stop>:
  28602. *
  28603. * @param netif The network interface to stop DHCP on
  28604. */
  28605. void
  28606. dhcp_stop(struct netif *netif)
  28607. {
  28608. 802ac28: b510 push {r4, lr}
  28609. struct dhcp *dhcp;
  28610. LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;);
  28611. 802ac2a: b198 cbz r0, 802ac54 <dhcp_stop+0x2c>
  28612. dhcp = netif->dhcp;
  28613. /* Remove the flag that says this netif is handled by DHCP. */
  28614. netif->flags &= ~NETIF_FLAG_DHCP;
  28615. 802ac2c: f890 302d ldrb.w r3, [r0, #45] ; 0x2d
  28616. void
  28617. dhcp_stop(struct netif *netif)
  28618. {
  28619. struct dhcp *dhcp;
  28620. LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;);
  28621. dhcp = netif->dhcp;
  28622. 802ac30: 6a04 ldr r4, [r0, #32]
  28623. /* Remove the flag that says this netif is handled by DHCP. */
  28624. netif->flags &= ~NETIF_FLAG_DHCP;
  28625. 802ac32: f023 0308 bic.w r3, r3, #8
  28626. 802ac36: f880 302d strb.w r3, [r0, #45] ; 0x2d
  28627. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_stop()\n"));
  28628. /* netif is DHCP configured? */
  28629. if (dhcp != NULL) {
  28630. 802ac3a: b15c cbz r4, 802ac54 <dhcp_stop+0x2c>
  28631. autoip_stop(netif);
  28632. dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF;
  28633. }
  28634. #endif /* LWIP_DHCP_AUTOIP_COOP */
  28635. if (dhcp->pcb != NULL) {
  28636. 802ac3c: 6860 ldr r0, [r4, #4]
  28637. 802ac3e: b118 cbz r0, 802ac48 <dhcp_stop+0x20>
  28638. udp_remove(dhcp->pcb);
  28639. 802ac40: f003 f852 bl 802dce8 <udp_remove>
  28640. dhcp->pcb = NULL;
  28641. 802ac44: 2300 movs r3, #0
  28642. 802ac46: 6063 str r3, [r4, #4]
  28643. }
  28644. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  28645. dhcp_set_state(dhcp, DHCP_OFF);
  28646. 802ac48: 4620 mov r0, r4
  28647. 802ac4a: 2100 movs r1, #0
  28648. }
  28649. }
  28650. 802ac4c: e8bd 4010 ldmia.w sp!, {r4, lr}
  28651. if (dhcp->pcb != NULL) {
  28652. udp_remove(dhcp->pcb);
  28653. dhcp->pcb = NULL;
  28654. }
  28655. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL);
  28656. dhcp_set_state(dhcp, DHCP_OFF);
  28657. 802ac50: f7ff b9ce b.w 8029ff0 <dhcp_set_state>
  28658. 802ac54: bd10 pop {r4, pc}
  28659. 802ac56: 0000 movs r0, r0
  28660. 0802ac58 <dhcp_start>:
  28661. * - ERR_OK - No error
  28662. * - ERR_MEM - Out of memory
  28663. */
  28664. err_t
  28665. dhcp_start(struct netif *netif)
  28666. {
  28667. 802ac58: b538 push {r3, r4, r5, lr}
  28668. struct dhcp *dhcp;
  28669. err_t result = ERR_OK;
  28670. LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;);
  28671. 802ac5a: 4604 mov r4, r0
  28672. 802ac5c: b908 cbnz r0, 802ac62 <dhcp_start+0xa>
  28673. 802ac5e: 20f2 movs r0, #242 ; 0xf2
  28674. 802ac60: e047 b.n 802acf2 <dhcp_start+0x9a>
  28675. dhcp = netif->dhcp;
  28676. 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));
  28677. /* Remove the flag that says this netif is handled by DHCP,
  28678. it is set when we succeeded starting. */
  28679. netif->flags &= ~NETIF_FLAG_DHCP;
  28680. 802ac62: f890 302d ldrb.w r3, [r0, #45] ; 0x2d
  28681. {
  28682. struct dhcp *dhcp;
  28683. err_t result = ERR_OK;
  28684. LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;);
  28685. dhcp = netif->dhcp;
  28686. 802ac66: 6a05 ldr r5, [r0, #32]
  28687. 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));
  28688. /* Remove the flag that says this netif is handled by DHCP,
  28689. it is set when we succeeded starting. */
  28690. netif->flags &= ~NETIF_FLAG_DHCP;
  28691. 802ac68: f023 0208 bic.w r2, r3, #8
  28692. /* check hwtype of the netif */
  28693. if ((netif->flags & NETIF_FLAG_ETHARP) == 0) {
  28694. 802ac6c: f003 0320 and.w r3, r3, #32
  28695. 802ac70: b2db uxtb r3, r3
  28696. LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;);
  28697. dhcp = netif->dhcp;
  28698. 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));
  28699. /* Remove the flag that says this netif is handled by DHCP,
  28700. it is set when we succeeded starting. */
  28701. netif->flags &= ~NETIF_FLAG_DHCP;
  28702. 802ac72: f880 202d strb.w r2, [r0, #45] ; 0x2d
  28703. /* check hwtype of the netif */
  28704. if ((netif->flags & NETIF_FLAG_ETHARP) == 0) {
  28705. 802ac76: 2b00 cmp r3, #0
  28706. 802ac78: d0f1 beq.n 802ac5e <dhcp_start+0x6>
  28707. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): No ETHARP netif\n"));
  28708. return ERR_ARG;
  28709. }
  28710. /* check MTU of the netif */
  28711. if (netif->mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) {
  28712. 802ac7a: 8c83 ldrh r3, [r0, #36] ; 0x24
  28713. 802ac7c: f5b3 7f10 cmp.w r3, #576 ; 0x240
  28714. 802ac80: d200 bcs.n 802ac84 <dhcp_start+0x2c>
  28715. 802ac82: e02e b.n 802ace2 <dhcp_start+0x8a>
  28716. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): Cannot use this netif with DHCP: MTU is too small\n"));
  28717. return ERR_MEM;
  28718. }
  28719. /* no DHCP client attached yet? */
  28720. if (dhcp == NULL) {
  28721. 802ac84: b935 cbnz r5, 802ac94 <dhcp_start+0x3c>
  28722. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting new DHCP client\n"));
  28723. dhcp = (struct dhcp *)mem_malloc(sizeof(struct dhcp));
  28724. 802ac86: 203c movs r0, #60 ; 0x3c
  28725. 802ac88: f000 f938 bl 802aefc <mem_malloc>
  28726. if (dhcp == NULL) {
  28727. 802ac8c: 4605 mov r5, r0
  28728. 802ac8e: b340 cbz r0, 802ace2 <dhcp_start+0x8a>
  28729. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not allocate dhcp\n"));
  28730. return ERR_MEM;
  28731. }
  28732. /* store this dhcp client in the netif */
  28733. netif->dhcp = dhcp;
  28734. 802ac90: 6220 str r0, [r4, #32]
  28735. 802ac92: e003 b.n 802ac9c <dhcp_start+0x44>
  28736. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): allocated dhcp"));
  28737. /* already has DHCP client attached */
  28738. } else {
  28739. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(): restarting DHCP configuration\n"));
  28740. if (dhcp->pcb != NULL) {
  28741. 802ac94: 6868 ldr r0, [r5, #4]
  28742. 802ac96: b108 cbz r0, 802ac9c <dhcp_start+0x44>
  28743. udp_remove(dhcp->pcb);
  28744. 802ac98: f003 f826 bl 802dce8 <udp_remove>
  28745. LWIP_ASSERT("pbuf p_out wasn't freed", dhcp->p_out == NULL);
  28746. LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL );
  28747. }
  28748. /* clear data structure */
  28749. memset(dhcp, 0, sizeof(struct dhcp));
  28750. 802ac9c: 2100 movs r1, #0
  28751. 802ac9e: 223c movs r2, #60 ; 0x3c
  28752. 802aca0: 4628 mov r0, r5
  28753. 802aca2: f7f6 fd89 bl 80217b8 <memset>
  28754. /* dhcp_set_state(&dhcp, DHCP_OFF); */
  28755. /* allocate UDP PCB */
  28756. dhcp->pcb = udp_new();
  28757. 802aca6: f003 f83b bl 802dd20 <udp_new>
  28758. 802acaa: 6068 str r0, [r5, #4]
  28759. if (dhcp->pcb == NULL) {
  28760. 802acac: b1c8 cbz r0, 802ace2 <dhcp_start+0x8a>
  28761. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not obtain pcb\n"));
  28762. return ERR_MEM;
  28763. }
  28764. ip_set_option(dhcp->pcb, SOF_BROADCAST);
  28765. 802acae: 7a03 ldrb r3, [r0, #8]
  28766. /* set up local and remote port for the pcb */
  28767. udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
  28768. 802acb0: 4911 ldr r1, [pc, #68] ; (802acf8 <dhcp_start+0xa0>)
  28769. dhcp->pcb = udp_new();
  28770. if (dhcp->pcb == NULL) {
  28771. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not obtain pcb\n"));
  28772. return ERR_MEM;
  28773. }
  28774. ip_set_option(dhcp->pcb, SOF_BROADCAST);
  28775. 802acb2: f043 0320 orr.w r3, r3, #32
  28776. 802acb6: 7203 strb r3, [r0, #8]
  28777. /* set up local and remote port for the pcb */
  28778. udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
  28779. 802acb8: 2244 movs r2, #68 ; 0x44
  28780. 802acba: 6868 ldr r0, [r5, #4]
  28781. 802acbc: f002 ff18 bl 802daf0 <udp_bind>
  28782. udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
  28783. 802acc0: 490d ldr r1, [pc, #52] ; (802acf8 <dhcp_start+0xa0>)
  28784. 802acc2: 6868 ldr r0, [r5, #4]
  28785. 802acc4: 2243 movs r2, #67 ; 0x43
  28786. 802acc6: f002 ffdd bl 802dc84 <udp_connect>
  28787. /* set up the recv callback and argument */
  28788. udp_recv(dhcp->pcb, dhcp_recv, netif);
  28789. 802acca: 6868 ldr r0, [r5, #4]
  28790. 802accc: 490b ldr r1, [pc, #44] ; (802acfc <dhcp_start+0xa4>)
  28791. 802acce: 4622 mov r2, r4
  28792. 802acd0: f003 f806 bl 802dce0 <udp_recv>
  28793. LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting DHCP configuration\n"));
  28794. /* (re)start the DHCP negotiation */
  28795. result = dhcp_discover(netif);
  28796. 802acd4: 4620 mov r0, r4
  28797. 802acd6: f7ff fa9b bl 802a210 <dhcp_discover>
  28798. if (result != ERR_OK) {
  28799. 802acda: b120 cbz r0, 802ace6 <dhcp_start+0x8e>
  28800. /* free resources allocated above */
  28801. dhcp_stop(netif);
  28802. 802acdc: 4620 mov r0, r4
  28803. 802acde: f7ff ffa3 bl 802ac28 <dhcp_stop>
  28804. return ERR_MEM;
  28805. 802ace2: 20ff movs r0, #255 ; 0xff
  28806. 802ace4: e005 b.n 802acf2 <dhcp_start+0x9a>
  28807. }
  28808. /* Set the flag that says this netif is handled by DHCP. */
  28809. netif->flags |= NETIF_FLAG_DHCP;
  28810. 802ace6: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  28811. 802acea: f043 0308 orr.w r3, r3, #8
  28812. 802acee: f884 302d strb.w r3, [r4, #45] ; 0x2d
  28813. return result;
  28814. }
  28815. 802acf2: b240 sxtb r0, r0
  28816. 802acf4: bd38 pop {r3, r4, r5, pc}
  28817. 802acf6: bf00 nop
  28818. 802acf8: 0803abfc .word 0x0803abfc
  28819. 802acfc: 0802a5b5 .word 0x0802a5b5
  28820. 0802ad00 <lwip_init>:
  28821. /**
  28822. * Perform Sanity check of user-configurable values, and initialize all modules.
  28823. */
  28824. void
  28825. lwip_init(void)
  28826. {
  28827. 802ad00: b508 push {r3, lr}
  28828. /* Modules initialization */
  28829. stats_init();
  28830. #if !NO_SYS
  28831. sys_init();
  28832. 802ad02: f007 ff0f bl 8032b24 <sys_init>
  28833. #endif /* !NO_SYS */
  28834. mem_init();
  28835. 802ad06: f000 f80f bl 802ad28 <mem_init>
  28836. memp_init();
  28837. 802ad0a: f000 f95b bl 802afc4 <memp_init>
  28838. pbuf_init();
  28839. netif_init();
  28840. 802ad0e: f000 f9a9 bl 802b064 <netif_init>
  28841. #endif /* LWIP_ARP */
  28842. #if LWIP_RAW
  28843. raw_init();
  28844. #endif /* LWIP_RAW */
  28845. #if LWIP_UDP
  28846. udp_init();
  28847. 802ad12: f002 fe27 bl 802d964 <udp_init>
  28848. #endif /* LWIP_UDP */
  28849. #if LWIP_TCP
  28850. tcp_init();
  28851. 802ad16: f000 fc8b bl 802b630 <tcp_init>
  28852. #endif /* LWIP_TCP */
  28853. #if LWIP_SNMP
  28854. snmp_init();
  28855. 802ad1a: f005 fdc5 bl 80308a8 <snmp_init>
  28856. #endif /* LWIP_DNS */
  28857. #if LWIP_TIMERS
  28858. sys_timeouts_init();
  28859. #endif /* LWIP_TIMERS */
  28860. }
  28861. 802ad1e: e8bd 4008 ldmia.w sp!, {r3, lr}
  28862. #if LWIP_DNS
  28863. dns_init();
  28864. #endif /* LWIP_DNS */
  28865. #if LWIP_TIMERS
  28866. sys_timeouts_init();
  28867. 802ad22: f002 bd49 b.w 802d7b8 <sys_timeouts_init>
  28868. 802ad26: 0000 movs r0, r0
  28869. 0802ad28 <mem_init>:
  28870. LWIP_ASSERT("Sanity check alignment",
  28871. (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0);
  28872. /* align the heap */
  28873. ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
  28874. 802ad28: 4b0b ldr r3, [pc, #44] ; (802ad58 <mem_init+0x30>)
  28875. 802ad2a: 4a0c ldr r2, [pc, #48] ; (802ad5c <mem_init+0x34>)
  28876. mem = (struct mem *)(void *)ram;
  28877. mem->next = MEM_SIZE_ALIGNED;
  28878. mem->prev = 0;
  28879. mem->used = 0;
  28880. /* initialize the end of the heap */
  28881. ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED];
  28882. 802ad2c: 480c ldr r0, [pc, #48] ; (802ad60 <mem_init+0x38>)
  28883. LWIP_ASSERT("Sanity check alignment",
  28884. (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0);
  28885. /* align the heap */
  28886. ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
  28887. 802ad2e: f023 0303 bic.w r3, r3, #3
  28888. 802ad32: 6013 str r3, [r2, #0]
  28889. /* initialize the start of the heap */
  28890. mem = (struct mem *)(void *)ram;
  28891. mem->next = MEM_SIZE_ALIGNED;
  28892. 802ad34: f44f 51a0 mov.w r1, #5120 ; 0x1400
  28893. mem->prev = 0;
  28894. 802ad38: 2200 movs r2, #0
  28895. 802ad3a: 805a strh r2, [r3, #2]
  28896. mem->used = 0;
  28897. 802ad3c: 711a strb r2, [r3, #4]
  28898. /* initialize the end of the heap */
  28899. ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED];
  28900. 802ad3e: 185a adds r2, r3, r1
  28901. 802ad40: 6002 str r2, [r0, #0]
  28902. ram_end->used = 1;
  28903. 802ad42: 2001 movs r0, #1
  28904. 802ad44: 7110 strb r0, [r2, #4]
  28905. ram_end->next = MEM_SIZE_ALIGNED;
  28906. ram_end->prev = MEM_SIZE_ALIGNED;
  28907. 802ad46: 8051 strh r1, [r2, #2]
  28908. /* align the heap */
  28909. ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
  28910. /* initialize the start of the heap */
  28911. mem = (struct mem *)(void *)ram;
  28912. mem->next = MEM_SIZE_ALIGNED;
  28913. 802ad48: 8019 strh r1, [r3, #0]
  28914. /* initialize the lowest-free pointer to the start of the heap */
  28915. lfree = (struct mem *)(void *)ram;
  28916. MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);
  28917. if(sys_mutex_new(&mem_mutex) != ERR_OK) {
  28918. 802ad4a: 4806 ldr r0, [pc, #24] ; (802ad64 <mem_init+0x3c>)
  28919. mem->prev = 0;
  28920. mem->used = 0;
  28921. /* initialize the end of the heap */
  28922. ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED];
  28923. ram_end->used = 1;
  28924. ram_end->next = MEM_SIZE_ALIGNED;
  28925. 802ad4c: 8011 strh r1, [r2, #0]
  28926. ram_end->prev = MEM_SIZE_ALIGNED;
  28927. /* initialize the lowest-free pointer to the start of the heap */
  28928. lfree = (struct mem *)(void *)ram;
  28929. 802ad4e: 4a06 ldr r2, [pc, #24] ; (802ad68 <mem_init+0x40>)
  28930. 802ad50: 6013 str r3, [r2, #0]
  28931. MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);
  28932. if(sys_mutex_new(&mem_mutex) != ERR_OK) {
  28933. 802ad52: f007 bec9 b.w 8032ae8 <sys_mutex_new>
  28934. 802ad56: bf00 nop
  28935. 802ad58: 2000f95b .word 0x2000f95b
  28936. 802ad5c: 20002a14 .word 0x20002a14
  28937. 802ad60: 20002a0c .word 0x20002a0c
  28938. 802ad64: 20002a10 .word 0x20002a10
  28939. 802ad68: 20002a08 .word 0x20002a08
  28940. 0802ad6c <mem_free>:
  28941. * @param rmem is the data portion of a struct mem as returned by a previous
  28942. * call to mem_malloc()
  28943. */
  28944. void
  28945. mem_free(void *rmem)
  28946. {
  28947. 802ad6c: b570 push {r4, r5, r6, lr}
  28948. struct mem *mem;
  28949. LWIP_MEM_FREE_DECL_PROTECT();
  28950. if (rmem == NULL) {
  28951. 802ad6e: 4604 mov r4, r0
  28952. 802ad70: 2800 cmp r0, #0
  28953. 802ad72: d04c beq.n 802ae0e <mem_free+0xa2>
  28954. LWIP_ASSERT("mem_free: sanity check alignment", (((mem_ptr_t)rmem) & (MEM_ALIGNMENT-1)) == 0);
  28955. LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram &&
  28956. (u8_t *)rmem < (u8_t *)ram_end);
  28957. if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
  28958. 802ad74: 4b26 ldr r3, [pc, #152] ; (802ae10 <mem_free+0xa4>)
  28959. 802ad76: 681b ldr r3, [r3, #0]
  28960. 802ad78: 4298 cmp r0, r3
  28961. 802ad7a: d303 bcc.n 802ad84 <mem_free+0x18>
  28962. 802ad7c: 4b25 ldr r3, [pc, #148] ; (802ae14 <mem_free+0xa8>)
  28963. 802ad7e: 681b ldr r3, [r3, #0]
  28964. 802ad80: 4298 cmp r0, r3
  28965. 802ad82: d305 bcc.n 802ad90 <mem_free+0x24>
  28966. SYS_ARCH_DECL_PROTECT(lev);
  28967. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n"));
  28968. /* protect mem stats from concurrent access */
  28969. SYS_ARCH_PROTECT(lev);
  28970. 802ad84: f007 fee8 bl 8032b58 <sys_arch_protect>
  28971. plug_holes(mem);
  28972. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  28973. mem_free_count = 1;
  28974. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  28975. LWIP_MEM_FREE_UNPROTECT();
  28976. }
  28977. 802ad88: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  28978. SYS_ARCH_DECL_PROTECT(lev);
  28979. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n"));
  28980. /* protect mem stats from concurrent access */
  28981. SYS_ARCH_PROTECT(lev);
  28982. MEM_STATS_INC(illegal);
  28983. SYS_ARCH_UNPROTECT(lev);
  28984. 802ad8c: f007 beee b.w 8032b6c <sys_arch_unprotect>
  28985. return;
  28986. }
  28987. /* protect the heap from concurrent access */
  28988. LWIP_MEM_FREE_PROTECT();
  28989. 802ad90: 4821 ldr r0, [pc, #132] ; (802ae18 <mem_free+0xac>)
  28990. 802ad92: f007 feb5 bl 8032b00 <sys_mutex_lock>
  28991. /* Get the corresponding struct mem ... */
  28992. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  28993. /* ... which has to be in a used state ... */
  28994. LWIP_ASSERT("mem_free: mem->used", mem->used);
  28995. /* ... and is now unused. */
  28996. mem->used = 0;
  28997. 802ad96: 2300 movs r3, #0
  28998. 802ad98: f804 3c04 strb.w r3, [r4, #-4]
  28999. if (mem < lfree) {
  29000. 802ad9c: 4b1f ldr r3, [pc, #124] ; (802ae1c <mem_free+0xb0>)
  29001. LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0);
  29002. /* plug hole forward */
  29003. LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED);
  29004. nmem = (struct mem *)(void *)&ram[mem->next];
  29005. 802ad9e: f834 0c08 ldrh.w r0, [r4, #-8]
  29006. /* ... which has to be in a used state ... */
  29007. LWIP_ASSERT("mem_free: mem->used", mem->used);
  29008. /* ... and is now unused. */
  29009. mem->used = 0;
  29010. if (mem < lfree) {
  29011. 802ada2: 6819 ldr r1, [r3, #0]
  29012. return;
  29013. }
  29014. /* protect the heap from concurrent access */
  29015. LWIP_MEM_FREE_PROTECT();
  29016. /* Get the corresponding struct mem ... */
  29017. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  29018. 802ada4: f1a4 0208 sub.w r2, r4, #8
  29019. /* ... which has to be in a used state ... */
  29020. LWIP_ASSERT("mem_free: mem->used", mem->used);
  29021. /* ... and is now unused. */
  29022. mem->used = 0;
  29023. if (mem < lfree) {
  29024. 802ada8: 428a cmp r2, r1
  29025. /* the newly freed struct is now the lowest */
  29026. lfree = mem;
  29027. 802adaa: bf38 it cc
  29028. 802adac: 601a strcc r2, [r3, #0]
  29029. LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0);
  29030. /* plug hole forward */
  29031. LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED);
  29032. nmem = (struct mem *)(void *)&ram[mem->next];
  29033. 802adae: 4b18 ldr r3, [pc, #96] ; (802ae10 <mem_free+0xa4>)
  29034. 802adb0: 681b ldr r3, [r3, #0]
  29035. 802adb2: 1819 adds r1, r3, r0
  29036. if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) {
  29037. 802adb4: 428a cmp r2, r1
  29038. 802adb6: d011 beq.n 802addc <mem_free+0x70>
  29039. 802adb8: 790d ldrb r5, [r1, #4]
  29040. 802adba: b97d cbnz r5, 802addc <mem_free+0x70>
  29041. 802adbc: 4d15 ldr r5, [pc, #84] ; (802ae14 <mem_free+0xa8>)
  29042. 802adbe: 682d ldr r5, [r5, #0]
  29043. 802adc0: 42a9 cmp r1, r5
  29044. 802adc2: d00b beq.n 802addc <mem_free+0x70>
  29045. /* if mem->next is unused and not end of ram, combine mem and mem->next */
  29046. if (lfree == nmem) {
  29047. 802adc4: 4d15 ldr r5, [pc, #84] ; (802ae1c <mem_free+0xb0>)
  29048. 802adc6: 682e ldr r6, [r5, #0]
  29049. 802adc8: 428e cmp r6, r1
  29050. lfree = mem;
  29051. }
  29052. mem->next = nmem->next;
  29053. 802adca: 5a19 ldrh r1, [r3, r0]
  29054. nmem = (struct mem *)(void *)&ram[mem->next];
  29055. if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) {
  29056. /* if mem->next is unused and not end of ram, combine mem and mem->next */
  29057. if (lfree == nmem) {
  29058. lfree = mem;
  29059. 802adcc: bf08 it eq
  29060. 802adce: 602a streq r2, [r5, #0]
  29061. }
  29062. mem->next = nmem->next;
  29063. 802add0: f824 1c08 strh.w r1, [r4, #-8]
  29064. ((struct mem *)(void *)&ram[nmem->next])->prev = (mem_size_t)((u8_t *)mem - ram);
  29065. 802add4: 5a19 ldrh r1, [r3, r0]
  29066. 802add6: 1859 adds r1, r3, r1
  29067. 802add8: 1ad0 subs r0, r2, r3
  29068. 802adda: 8048 strh r0, [r1, #2]
  29069. }
  29070. /* plug hole backward */
  29071. pmem = (struct mem *)(void *)&ram[mem->prev];
  29072. 802addc: f834 0c06 ldrh.w r0, [r4, #-6]
  29073. 802ade0: 1819 adds r1, r3, r0
  29074. if (pmem != mem && pmem->used == 0) {
  29075. 802ade2: 4291 cmp r1, r2
  29076. 802ade4: d00e beq.n 802ae04 <mem_free+0x98>
  29077. 802ade6: 790d ldrb r5, [r1, #4]
  29078. 802ade8: b965 cbnz r5, 802ae04 <mem_free+0x98>
  29079. /* if mem->prev is unused, combine mem and mem->prev */
  29080. if (lfree == mem) {
  29081. 802adea: 4d0c ldr r5, [pc, #48] ; (802ae1c <mem_free+0xb0>)
  29082. 802adec: 682e ldr r6, [r5, #0]
  29083. 802adee: 4296 cmp r6, r2
  29084. lfree = pmem;
  29085. }
  29086. pmem->next = mem->next;
  29087. 802adf0: f834 2c08 ldrh.w r2, [r4, #-8]
  29088. /* plug hole backward */
  29089. pmem = (struct mem *)(void *)&ram[mem->prev];
  29090. if (pmem != mem && pmem->used == 0) {
  29091. /* if mem->prev is unused, combine mem and mem->prev */
  29092. if (lfree == mem) {
  29093. lfree = pmem;
  29094. 802adf4: bf08 it eq
  29095. 802adf6: 6029 streq r1, [r5, #0]
  29096. }
  29097. pmem->next = mem->next;
  29098. 802adf8: 521a strh r2, [r3, r0]
  29099. ((struct mem *)(void *)&ram[mem->next])->prev = (mem_size_t)((u8_t *)pmem - ram);
  29100. 802adfa: f834 2c08 ldrh.w r2, [r4, #-8]
  29101. 802adfe: 189a adds r2, r3, r2
  29102. 802ae00: 1acb subs r3, r1, r3
  29103. 802ae02: 8053 strh r3, [r2, #2]
  29104. /* finally, see if prev or next are free also */
  29105. plug_holes(mem);
  29106. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  29107. mem_free_count = 1;
  29108. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29109. LWIP_MEM_FREE_UNPROTECT();
  29110. 802ae04: 4804 ldr r0, [pc, #16] ; (802ae18 <mem_free+0xac>)
  29111. }
  29112. 802ae06: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  29113. /* finally, see if prev or next are free also */
  29114. plug_holes(mem);
  29115. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  29116. mem_free_count = 1;
  29117. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29118. LWIP_MEM_FREE_UNPROTECT();
  29119. 802ae0a: f007 be85 b.w 8032b18 <sys_mutex_unlock>
  29120. 802ae0e: bd70 pop {r4, r5, r6, pc}
  29121. 802ae10: 20002a14 .word 0x20002a14
  29122. 802ae14: 20002a0c .word 0x20002a0c
  29123. 802ae18: 20002a10 .word 0x20002a10
  29124. 802ae1c: 20002a08 .word 0x20002a08
  29125. 0802ae20 <mem_trim>:
  29126. * or NULL if newsize is > old size, in which case rmem is NOT touched
  29127. * or freed!
  29128. */
  29129. void *
  29130. mem_trim(void *rmem, mem_size_t newsize)
  29131. {
  29132. 802ae20: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  29133. /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */
  29134. LWIP_MEM_FREE_DECL_PROTECT();
  29135. /* Expand the size of the allocated memory region so that we can
  29136. adjust for alignment. */
  29137. newsize = LWIP_MEM_ALIGN_SIZE(newsize);
  29138. 802ae24: 3103 adds r1, #3
  29139. 802ae26: f64f 75fc movw r5, #65532 ; 0xfffc
  29140. 802ae2a: 400d ands r5, r1
  29141. if(newsize < MIN_SIZE_ALIGNED) {
  29142. 802ae2c: 2d0b cmp r5, #11
  29143. * or NULL if newsize is > old size, in which case rmem is NOT touched
  29144. * or freed!
  29145. */
  29146. void *
  29147. mem_trim(void *rmem, mem_size_t newsize)
  29148. {
  29149. 802ae2e: 4604 mov r4, r0
  29150. /* Expand the size of the allocated memory region so that we can
  29151. adjust for alignment. */
  29152. newsize = LWIP_MEM_ALIGN_SIZE(newsize);
  29153. if(newsize < MIN_SIZE_ALIGNED) {
  29154. 802ae30: d903 bls.n 802ae3a <mem_trim+0x1a>
  29155. /* every data block must be at least MIN_SIZE_ALIGNED long */
  29156. newsize = MIN_SIZE_ALIGNED;
  29157. }
  29158. if (newsize > MEM_SIZE_ALIGNED) {
  29159. 802ae32: f5b5 5fa0 cmp.w r5, #5120 ; 0x1400
  29160. 802ae36: d901 bls.n 802ae3c <mem_trim+0x1c>
  29161. 802ae38: e053 b.n 802aee2 <mem_trim+0xc2>
  29162. adjust for alignment. */
  29163. newsize = LWIP_MEM_ALIGN_SIZE(newsize);
  29164. if(newsize < MIN_SIZE_ALIGNED) {
  29165. /* every data block must be at least MIN_SIZE_ALIGNED long */
  29166. newsize = MIN_SIZE_ALIGNED;
  29167. 802ae3a: 250c movs r5, #12
  29168. }
  29169. LWIP_ASSERT("mem_trim: legal memory", (u8_t *)rmem >= (u8_t *)ram &&
  29170. (u8_t *)rmem < (u8_t *)ram_end);
  29171. if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
  29172. 802ae3c: f8df 80b8 ldr.w r8, [pc, #184] ; 802aef8 <mem_trim+0xd8>
  29173. 802ae40: f8d8 3000 ldr.w r3, [r8]
  29174. 802ae44: 429c cmp r4, r3
  29175. 802ae46: d303 bcc.n 802ae50 <mem_trim+0x30>
  29176. 802ae48: 4a28 ldr r2, [pc, #160] ; (802aeec <mem_trim+0xcc>)
  29177. 802ae4a: 6812 ldr r2, [r2, #0]
  29178. 802ae4c: 4294 cmp r4, r2
  29179. 802ae4e: d304 bcc.n 802ae5a <mem_trim+0x3a>
  29180. SYS_ARCH_DECL_PROTECT(lev);
  29181. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_trim: illegal memory\n"));
  29182. /* protect mem stats from concurrent access */
  29183. SYS_ARCH_PROTECT(lev);
  29184. 802ae50: f007 fe82 bl 8032b58 <sys_arch_protect>
  29185. MEM_STATS_INC(illegal);
  29186. SYS_ARCH_UNPROTECT(lev);
  29187. 802ae54: f007 fe8a bl 8032b6c <sys_arch_unprotect>
  29188. return rmem;
  29189. 802ae58: e044 b.n 802aee4 <mem_trim+0xc4>
  29190. }
  29191. /* Get the corresponding struct mem ... */
  29192. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  29193. 802ae5a: f1a4 0608 sub.w r6, r4, #8
  29194. /* ... and its offset pointer */
  29195. ptr = (mem_size_t)((u8_t *)mem - ram);
  29196. size = mem->next - ptr - SIZEOF_STRUCT_MEM;
  29197. 802ae5e: f834 7c08 ldrh.w r7, [r4, #-8]
  29198. return rmem;
  29199. }
  29200. /* Get the corresponding struct mem ... */
  29201. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  29202. /* ... and its offset pointer */
  29203. ptr = (mem_size_t)((u8_t *)mem - ram);
  29204. 802ae62: 1af6 subs r6, r6, r3
  29205. size = mem->next - ptr - SIZEOF_STRUCT_MEM;
  29206. 802ae64: 3f08 subs r7, #8
  29207. return rmem;
  29208. }
  29209. /* Get the corresponding struct mem ... */
  29210. mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
  29211. /* ... and its offset pointer */
  29212. ptr = (mem_size_t)((u8_t *)mem - ram);
  29213. 802ae66: b2b6 uxth r6, r6
  29214. size = mem->next - ptr - SIZEOF_STRUCT_MEM;
  29215. 802ae68: 1bbf subs r7, r7, r6
  29216. 802ae6a: b2bf uxth r7, r7
  29217. LWIP_ASSERT("mem_trim can only shrink memory", newsize <= size);
  29218. if (newsize > size) {
  29219. 802ae6c: 42bd cmp r5, r7
  29220. 802ae6e: d838 bhi.n 802aee2 <mem_trim+0xc2>
  29221. /* not supported */
  29222. return NULL;
  29223. }
  29224. if (newsize == size) {
  29225. 802ae70: d038 beq.n 802aee4 <mem_trim+0xc4>
  29226. /* No change in size, simply return */
  29227. return rmem;
  29228. }
  29229. /* protect the heap from concurrent access */
  29230. LWIP_MEM_FREE_PROTECT();
  29231. 802ae72: 481f ldr r0, [pc, #124] ; (802aef0 <mem_trim+0xd0>)
  29232. 802ae74: f007 fe44 bl 8032b00 <sys_mutex_lock>
  29233. mem2 = (struct mem *)(void *)&ram[mem->next];
  29234. 802ae78: f8d8 3000 ldr.w r3, [r8]
  29235. 802ae7c: f834 1c08 ldrh.w r1, [r4, #-8]
  29236. 802ae80: 185a adds r2, r3, r1
  29237. if(mem2->used == 0) {
  29238. 802ae82: 7910 ldrb r0, [r2, #4]
  29239. 802ae84: b978 cbnz r0, 802aea6 <mem_trim+0x86>
  29240. /* The next struct is unused, we can simply move it at little */
  29241. mem_size_t next;
  29242. /* remember the old next pointer */
  29243. next = mem2->next;
  29244. 802ae86: 5a5f ldrh r7, [r3, r1]
  29245. /* create new struct mem which is moved directly after the shrinked mem */
  29246. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  29247. 802ae88: f106 0108 add.w r1, r6, #8
  29248. 802ae8c: 186d adds r5, r5, r1
  29249. if (lfree == mem2) {
  29250. 802ae8e: 4919 ldr r1, [pc, #100] ; (802aef4 <mem_trim+0xd4>)
  29251. 802ae90: 6808 ldr r0, [r1, #0]
  29252. /* The next struct is unused, we can simply move it at little */
  29253. mem_size_t next;
  29254. /* remember the old next pointer */
  29255. next = mem2->next;
  29256. /* create new struct mem which is moved directly after the shrinked mem */
  29257. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  29258. 802ae92: b2ad uxth r5, r5
  29259. if (lfree == mem2) {
  29260. 802ae94: 4290 cmp r0, r2
  29261. 802ae96: eb03 0205 add.w r2, r3, r5
  29262. lfree = (struct mem *)(void *)&ram[ptr2];
  29263. 802ae9a: bf08 it eq
  29264. 802ae9c: 600a streq r2, [r1, #0]
  29265. }
  29266. mem2 = (struct mem *)(void *)&ram[ptr2];
  29267. mem2->used = 0;
  29268. 802ae9e: 2100 movs r1, #0
  29269. 802aea0: 7111 strb r1, [r2, #4]
  29270. /* restore the next pointer */
  29271. mem2->next = next;
  29272. 802aea2: 535f strh r7, [r3, r5]
  29273. 802aea4: e010 b.n 802aec8 <mem_trim+0xa8>
  29274. if (mem2->next != MEM_SIZE_ALIGNED) {
  29275. ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
  29276. }
  29277. MEM_STATS_DEC_USED(used, (size - newsize));
  29278. /* no need to plug holes, we've already done that */
  29279. } else if (newsize + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED <= size) {
  29280. 802aea6: f105 0214 add.w r2, r5, #20
  29281. 802aeaa: 42ba cmp r2, r7
  29282. 802aeac: d815 bhi.n 802aeda <mem_trim+0xba>
  29283. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  29284. * region that couldn't hold data, but when mem->next gets freed,
  29285. * the 2 regions would be combined, resulting in more free memory */
  29286. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  29287. mem2 = (struct mem *)(void *)&ram[ptr2];
  29288. if (mem2 < lfree) {
  29289. 802aeae: 4811 ldr r0, [pc, #68] ; (802aef4 <mem_trim+0xd4>)
  29290. * Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem
  29291. * ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED').
  29292. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  29293. * region that couldn't hold data, but when mem->next gets freed,
  29294. * the 2 regions would be combined, resulting in more free memory */
  29295. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  29296. 802aeb0: f106 0208 add.w r2, r6, #8
  29297. 802aeb4: 18ad adds r5, r5, r2
  29298. mem2 = (struct mem *)(void *)&ram[ptr2];
  29299. if (mem2 < lfree) {
  29300. 802aeb6: 6807 ldr r7, [r0, #0]
  29301. * Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem
  29302. * ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED').
  29303. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  29304. * region that couldn't hold data, but when mem->next gets freed,
  29305. * the 2 regions would be combined, resulting in more free memory */
  29306. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  29307. 802aeb8: b2ad uxth r5, r5
  29308. mem2 = (struct mem *)(void *)&ram[ptr2];
  29309. 802aeba: 195a adds r2, r3, r5
  29310. if (mem2 < lfree) {
  29311. 802aebc: 42ba cmp r2, r7
  29312. lfree = mem2;
  29313. 802aebe: bf38 it cc
  29314. 802aec0: 6002 strcc r2, [r0, #0]
  29315. }
  29316. mem2->used = 0;
  29317. mem2->next = mem->next;
  29318. 802aec2: 5359 strh r1, [r3, r5]
  29319. ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
  29320. mem2 = (struct mem *)(void *)&ram[ptr2];
  29321. if (mem2 < lfree) {
  29322. lfree = mem2;
  29323. }
  29324. mem2->used = 0;
  29325. 802aec4: 2000 movs r0, #0
  29326. 802aec6: 7110 strb r0, [r2, #4]
  29327. mem2->next = mem->next;
  29328. mem2->prev = ptr;
  29329. 802aec8: 8056 strh r6, [r2, #2]
  29330. mem->next = ptr2;
  29331. 802aeca: f824 5c08 strh.w r5, [r4, #-8]
  29332. if (mem2->next != MEM_SIZE_ALIGNED) {
  29333. 802aece: 5b5a ldrh r2, [r3, r5]
  29334. 802aed0: f5b2 5fa0 cmp.w r2, #5120 ; 0x1400
  29335. ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
  29336. 802aed4: bf1c itt ne
  29337. 802aed6: 189b addne r3, r3, r2
  29338. 802aed8: 805d strhne r5, [r3, #2]
  29339. -> the remaining space stays unused since it is too small
  29340. } */
  29341. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  29342. mem_free_count = 1;
  29343. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29344. LWIP_MEM_FREE_UNPROTECT();
  29345. 802aeda: 4805 ldr r0, [pc, #20] ; (802aef0 <mem_trim+0xd0>)
  29346. 802aedc: f007 fe1c bl 8032b18 <sys_mutex_unlock>
  29347. return rmem;
  29348. 802aee0: e000 b.n 802aee4 <mem_trim+0xc4>
  29349. /* every data block must be at least MIN_SIZE_ALIGNED long */
  29350. newsize = MIN_SIZE_ALIGNED;
  29351. }
  29352. if (newsize > MEM_SIZE_ALIGNED) {
  29353. return NULL;
  29354. 802aee2: 2400 movs r4, #0
  29355. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  29356. mem_free_count = 1;
  29357. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29358. LWIP_MEM_FREE_UNPROTECT();
  29359. return rmem;
  29360. }
  29361. 802aee4: 4620 mov r0, r4
  29362. 802aee6: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  29363. 802aeea: bf00 nop
  29364. 802aeec: 20002a0c .word 0x20002a0c
  29365. 802aef0: 20002a10 .word 0x20002a10
  29366. 802aef4: 20002a08 .word 0x20002a08
  29367. 802aef8: 20002a14 .word 0x20002a14
  29368. 0802aefc <mem_malloc>:
  29369. *
  29370. * Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT).
  29371. */
  29372. void *
  29373. mem_malloc(mem_size_t size)
  29374. {
  29375. 802aefc: b5f8 push {r3, r4, r5, r6, r7, lr}
  29376. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  29377. u8_t local_mem_free_count = 0;
  29378. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29379. LWIP_MEM_ALLOC_DECL_PROTECT();
  29380. if (size == 0) {
  29381. 802aefe: 2800 cmp r0, #0
  29382. 802af00: d056 beq.n 802afb0 <mem_malloc+0xb4>
  29383. return NULL;
  29384. }
  29385. /* Expand the size of the allocated memory region so that we can
  29386. adjust for alignment. */
  29387. size = LWIP_MEM_ALIGN_SIZE(size);
  29388. 802af02: 3003 adds r0, #3
  29389. 802af04: f64f 74fc movw r4, #65532 ; 0xfffc
  29390. 802af08: 4004 ands r4, r0
  29391. if(size < MIN_SIZE_ALIGNED) {
  29392. 802af0a: 2c0b cmp r4, #11
  29393. 802af0c: d903 bls.n 802af16 <mem_malloc+0x1a>
  29394. /* every data block must be at least MIN_SIZE_ALIGNED long */
  29395. size = MIN_SIZE_ALIGNED;
  29396. }
  29397. if (size > MEM_SIZE_ALIGNED) {
  29398. 802af0e: f5b4 5fa0 cmp.w r4, #5120 ; 0x1400
  29399. 802af12: d901 bls.n 802af18 <mem_malloc+0x1c>
  29400. 802af14: e04b b.n 802afae <mem_malloc+0xb2>
  29401. adjust for alignment. */
  29402. size = LWIP_MEM_ALIGN_SIZE(size);
  29403. if(size < MIN_SIZE_ALIGNED) {
  29404. /* every data block must be at least MIN_SIZE_ALIGNED long */
  29405. size = MIN_SIZE_ALIGNED;
  29406. 802af16: 240c movs r4, #12
  29407. if (size > MEM_SIZE_ALIGNED) {
  29408. return NULL;
  29409. }
  29410. /* protect the heap from concurrent access */
  29411. sys_mutex_lock(&mem_mutex);
  29412. 802af18: 4826 ldr r0, [pc, #152] ; (802afb4 <mem_malloc+0xb8>)
  29413. 802af1a: f007 fdf1 bl 8032b00 <sys_mutex_lock>
  29414. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29415. /* Scan through the heap searching for a free block that is big enough,
  29416. * beginning with the lowest free block.
  29417. */
  29418. for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size;
  29419. 802af1e: 4b26 ldr r3, [pc, #152] ; (802afb8 <mem_malloc+0xbc>)
  29420. 802af20: 6819 ldr r1, [r3, #0]
  29421. 802af22: 4b26 ldr r3, [pc, #152] ; (802afbc <mem_malloc+0xc0>)
  29422. 802af24: 681a ldr r2, [r3, #0]
  29423. 802af26: 1a8b subs r3, r1, r2
  29424. 802af28: b29b uxth r3, r3
  29425. 802af2a: f5c4 5ea0 rsb lr, r4, #5120 ; 0x1400
  29426. 802af2e: e039 b.n 802afa4 <mem_malloc+0xa8>
  29427. ptr = ((struct mem *)(void *)&ram[ptr])->next) {
  29428. mem = (struct mem *)(void *)&ram[ptr];
  29429. 802af30: 18d5 adds r5, r2, r3
  29430. local_mem_free_count = 1;
  29431. break;
  29432. }
  29433. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29434. if ((!mem->used) &&
  29435. 802af32: 792f ldrb r7, [r5, #4]
  29436. 802af34: 2f00 cmp r7, #0
  29437. 802af36: d134 bne.n 802afa2 <mem_malloc+0xa6>
  29438. (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) {
  29439. 802af38: 5ad6 ldrh r6, [r2, r3]
  29440. 802af3a: f1a6 0008 sub.w r0, r6, #8
  29441. 802af3e: 1ac0 subs r0, r0, r3
  29442. local_mem_free_count = 1;
  29443. break;
  29444. }
  29445. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29446. if ((!mem->used) &&
  29447. 802af40: 42a0 cmp r0, r4
  29448. 802af42: d32e bcc.n 802afa2 <mem_malloc+0xa6>
  29449. (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) {
  29450. /* mem is not used and at least perfect fit is possible:
  29451. * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */
  29452. if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) {
  29453. 802af44: f104 0e14 add.w lr, r4, #20
  29454. 802af48: 4570 cmp r0, lr
  29455. 802af4a: d310 bcc.n 802af6e <mem_malloc+0x72>
  29456. * struct mem would fit in but no data between mem2 and mem2->next
  29457. * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
  29458. * region that couldn't hold data, but when mem->next gets freed,
  29459. * the 2 regions would be combined, resulting in more free memory
  29460. */
  29461. ptr2 = ptr + SIZEOF_STRUCT_MEM + size;
  29462. 802af4c: 3408 adds r4, #8
  29463. 802af4e: 191c adds r4, r3, r4
  29464. 802af50: b2a4 uxth r4, r4
  29465. /* create mem2 struct */
  29466. mem2 = (struct mem *)(void *)&ram[ptr2];
  29467. 802af52: 1910 adds r0, r2, r4
  29468. mem2->used = 0;
  29469. mem2->next = mem->next;
  29470. 802af54: 5316 strh r6, [r2, r4]
  29471. mem2->prev = ptr;
  29472. 802af56: 8043 strh r3, [r0, #2]
  29473. /* and insert it between mem and mem->next */
  29474. mem->next = ptr2;
  29475. 802af58: 802c strh r4, [r5, #0]
  29476. mem->used = 1;
  29477. 802af5a: 2301 movs r3, #1
  29478. * the 2 regions would be combined, resulting in more free memory
  29479. */
  29480. ptr2 = ptr + SIZEOF_STRUCT_MEM + size;
  29481. /* create mem2 struct */
  29482. mem2 = (struct mem *)(void *)&ram[ptr2];
  29483. mem2->used = 0;
  29484. 802af5c: 7107 strb r7, [r0, #4]
  29485. mem2->next = mem->next;
  29486. mem2->prev = ptr;
  29487. /* and insert it between mem and mem->next */
  29488. mem->next = ptr2;
  29489. mem->used = 1;
  29490. 802af5e: 712b strb r3, [r5, #4]
  29491. if (mem2->next != MEM_SIZE_ALIGNED) {
  29492. 802af60: 5b13 ldrh r3, [r2, r4]
  29493. 802af62: f5b3 5fa0 cmp.w r3, #5120 ; 0x1400
  29494. 802af66: d004 beq.n 802af72 <mem_malloc+0x76>
  29495. ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
  29496. 802af68: 18d2 adds r2, r2, r3
  29497. 802af6a: 8054 strh r4, [r2, #2]
  29498. 802af6c: e001 b.n 802af72 <mem_malloc+0x76>
  29499. * take care of this).
  29500. * -> near fit or excact fit: do not split, no mem2 creation
  29501. * also can't move mem->next directly behind mem, since mem->next
  29502. * will always be used at this point!
  29503. */
  29504. mem->used = 1;
  29505. 802af6e: 2301 movs r3, #1
  29506. 802af70: 712b strb r3, [r5, #4]
  29507. MEM_STATS_INC_USED(used, mem->next - (mem_size_t)((u8_t *)mem - ram));
  29508. }
  29509. #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
  29510. mem_malloc_adjust_lfree:
  29511. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29512. if (mem == lfree) {
  29513. 802af72: 428d cmp r5, r1
  29514. 802af74: d10f bne.n 802af96 <mem_malloc+0x9a>
  29515. struct mem *cur = lfree;
  29516. /* Find next free block after mem and update lowest free pointer */
  29517. while (cur->used && cur != ram_end) {
  29518. 802af76: 4b12 ldr r3, [pc, #72] ; (802afc0 <mem_malloc+0xc4>)
  29519. 802af78: 681a ldr r2, [r3, #0]
  29520. /* If mem_free or mem_trim have run, we have to restart since they
  29521. could have altered our current struct mem or lfree. */
  29522. goto mem_malloc_adjust_lfree;
  29523. }
  29524. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29525. cur = (struct mem *)(void *)&ram[cur->next];
  29526. 802af7a: 4b10 ldr r3, [pc, #64] ; (802afbc <mem_malloc+0xc0>)
  29527. 802af7c: 6819 ldr r1, [r3, #0]
  29528. 802af7e: 462b mov r3, r5
  29529. 802af80: e001 b.n 802af86 <mem_malloc+0x8a>
  29530. 802af82: 881b ldrh r3, [r3, #0]
  29531. 802af84: 18cb adds r3, r1, r3
  29532. mem_malloc_adjust_lfree:
  29533. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29534. if (mem == lfree) {
  29535. struct mem *cur = lfree;
  29536. /* Find next free block after mem and update lowest free pointer */
  29537. while (cur->used && cur != ram_end) {
  29538. 802af86: 7918 ldrb r0, [r3, #4]
  29539. 802af88: b910 cbnz r0, 802af90 <mem_malloc+0x94>
  29540. goto mem_malloc_adjust_lfree;
  29541. }
  29542. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29543. cur = (struct mem *)(void *)&ram[cur->next];
  29544. }
  29545. lfree = cur;
  29546. 802af8a: 4a0b ldr r2, [pc, #44] ; (802afb8 <mem_malloc+0xbc>)
  29547. 802af8c: 6013 str r3, [r2, #0]
  29548. 802af8e: e002 b.n 802af96 <mem_malloc+0x9a>
  29549. mem_malloc_adjust_lfree:
  29550. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29551. if (mem == lfree) {
  29552. struct mem *cur = lfree;
  29553. /* Find next free block after mem and update lowest free pointer */
  29554. while (cur->used && cur != ram_end) {
  29555. 802af90: 4293 cmp r3, r2
  29556. 802af92: d1f6 bne.n 802af82 <mem_malloc+0x86>
  29557. 802af94: e7f9 b.n 802af8a <mem_malloc+0x8e>
  29558. }
  29559. lfree = cur;
  29560. LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used)));
  29561. }
  29562. LWIP_MEM_ALLOC_UNPROTECT();
  29563. sys_mutex_unlock(&mem_mutex);
  29564. 802af96: 4807 ldr r0, [pc, #28] ; (802afb4 <mem_malloc+0xb8>)
  29565. 802af98: f007 fdbe bl 8032b18 <sys_mutex_unlock>
  29566. LWIP_ASSERT("mem_malloc: allocated memory properly aligned.",
  29567. ((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0);
  29568. LWIP_ASSERT("mem_malloc: sanity check alignment",
  29569. (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0);
  29570. return (u8_t *)mem + SIZEOF_STRUCT_MEM;
  29571. 802af9c: f105 0008 add.w r0, r5, #8
  29572. 802afa0: bdf8 pop {r3, r4, r5, r6, r7, pc}
  29573. /* Scan through the heap searching for a free block that is big enough,
  29574. * beginning with the lowest free block.
  29575. */
  29576. for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size;
  29577. ptr = ((struct mem *)(void *)&ram[ptr])->next) {
  29578. 802afa2: 882b ldrh r3, [r5, #0]
  29579. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29580. /* Scan through the heap searching for a free block that is big enough,
  29581. * beginning with the lowest free block.
  29582. */
  29583. for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size;
  29584. 802afa4: 4573 cmp r3, lr
  29585. 802afa6: dbc3 blt.n 802af30 <mem_malloc+0x34>
  29586. } while(local_mem_free_count != 0);
  29587. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29588. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size));
  29589. MEM_STATS_INC(err);
  29590. LWIP_MEM_ALLOC_UNPROTECT();
  29591. sys_mutex_unlock(&mem_mutex);
  29592. 802afa8: 4802 ldr r0, [pc, #8] ; (802afb4 <mem_malloc+0xb8>)
  29593. 802afaa: f007 fdb5 bl 8032b18 <sys_mutex_unlock>
  29594. u8_t local_mem_free_count = 0;
  29595. #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
  29596. LWIP_MEM_ALLOC_DECL_PROTECT();
  29597. if (size == 0) {
  29598. return NULL;
  29599. 802afae: 2000 movs r0, #0
  29600. LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size));
  29601. MEM_STATS_INC(err);
  29602. LWIP_MEM_ALLOC_UNPROTECT();
  29603. sys_mutex_unlock(&mem_mutex);
  29604. return NULL;
  29605. }
  29606. 802afb0: bdf8 pop {r3, r4, r5, r6, r7, pc}
  29607. 802afb2: bf00 nop
  29608. 802afb4: 20002a10 .word 0x20002a10
  29609. 802afb8: 20002a08 .word 0x20002a08
  29610. 802afbc: 20002a14 .word 0x20002a14
  29611. 802afc0: 20002a0c .word 0x20002a0c
  29612. 0802afc4 <memp_init>:
  29613. MEMP_STATS_AVAIL(err, i, 0);
  29614. MEMP_STATS_AVAIL(avail, i, memp_num[i]);
  29615. }
  29616. #if !MEMP_SEPARATE_POOLS
  29617. memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);
  29618. 802afc4: 4a0e ldr r2, [pc, #56] ; (802b000 <memp_init+0x3c>)
  29619. 802afc6: 490f ldr r1, [pc, #60] ; (802b004 <memp_init+0x40>)
  29620. *
  29621. * Carves out memp_memory into linked lists for each pool-type.
  29622. */
  29623. void
  29624. memp_init(void)
  29625. {
  29626. 802afc8: b5f0 push {r4, r5, r6, r7, lr}
  29627. MEMP_STATS_AVAIL(err, i, 0);
  29628. MEMP_STATS_AVAIL(avail, i, memp_num[i]);
  29629. }
  29630. #if !MEMP_SEPARATE_POOLS
  29631. memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);
  29632. 802afca: 2300 movs r3, #0
  29633. memp_tab[i] = NULL;
  29634. #if MEMP_SEPARATE_POOLS
  29635. memp = (struct memp*)memp_bases[i];
  29636. #endif /* MEMP_SEPARATE_POOLS */
  29637. /* create a linked list of memp elements */
  29638. for (j = 0; j < memp_num[i]; ++j) {
  29639. 802afcc: 4e0e ldr r6, [pc, #56] ; (802b008 <memp_init+0x44>)
  29640. memp->next = memp_tab[i];
  29641. memp_tab[i] = memp;
  29642. memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]
  29643. 802afce: 4f0f ldr r7, [pc, #60] ; (802b00c <memp_init+0x48>)
  29644. MEMP_STATS_AVAIL(err, i, 0);
  29645. MEMP_STATS_AVAIL(avail, i, memp_num[i]);
  29646. }
  29647. #if !MEMP_SEPARATE_POOLS
  29648. memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);
  29649. 802afd0: f022 0203 bic.w r2, r2, #3
  29650. #endif /* !MEMP_SEPARATE_POOLS */
  29651. /* for every pool: */
  29652. for (i = 0; i < MEMP_MAX; ++i) {
  29653. memp_tab[i] = NULL;
  29654. 802afd4: 461d mov r5, r3
  29655. 802afd6: f841 5b04 str.w r5, [r1], #4
  29656. #if MEMP_SEPARATE_POOLS
  29657. memp = (struct memp*)memp_bases[i];
  29658. #endif /* MEMP_SEPARATE_POOLS */
  29659. /* create a linked list of memp elements */
  29660. for (j = 0; j < memp_num[i]; ++j) {
  29661. 802afda: f833 c006 ldrh.w ip, [r3, r6]
  29662. 802afde: 2000 movs r0, #0
  29663. 802afe0: e008 b.n 802aff4 <memp_init+0x30>
  29664. memp->next = memp_tab[i];
  29665. 802afe2: f851 4c04 ldr.w r4, [r1, #-4]
  29666. 802afe6: 6014 str r4, [r2, #0]
  29667. memp_tab[i] = memp;
  29668. memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]
  29669. 802afe8: 5bdc ldrh r4, [r3, r7]
  29670. memp = (struct memp*)memp_bases[i];
  29671. #endif /* MEMP_SEPARATE_POOLS */
  29672. /* create a linked list of memp elements */
  29673. for (j = 0; j < memp_num[i]; ++j) {
  29674. memp->next = memp_tab[i];
  29675. memp_tab[i] = memp;
  29676. 802afea: f841 2c04 str.w r2, [r1, #-4]
  29677. memp_tab[i] = NULL;
  29678. #if MEMP_SEPARATE_POOLS
  29679. memp = (struct memp*)memp_bases[i];
  29680. #endif /* MEMP_SEPARATE_POOLS */
  29681. /* create a linked list of memp elements */
  29682. for (j = 0; j < memp_num[i]; ++j) {
  29683. 802afee: 3001 adds r0, #1
  29684. memp->next = memp_tab[i];
  29685. memp_tab[i] = memp;
  29686. memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]
  29687. 802aff0: 1912 adds r2, r2, r4
  29688. memp_tab[i] = NULL;
  29689. #if MEMP_SEPARATE_POOLS
  29690. memp = (struct memp*)memp_bases[i];
  29691. #endif /* MEMP_SEPARATE_POOLS */
  29692. /* create a linked list of memp elements */
  29693. for (j = 0; j < memp_num[i]; ++j) {
  29694. 802aff2: b280 uxth r0, r0
  29695. 802aff4: 4560 cmp r0, ip
  29696. 802aff6: d1f4 bne.n 802afe2 <memp_init+0x1e>
  29697. 802aff8: 3302 adds r3, #2
  29698. #if !MEMP_SEPARATE_POOLS
  29699. memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory);
  29700. #endif /* !MEMP_SEPARATE_POOLS */
  29701. /* for every pool: */
  29702. for (i = 0; i < MEMP_MAX; ++i) {
  29703. 802affa: 2b20 cmp r3, #32
  29704. 802affc: d1eb bne.n 802afd6 <memp_init+0x12>
  29705. #if MEMP_OVERFLOW_CHECK
  29706. memp_overflow_init();
  29707. /* check everything a first time to see if it worked */
  29708. memp_overflow_check_all();
  29709. #endif /* MEMP_OVERFLOW_CHECK */
  29710. }
  29711. 802affe: bdf0 pop {r4, r5, r6, r7, pc}
  29712. 802b000: 20002a1b .word 0x20002a1b
  29713. 802b004: 2000e058 .word 0x2000e058
  29714. 802b008: 0803ab94 .word 0x0803ab94
  29715. 802b00c: 0803abb4 .word 0x0803abb4
  29716. 0802b010 <memp_malloc>:
  29717. #endif
  29718. {
  29719. struct memp *memp;
  29720. SYS_ARCH_DECL_PROTECT(old_level);
  29721. LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
  29722. 802b010: 280f cmp r0, #15
  29723. #if !MEMP_OVERFLOW_CHECK
  29724. memp_malloc(memp_t type)
  29725. #else
  29726. memp_malloc_fn(memp_t type, const char* file, const int line)
  29727. #endif
  29728. {
  29729. 802b012: b538 push {r3, r4, r5, lr}
  29730. 802b014: 4605 mov r5, r0
  29731. struct memp *memp;
  29732. SYS_ARCH_DECL_PROTECT(old_level);
  29733. LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
  29734. 802b016: d80b bhi.n 802b030 <memp_malloc+0x20>
  29735. SYS_ARCH_PROTECT(old_level);
  29736. 802b018: f007 fd9e bl 8032b58 <sys_arch_protect>
  29737. #if MEMP_OVERFLOW_CHECK >= 2
  29738. memp_overflow_check_all();
  29739. #endif /* MEMP_OVERFLOW_CHECK >= 2 */
  29740. memp = memp_tab[type];
  29741. 802b01c: 4b06 ldr r3, [pc, #24] ; (802b038 <memp_malloc+0x28>)
  29742. 802b01e: f853 4025 ldr.w r4, [r3, r5, lsl #2]
  29743. if (memp != NULL) {
  29744. 802b022: b114 cbz r4, 802b02a <memp_malloc+0x1a>
  29745. memp_tab[type] = memp->next;
  29746. 802b024: 6822 ldr r2, [r4, #0]
  29747. 802b026: f843 2025 str.w r2, [r3, r5, lsl #2]
  29748. } else {
  29749. LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", memp_desc[type]));
  29750. MEMP_STATS_INC(err, type);
  29751. }
  29752. SYS_ARCH_UNPROTECT(old_level);
  29753. 802b02a: f007 fd9f bl 8032b6c <sys_arch_unprotect>
  29754. return memp;
  29755. 802b02e: e000 b.n 802b032 <memp_malloc+0x22>
  29756. #endif
  29757. {
  29758. struct memp *memp;
  29759. SYS_ARCH_DECL_PROTECT(old_level);
  29760. LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
  29761. 802b030: 2400 movs r4, #0
  29762. }
  29763. SYS_ARCH_UNPROTECT(old_level);
  29764. return memp;
  29765. }
  29766. 802b032: 4620 mov r0, r4
  29767. 802b034: bd38 pop {r3, r4, r5, pc}
  29768. 802b036: bf00 nop
  29769. 802b038: 2000e058 .word 0x2000e058
  29770. 0802b03c <memp_free>:
  29771. * @param type the pool where to put mem
  29772. * @param mem the memp element to free
  29773. */
  29774. void
  29775. memp_free(memp_t type, void *mem)
  29776. {
  29777. 802b03c: b538 push {r3, r4, r5, lr}
  29778. 802b03e: 4605 mov r5, r0
  29779. struct memp *memp;
  29780. SYS_ARCH_DECL_PROTECT(old_level);
  29781. if (mem == NULL) {
  29782. 802b040: 460c mov r4, r1
  29783. 802b042: b159 cbz r1, 802b05c <memp_free+0x20>
  29784. LWIP_ASSERT("memp_free: mem properly aligned",
  29785. ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0);
  29786. memp = (struct memp *)(void *)((u8_t*)mem - MEMP_SIZE);
  29787. SYS_ARCH_PROTECT(old_level);
  29788. 802b044: f007 fd88 bl 8032b58 <sys_arch_protect>
  29789. #endif /* MEMP_OVERFLOW_CHECK >= 2 */
  29790. #endif /* MEMP_OVERFLOW_CHECK */
  29791. MEMP_STATS_DEC(used, type);
  29792. memp->next = memp_tab[type];
  29793. 802b048: 4b05 ldr r3, [pc, #20] ; (802b060 <memp_free+0x24>)
  29794. 802b04a: f853 2025 ldr.w r2, [r3, r5, lsl #2]
  29795. 802b04e: 6022 str r2, [r4, #0]
  29796. memp_tab[type] = memp;
  29797. 802b050: f843 4025 str.w r4, [r3, r5, lsl #2]
  29798. #if MEMP_SANITY_CHECK
  29799. LWIP_ASSERT("memp sanity", memp_sanity());
  29800. #endif /* MEMP_SANITY_CHECK */
  29801. SYS_ARCH_UNPROTECT(old_level);
  29802. }
  29803. 802b054: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  29804. #if MEMP_SANITY_CHECK
  29805. LWIP_ASSERT("memp sanity", memp_sanity());
  29806. #endif /* MEMP_SANITY_CHECK */
  29807. SYS_ARCH_UNPROTECT(old_level);
  29808. 802b058: f007 bd88 b.w 8032b6c <sys_arch_unprotect>
  29809. 802b05c: bd38 pop {r3, r4, r5, pc}
  29810. 802b05e: bf00 nop
  29811. 802b060: 2000e058 .word 0x2000e058
  29812. 0802b064 <netif_init>:
  29813. }
  29814. #endif /* LWIP_HAVE_LOOPIF */
  29815. void
  29816. netif_init(void)
  29817. {
  29818. 802b064: 4770 bx lr
  29819. 802b066: 0000 movs r0, r0
  29820. 0802b068 <netif_set_ipaddr>:
  29821. * @note call netif_set_addr() if you also want to change netmask and
  29822. * default gateway
  29823. */
  29824. void
  29825. netif_set_ipaddr(struct netif *netif, ip_addr_t *ipaddr)
  29826. {
  29827. 802b068: b570 push {r4, r5, r6, lr}
  29828. 802b06a: 4604 mov r4, r0
  29829. #if LWIP_TCP
  29830. struct tcp_pcb *pcb;
  29831. struct tcp_pcb_listen *lpcb;
  29832. /* address is actually being changed? */
  29833. if (ipaddr && (ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) {
  29834. 802b06c: 460d mov r5, r1
  29835. 802b06e: b941 cbnz r1, 802b082 <netif_set_ipaddr+0x1a>
  29836. ip_addr_set(&(lpcb->local_ip), ipaddr);
  29837. }
  29838. }
  29839. }
  29840. #endif
  29841. snmp_delete_ipaddridx_tree(netif);
  29842. 802b070: 4620 mov r0, r4
  29843. 802b072: f004 fd99 bl 802fba8 <snmp_delete_ipaddridx_tree>
  29844. snmp_delete_iprteidx_tree(0,netif);
  29845. 802b076: 2000 movs r0, #0
  29846. 802b078: 4621 mov r1, r4
  29847. 802b07a: f004 fe2b bl 802fcd4 <snmp_delete_iprteidx_tree>
  29848. /* set new IP address to netif */
  29849. ip_addr_set(&(netif->ip_addr), ipaddr);
  29850. 802b07e: b9fd cbnz r5, 802b0c0 <netif_set_ipaddr+0x58>
  29851. 802b080: e01f b.n 802b0c2 <netif_set_ipaddr+0x5a>
  29852. #if LWIP_TCP
  29853. struct tcp_pcb *pcb;
  29854. struct tcp_pcb_listen *lpcb;
  29855. /* address is actually being changed? */
  29856. if (ipaddr && (ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) {
  29857. 802b082: 680a ldr r2, [r1, #0]
  29858. 802b084: 6843 ldr r3, [r0, #4]
  29859. 802b086: 429a cmp r2, r3
  29860. 802b088: d0f2 beq.n 802b070 <netif_set_ipaddr+0x8>
  29861. /* extern struct tcp_pcb *tcp_active_pcbs; defined by tcp.h */
  29862. LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n"));
  29863. pcb = tcp_active_pcbs;
  29864. 802b08a: 4b13 ldr r3, [pc, #76] ; (802b0d8 <netif_set_ipaddr+0x70>)
  29865. 802b08c: 6818 ldr r0, [r3, #0]
  29866. while (pcb != NULL) {
  29867. 802b08e: e007 b.n 802b0a0 <netif_set_ipaddr+0x38>
  29868. /* PCB bound to current local interface address? */
  29869. if (ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))
  29870. 802b090: 6802 ldr r2, [r0, #0]
  29871. 802b092: 6863 ldr r3, [r4, #4]
  29872. 802b094: 68c6 ldr r6, [r0, #12]
  29873. 802b096: 429a cmp r2, r3
  29874. 802b098: d101 bne.n 802b09e <netif_set_ipaddr+0x36>
  29875. #endif /* LWIP_AUTOIP */
  29876. ) {
  29877. /* this connection must be aborted */
  29878. struct tcp_pcb *next = pcb->next;
  29879. LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: aborting TCP pcb %p\n", (void *)pcb));
  29880. tcp_abort(pcb);
  29881. 802b09a: f000 fd89 bl 802bbb0 <tcp_abort>
  29882. pcb = next;
  29883. } else {
  29884. pcb = pcb->next;
  29885. 802b09e: 4630 mov r0, r6
  29886. /* address is actually being changed? */
  29887. if (ipaddr && (ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) {
  29888. /* extern struct tcp_pcb *tcp_active_pcbs; defined by tcp.h */
  29889. LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n"));
  29890. pcb = tcp_active_pcbs;
  29891. while (pcb != NULL) {
  29892. 802b0a0: 2800 cmp r0, #0
  29893. 802b0a2: d1f5 bne.n 802b090 <netif_set_ipaddr+0x28>
  29894. pcb = next;
  29895. } else {
  29896. pcb = pcb->next;
  29897. }
  29898. }
  29899. for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  29900. 802b0a4: 4b0d ldr r3, [pc, #52] ; (802b0dc <netif_set_ipaddr+0x74>)
  29901. 802b0a6: 681b ldr r3, [r3, #0]
  29902. 802b0a8: e007 b.n 802b0ba <netif_set_ipaddr+0x52>
  29903. /* PCB bound to current local interface address? */
  29904. if ((!(ip_addr_isany(&(lpcb->local_ip)))) &&
  29905. 802b0aa: 681a ldr r2, [r3, #0]
  29906. 802b0ac: b122 cbz r2, 802b0b8 <netif_set_ipaddr+0x50>
  29907. 802b0ae: 6861 ldr r1, [r4, #4]
  29908. 802b0b0: 428a cmp r2, r1
  29909. (ip_addr_cmp(&(lpcb->local_ip), &(netif->ip_addr)))) {
  29910. /* The PCB is listening to the old ipaddr and
  29911. * is set to listen to the new one instead */
  29912. ip_addr_set(&(lpcb->local_ip), ipaddr);
  29913. 802b0b2: bf04 itt eq
  29914. 802b0b4: 682a ldreq r2, [r5, #0]
  29915. 802b0b6: 601a streq r2, [r3, #0]
  29916. pcb = next;
  29917. } else {
  29918. pcb = pcb->next;
  29919. }
  29920. }
  29921. for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  29922. 802b0b8: 68db ldr r3, [r3, #12]
  29923. 802b0ba: 2b00 cmp r3, #0
  29924. 802b0bc: d1f5 bne.n 802b0aa <netif_set_ipaddr+0x42>
  29925. 802b0be: e7d7 b.n 802b070 <netif_set_ipaddr+0x8>
  29926. }
  29927. #endif
  29928. snmp_delete_ipaddridx_tree(netif);
  29929. snmp_delete_iprteidx_tree(0,netif);
  29930. /* set new IP address to netif */
  29931. ip_addr_set(&(netif->ip_addr), ipaddr);
  29932. 802b0c0: 682d ldr r5, [r5, #0]
  29933. snmp_insert_ipaddridx_tree(netif);
  29934. 802b0c2: 4620 mov r0, r4
  29935. }
  29936. #endif
  29937. snmp_delete_ipaddridx_tree(netif);
  29938. snmp_delete_iprteidx_tree(0,netif);
  29939. /* set new IP address to netif */
  29940. ip_addr_set(&(netif->ip_addr), ipaddr);
  29941. 802b0c4: 6065 str r5, [r4, #4]
  29942. snmp_insert_ipaddridx_tree(netif);
  29943. 802b0c6: f004 fd2d bl 802fb24 <snmp_insert_ipaddridx_tree>
  29944. snmp_insert_iprteidx_tree(0,netif);
  29945. 802b0ca: 2000 movs r0, #0
  29946. 802b0cc: 4621 mov r1, r4
  29947. netif->name[0], netif->name[1],
  29948. ip4_addr1_16(&netif->ip_addr),
  29949. ip4_addr2_16(&netif->ip_addr),
  29950. ip4_addr3_16(&netif->ip_addr),
  29951. ip4_addr4_16(&netif->ip_addr)));
  29952. }
  29953. 802b0ce: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
  29954. snmp_delete_ipaddridx_tree(netif);
  29955. snmp_delete_iprteidx_tree(0,netif);
  29956. /* set new IP address to netif */
  29957. ip_addr_set(&(netif->ip_addr), ipaddr);
  29958. snmp_insert_ipaddridx_tree(netif);
  29959. snmp_insert_iprteidx_tree(0,netif);
  29960. 802b0d2: f004 bdb3 b.w 802fc3c <snmp_insert_iprteidx_tree>
  29961. 802b0d6: bf00 nop
  29962. 802b0d8: 20010d78 .word 0x20010d78
  29963. 802b0dc: 20010d80 .word 0x20010d80
  29964. 0802b0e0 <netif_set_gw>:
  29965. * @note call netif_set_addr() if you also want to change ip address and netmask
  29966. */
  29967. void
  29968. netif_set_gw(struct netif *netif, ip_addr_t *gw)
  29969. {
  29970. ip_addr_set(&(netif->gw), gw);
  29971. 802b0e0: b101 cbz r1, 802b0e4 <netif_set_gw+0x4>
  29972. 802b0e2: 6809 ldr r1, [r1, #0]
  29973. 802b0e4: 60c1 str r1, [r0, #12]
  29974. 802b0e6: 4770 bx lr
  29975. 0802b0e8 <netif_set_netmask>:
  29976. * @note call netif_set_addr() if you also want to change ip address and
  29977. * default gateway
  29978. */
  29979. void
  29980. netif_set_netmask(struct netif *netif, ip_addr_t *netmask)
  29981. {
  29982. 802b0e8: b538 push {r3, r4, r5, lr}
  29983. 802b0ea: 4604 mov r4, r0
  29984. 802b0ec: 460d mov r5, r1
  29985. snmp_delete_iprteidx_tree(0, netif);
  29986. 802b0ee: 2000 movs r0, #0
  29987. 802b0f0: 4621 mov r1, r4
  29988. 802b0f2: f004 fdef bl 802fcd4 <snmp_delete_iprteidx_tree>
  29989. /* set new netmask to netif */
  29990. ip_addr_set(&(netif->netmask), netmask);
  29991. 802b0f6: b105 cbz r5, 802b0fa <netif_set_netmask+0x12>
  29992. 802b0f8: 682d ldr r5, [r5, #0]
  29993. snmp_insert_iprteidx_tree(0, netif);
  29994. 802b0fa: 2000 movs r0, #0
  29995. 802b0fc: 4621 mov r1, r4
  29996. void
  29997. netif_set_netmask(struct netif *netif, ip_addr_t *netmask)
  29998. {
  29999. snmp_delete_iprteidx_tree(0, netif);
  30000. /* set new netmask to netif */
  30001. ip_addr_set(&(netif->netmask), netmask);
  30002. 802b0fe: 60a5 str r5, [r4, #8]
  30003. netif->name[0], netif->name[1],
  30004. ip4_addr1_16(&netif->netmask),
  30005. ip4_addr2_16(&netif->netmask),
  30006. ip4_addr3_16(&netif->netmask),
  30007. ip4_addr4_16(&netif->netmask)));
  30008. }
  30009. 802b100: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  30010. netif_set_netmask(struct netif *netif, ip_addr_t *netmask)
  30011. {
  30012. snmp_delete_iprteidx_tree(0, netif);
  30013. /* set new netmask to netif */
  30014. ip_addr_set(&(netif->netmask), netmask);
  30015. snmp_insert_iprteidx_tree(0, netif);
  30016. 802b104: f004 bd9a b.w 802fc3c <snmp_insert_iprteidx_tree>
  30017. 0802b108 <netif_set_addr>:
  30018. * @param gw the new default gateway
  30019. */
  30020. void
  30021. netif_set_addr(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
  30022. ip_addr_t *gw)
  30023. {
  30024. 802b108: b570 push {r4, r5, r6, lr}
  30025. 802b10a: 4605 mov r5, r0
  30026. 802b10c: 4616 mov r6, r2
  30027. 802b10e: 461c mov r4, r3
  30028. netif_set_ipaddr(netif, ipaddr);
  30029. 802b110: f7ff ffaa bl 802b068 <netif_set_ipaddr>
  30030. netif_set_netmask(netif, netmask);
  30031. 802b114: 4628 mov r0, r5
  30032. 802b116: 4631 mov r1, r6
  30033. 802b118: f7ff ffe6 bl 802b0e8 <netif_set_netmask>
  30034. * @note call netif_set_addr() if you also want to change ip address and netmask
  30035. */
  30036. void
  30037. netif_set_gw(struct netif *netif, ip_addr_t *gw)
  30038. {
  30039. ip_addr_set(&(netif->gw), gw);
  30040. 802b11c: b104 cbz r4, 802b120 <netif_set_addr+0x18>
  30041. 802b11e: 6824 ldr r4, [r4, #0]
  30042. 802b120: 60ec str r4, [r5, #12]
  30043. 802b122: bd70 pop {r4, r5, r6, pc}
  30044. 0802b124 <netif_add>:
  30045. * @return netif, or NULL if failed.
  30046. */
  30047. struct netif *
  30048. netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
  30049. ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input)
  30050. {
  30051. 802b124: b5f8 push {r3, r4, r5, r6, r7, lr}
  30052. netif->loop_first = NULL;
  30053. netif->loop_last = NULL;
  30054. #endif /* ENABLE_LOOPBACK */
  30055. /* remember netif specific state information data */
  30056. netif->state = state;
  30057. 802b126: 9e06 ldr r6, [sp, #24]
  30058. 802b128: 61c6 str r6, [r0, #28]
  30059. netif->num = netif_num++;
  30060. 802b12a: 4e10 ldr r6, [pc, #64] ; (802b16c <netif_add+0x48>)
  30061. 802b12c: 7837 ldrb r7, [r6, #0]
  30062. 802b12e: f880 7030 strb.w r7, [r0, #48] ; 0x30
  30063. 802b132: 3701 adds r7, #1
  30064. 802b134: 7037 strb r7, [r6, #0]
  30065. netif->input = input;
  30066. 802b136: 9e08 ldr r6, [sp, #32]
  30067. {
  30068. LWIP_ASSERT("No init function given", init != NULL);
  30069. /* reset new interface configuration state */
  30070. ip_addr_set_zero(&netif->ip_addr);
  30071. 802b138: 2500 movs r5, #0
  30072. * @return netif, or NULL if failed.
  30073. */
  30074. struct netif *
  30075. netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
  30076. ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input)
  30077. {
  30078. 802b13a: 4604 mov r4, r0
  30079. LWIP_ASSERT("No init function given", init != NULL);
  30080. /* reset new interface configuration state */
  30081. ip_addr_set_zero(&netif->ip_addr);
  30082. 802b13c: 6045 str r5, [r0, #4]
  30083. ip_addr_set_zero(&netif->netmask);
  30084. 802b13e: 6085 str r5, [r0, #8]
  30085. ip_addr_set_zero(&netif->gw);
  30086. 802b140: 60c5 str r5, [r0, #12]
  30087. netif->flags = 0;
  30088. 802b142: f880 502d strb.w r5, [r0, #45] ; 0x2d
  30089. #if LWIP_DHCP
  30090. /* netif not under DHCP control by default */
  30091. netif->dhcp = NULL;
  30092. 802b146: 6205 str r5, [r0, #32]
  30093. #endif /* ENABLE_LOOPBACK */
  30094. /* remember netif specific state information data */
  30095. netif->state = state;
  30096. netif->num = netif_num++;
  30097. netif->input = input;
  30098. 802b148: 6106 str r6, [r0, #16]
  30099. NETIF_SET_HWADDRHINT(netif, NULL);
  30100. #if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS
  30101. netif->loop_cnt_current = 0;
  30102. #endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */
  30103. netif_set_addr(netif, ipaddr, netmask, gw);
  30104. 802b14a: f7ff ffdd bl 802b108 <netif_set_addr>
  30105. /* call user specified initialization function for netif */
  30106. if (init(netif) != ERR_OK) {
  30107. 802b14e: 4620 mov r0, r4
  30108. 802b150: 9b07 ldr r3, [sp, #28]
  30109. 802b152: 4798 blx r3
  30110. 802b154: b930 cbnz r0, 802b164 <netif_add+0x40>
  30111. return NULL;
  30112. }
  30113. /* add this netif to the list */
  30114. netif->next = netif_list;
  30115. 802b156: 4b06 ldr r3, [pc, #24] ; (802b170 <netif_add+0x4c>)
  30116. 802b158: 681a ldr r2, [r3, #0]
  30117. 802b15a: 6022 str r2, [r4, #0]
  30118. netif_list = netif;
  30119. 802b15c: 601c str r4, [r3, #0]
  30120. snmp_inc_iflist();
  30121. 802b15e: f004 fbc5 bl 802f8ec <snmp_inc_iflist>
  30122. LWIP_DEBUGF(NETIF_DEBUG, (" netmask "));
  30123. ip_addr_debug_print(NETIF_DEBUG, netmask);
  30124. LWIP_DEBUGF(NETIF_DEBUG, (" gw "));
  30125. ip_addr_debug_print(NETIF_DEBUG, gw);
  30126. LWIP_DEBUGF(NETIF_DEBUG, ("\n"));
  30127. return netif;
  30128. 802b162: e000 b.n 802b166 <netif_add+0x42>
  30129. netif_set_addr(netif, ipaddr, netmask, gw);
  30130. /* call user specified initialization function for netif */
  30131. if (init(netif) != ERR_OK) {
  30132. return NULL;
  30133. 802b164: 462c mov r4, r5
  30134. ip_addr_debug_print(NETIF_DEBUG, netmask);
  30135. LWIP_DEBUGF(NETIF_DEBUG, (" gw "));
  30136. ip_addr_debug_print(NETIF_DEBUG, gw);
  30137. LWIP_DEBUGF(NETIF_DEBUG, ("\n"));
  30138. return netif;
  30139. }
  30140. 802b166: 4620 mov r0, r4
  30141. 802b168: bdf8 pop {r3, r4, r5, r6, r7, pc}
  30142. 802b16a: bf00 nop
  30143. 802b16c: 2000e098 .word 0x2000e098
  30144. 802b170: 20010d6c .word 0x20010d6c
  30145. 0802b174 <netif_set_default>:
  30146. *
  30147. * @param netif the default network interface
  30148. */
  30149. void
  30150. netif_set_default(struct netif *netif)
  30151. {
  30152. 802b174: b510 push {r4, lr}
  30153. if (netif == NULL) {
  30154. 802b176: 4604 mov r4, r0
  30155. /* remove default route */
  30156. snmp_delete_iprteidx_tree(1, netif);
  30157. 802b178: 4621 mov r1, r4
  30158. 802b17a: 2001 movs r0, #1
  30159. * @param netif the default network interface
  30160. */
  30161. void
  30162. netif_set_default(struct netif *netif)
  30163. {
  30164. if (netif == NULL) {
  30165. 802b17c: b914 cbnz r4, 802b184 <netif_set_default+0x10>
  30166. /* remove default route */
  30167. snmp_delete_iprteidx_tree(1, netif);
  30168. 802b17e: f004 fda9 bl 802fcd4 <snmp_delete_iprteidx_tree>
  30169. 802b182: e001 b.n 802b188 <netif_set_default+0x14>
  30170. } else {
  30171. /* install default route */
  30172. snmp_insert_iprteidx_tree(1, netif);
  30173. 802b184: f004 fd5a bl 802fc3c <snmp_insert_iprteidx_tree>
  30174. }
  30175. netif_default = netif;
  30176. 802b188: 4b01 ldr r3, [pc, #4] ; (802b190 <netif_set_default+0x1c>)
  30177. 802b18a: 601c str r4, [r3, #0]
  30178. 802b18c: bd10 pop {r4, pc}
  30179. 802b18e: bf00 nop
  30180. 802b190: 20010d70 .word 0x20010d70
  30181. 0802b194 <netif_set_up>:
  30182. * up once configured.
  30183. *
  30184. * @see dhcp_start()
  30185. */
  30186. void netif_set_up(struct netif *netif)
  30187. {
  30188. 802b194: b510 push {r4, lr}
  30189. if (!(netif->flags & NETIF_FLAG_UP)) {
  30190. 802b196: f890 302d ldrb.w r3, [r0, #45] ; 0x2d
  30191. 802b19a: 07da lsls r2, r3, #31
  30192. * up once configured.
  30193. *
  30194. * @see dhcp_start()
  30195. */
  30196. void netif_set_up(struct netif *netif)
  30197. {
  30198. 802b19c: 4604 mov r4, r0
  30199. if (!(netif->flags & NETIF_FLAG_UP)) {
  30200. 802b19e: d412 bmi.n 802b1c6 <netif_set_up+0x32>
  30201. netif->flags |= NETIF_FLAG_UP;
  30202. 802b1a0: f043 0301 orr.w r3, r3, #1
  30203. 802b1a4: f880 302d strb.w r3, [r0, #45] ; 0x2d
  30204. #if LWIP_SNMP
  30205. snmp_get_sysuptime(&netif->ts);
  30206. 802b1a8: 3038 adds r0, #56 ; 0x38
  30207. 802b1aa: f004 fb43 bl 802f834 <snmp_get_sysuptime>
  30208. * @note: Enabling DHCP on a down interface will make it come
  30209. * up once configured.
  30210. *
  30211. * @see dhcp_start()
  30212. */
  30213. void netif_set_up(struct netif *netif)
  30214. 802b1ae: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  30215. NETIF_STATUS_CALLBACK(netif);
  30216. if (netif->flags & NETIF_FLAG_LINK_UP) {
  30217. #if LWIP_ARP
  30218. /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */
  30219. if (netif->flags & (NETIF_FLAG_ETHARP)) {
  30220. 802b1b2: f003 0330 and.w r3, r3, #48 ; 0x30
  30221. 802b1b6: 2b30 cmp r3, #48 ; 0x30
  30222. 802b1b8: d105 bne.n 802b1c6 <netif_set_up+0x32>
  30223. etharp_gratuitous(netif);
  30224. 802b1ba: 4620 mov r0, r4
  30225. 802b1bc: 1d21 adds r1, r4, #4
  30226. igmp_report_groups( netif);
  30227. }
  30228. #endif /* LWIP_IGMP */
  30229. }
  30230. }
  30231. }
  30232. 802b1be: e8bd 4010 ldmia.w sp!, {r4, lr}
  30233. if (netif->flags & NETIF_FLAG_LINK_UP) {
  30234. #if LWIP_ARP
  30235. /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */
  30236. if (netif->flags & (NETIF_FLAG_ETHARP)) {
  30237. etharp_gratuitous(netif);
  30238. 802b1c2: f007 b87d b.w 80322c0 <etharp_request>
  30239. 802b1c6: bd10 pop {r4, pc}
  30240. 0802b1c8 <netif_set_down>:
  30241. * up once configured.
  30242. *
  30243. * @see dhcp_start()
  30244. */
  30245. void netif_set_down(struct netif *netif)
  30246. {
  30247. 802b1c8: b510 push {r4, lr}
  30248. if (netif->flags & NETIF_FLAG_UP) {
  30249. 802b1ca: f890 302d ldrb.w r3, [r0, #45] ; 0x2d
  30250. 802b1ce: 07d9 lsls r1, r3, #31
  30251. * up once configured.
  30252. *
  30253. * @see dhcp_start()
  30254. */
  30255. void netif_set_down(struct netif *netif)
  30256. {
  30257. 802b1d0: 4604 mov r4, r0
  30258. if (netif->flags & NETIF_FLAG_UP) {
  30259. 802b1d2: d511 bpl.n 802b1f8 <netif_set_down+0x30>
  30260. netif->flags &= ~NETIF_FLAG_UP;
  30261. 802b1d4: f023 0301 bic.w r3, r3, #1
  30262. 802b1d8: f880 302d strb.w r3, [r0, #45] ; 0x2d
  30263. #if LWIP_SNMP
  30264. snmp_get_sysuptime(&netif->ts);
  30265. 802b1dc: 3038 adds r0, #56 ; 0x38
  30266. 802b1de: f004 fb29 bl 802f834 <snmp_get_sysuptime>
  30267. #endif
  30268. #if LWIP_ARP
  30269. if (netif->flags & NETIF_FLAG_ETHARP) {
  30270. 802b1e2: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  30271. 802b1e6: f003 0320 and.w r3, r3, #32
  30272. 802b1ea: b2db uxtb r3, r3
  30273. 802b1ec: b123 cbz r3, 802b1f8 <netif_set_down+0x30>
  30274. etharp_cleanup_netif(netif);
  30275. 802b1ee: 4620 mov r0, r4
  30276. }
  30277. #endif /* LWIP_ARP */
  30278. NETIF_STATUS_CALLBACK(netif);
  30279. }
  30280. }
  30281. 802b1f0: e8bd 4010 ldmia.w sp!, {r4, lr}
  30282. snmp_get_sysuptime(&netif->ts);
  30283. #endif
  30284. #if LWIP_ARP
  30285. if (netif->flags & NETIF_FLAG_ETHARP) {
  30286. etharp_cleanup_netif(netif);
  30287. 802b1f4: f007 b834 b.w 8032260 <etharp_cleanup_netif>
  30288. 802b1f8: bd10 pop {r4, pc}
  30289. 0802b1fa <pbuf_header>:
  30290. * @return non-zero on failure, zero on success.
  30291. *
  30292. */
  30293. u8_t
  30294. pbuf_header(struct pbuf *p, s16_t header_size_increment)
  30295. {
  30296. 802b1fa: b510 push {r4, lr}
  30297. u16_t type;
  30298. void *payload;
  30299. u16_t increment_magnitude;
  30300. LWIP_ASSERT("p != NULL", p != NULL);
  30301. if ((header_size_increment == 0) || (p == NULL)) {
  30302. 802b1fc: b321 cbz r1, 802b248 <pbuf_header+0x4e>
  30303. 802b1fe: b330 cbz r0, 802b24e <pbuf_header+0x54>
  30304. return 0;
  30305. }
  30306. if (header_size_increment < 0){
  30307. 802b200: 2900 cmp r1, #0
  30308. 802b202: da05 bge.n 802b210 <pbuf_header+0x16>
  30309. increment_magnitude = -header_size_increment;
  30310. 802b204: 424b negs r3, r1
  30311. /* Check that we aren't going to move off the end of the pbuf */
  30312. LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;);
  30313. 802b206: 8942 ldrh r2, [r0, #10]
  30314. if ((header_size_increment == 0) || (p == NULL)) {
  30315. return 0;
  30316. }
  30317. if (header_size_increment < 0){
  30318. increment_magnitude = -header_size_increment;
  30319. 802b208: b29b uxth r3, r3
  30320. /* Check that we aren't going to move off the end of the pbuf */
  30321. LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;);
  30322. 802b20a: 429a cmp r2, r3
  30323. 802b20c: d201 bcs.n 802b212 <pbuf_header+0x18>
  30324. 802b20e: e01d b.n 802b24c <pbuf_header+0x52>
  30325. } else {
  30326. increment_magnitude = header_size_increment;
  30327. 802b210: b28b uxth r3, r1
  30328. LWIP_ASSERT("p->payload - increment_magnitude >= p + SIZEOF_STRUCT_PBUF",
  30329. (u8_t *)p->payload - increment_magnitude >= (u8_t *)p + SIZEOF_STRUCT_PBUF);
  30330. #endif
  30331. }
  30332. type = p->type;
  30333. 802b212: 7b02 ldrb r2, [r0, #12]
  30334. /* remember current payload pointer */
  30335. payload = p->payload;
  30336. 802b214: 6844 ldr r4, [r0, #4]
  30337. /* pbuf types containing payloads? */
  30338. if (type == PBUF_RAM || type == PBUF_POOL) {
  30339. 802b216: b10a cbz r2, 802b21c <pbuf_header+0x22>
  30340. 802b218: 2a03 cmp r2, #3
  30341. 802b21a: d105 bne.n 802b228 <pbuf_header+0x2e>
  30342. /* set new payload pointer */
  30343. p->payload = (u8_t *)p->payload - header_size_increment;
  30344. 802b21c: 1a64 subs r4, r4, r1
  30345. /* boundary check fails? */
  30346. if ((u8_t *)p->payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) {
  30347. 802b21e: f100 0310 add.w r3, r0, #16
  30348. 802b222: 429c cmp r4, r3
  30349. 802b224: d312 bcc.n 802b24c <pbuf_header+0x52>
  30350. 802b226: e008 b.n 802b23a <pbuf_header+0x40>
  30351. p->payload = payload;
  30352. /* bail out unsuccesfully */
  30353. return 1;
  30354. }
  30355. /* pbuf types refering to external payloads? */
  30356. } else if (type == PBUF_REF || type == PBUF_ROM) {
  30357. 802b228: 3a01 subs r2, #1
  30358. 802b22a: 2a01 cmp r2, #1
  30359. 802b22c: d80e bhi.n 802b24c <pbuf_header+0x52>
  30360. /* hide a header in the payload? */
  30361. if ((header_size_increment < 0) && (increment_magnitude <= p->len)) {
  30362. 802b22e: 2900 cmp r1, #0
  30363. 802b230: da0c bge.n 802b24c <pbuf_header+0x52>
  30364. 802b232: 8942 ldrh r2, [r0, #10]
  30365. 802b234: 429a cmp r2, r3
  30366. 802b236: d309 bcc.n 802b24c <pbuf_header+0x52>
  30367. /* increase payload pointer */
  30368. p->payload = (u8_t *)p->payload - header_size_increment;
  30369. 802b238: 1a64 subs r4, r4, r1
  30370. /* Unknown type */
  30371. LWIP_ASSERT("bad pbuf type", 0);
  30372. return 1;
  30373. }
  30374. /* modify pbuf length fields */
  30375. p->len += header_size_increment;
  30376. 802b23a: 8943 ldrh r3, [r0, #10]
  30377. /* pbuf types refering to external payloads? */
  30378. } else if (type == PBUF_REF || type == PBUF_ROM) {
  30379. /* hide a header in the payload? */
  30380. if ((header_size_increment < 0) && (increment_magnitude <= p->len)) {
  30381. /* increase payload pointer */
  30382. p->payload = (u8_t *)p->payload - header_size_increment;
  30383. 802b23c: 6044 str r4, [r0, #4]
  30384. /* Unknown type */
  30385. LWIP_ASSERT("bad pbuf type", 0);
  30386. return 1;
  30387. }
  30388. /* modify pbuf length fields */
  30389. p->len += header_size_increment;
  30390. 802b23e: 18cb adds r3, r1, r3
  30391. 802b240: 8143 strh r3, [r0, #10]
  30392. p->tot_len += header_size_increment;
  30393. 802b242: 8903 ldrh r3, [r0, #8]
  30394. 802b244: 18c9 adds r1, r1, r3
  30395. 802b246: 8101 strh r1, [r0, #8]
  30396. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_header: old %p new %p (%"S16_F")\n",
  30397. (void *)payload, (void *)p->payload, header_size_increment));
  30398. return 0;
  30399. 802b248: 2000 movs r0, #0
  30400. 802b24a: bd10 pop {r4, pc}
  30401. }
  30402. if (header_size_increment < 0){
  30403. increment_magnitude = -header_size_increment;
  30404. /* Check that we aren't going to move off the end of the pbuf */
  30405. LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;);
  30406. 802b24c: 2001 movs r0, #1
  30407. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_header: old %p new %p (%"S16_F")\n",
  30408. (void *)payload, (void *)p->payload, header_size_increment));
  30409. return 0;
  30410. }
  30411. 802b24e: bd10 pop {r4, pc}
  30412. 0802b250 <pbuf_free>:
  30413. * 1->1->1 becomes .......
  30414. *
  30415. */
  30416. u8_t
  30417. pbuf_free(struct pbuf *p)
  30418. {
  30419. 802b250: b570 push {r4, r5, r6, lr}
  30420. u16_t type;
  30421. struct pbuf *q;
  30422. u8_t count;
  30423. if (p == NULL) {
  30424. 802b252: 4604 mov r4, r0
  30425. 802b254: b300 cbz r0, 802b298 <pbuf_free+0x48>
  30426. 802b256: 2500 movs r5, #0
  30427. u16_t ref;
  30428. SYS_ARCH_DECL_PROTECT(old_level);
  30429. /* Since decrementing ref cannot be guaranteed to be a single machine operation
  30430. * we must protect it. We put the new ref into a local variable to prevent
  30431. * further protection. */
  30432. SYS_ARCH_PROTECT(old_level);
  30433. 802b258: f007 fc7e bl 8032b58 <sys_arch_protect>
  30434. /* all pbufs in a chain are referenced at least once */
  30435. LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0);
  30436. /* decrease reference count (number of pointers to pbuf) */
  30437. ref = --(p->ref);
  30438. 802b25c: 89e6 ldrh r6, [r4, #14]
  30439. 802b25e: 3e01 subs r6, #1
  30440. 802b260: b2b6 uxth r6, r6
  30441. 802b262: 81e6 strh r6, [r4, #14]
  30442. SYS_ARCH_UNPROTECT(old_level);
  30443. 802b264: f007 fc82 bl 8032b6c <sys_arch_unprotect>
  30444. /* this pbuf is no longer referenced to? */
  30445. if (ref == 0) {
  30446. 802b268: b9be cbnz r6, 802b29a <pbuf_free+0x4a>
  30447. /* remember next pbuf in chain for next iteration */
  30448. q = p->next;
  30449. LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: deallocating %p\n", (void *)p));
  30450. type = p->type;
  30451. 802b26a: 7b23 ldrb r3, [r4, #12]
  30452. ref = --(p->ref);
  30453. SYS_ARCH_UNPROTECT(old_level);
  30454. /* this pbuf is no longer referenced to? */
  30455. if (ref == 0) {
  30456. /* remember next pbuf in chain for next iteration */
  30457. q = p->next;
  30458. 802b26c: 6826 ldr r6, [r4, #0]
  30459. pc->custom_free_function(p);
  30460. } else
  30461. #endif /* LWIP_SUPPORT_CUSTOM_PBUF */
  30462. {
  30463. /* is this a pbuf from the pool? */
  30464. if (type == PBUF_POOL) {
  30465. 802b26e: 2b03 cmp r3, #3
  30466. 802b270: d101 bne.n 802b276 <pbuf_free+0x26>
  30467. memp_free(MEMP_PBUF_POOL, p);
  30468. 802b272: 200f movs r0, #15
  30469. 802b274: e003 b.n 802b27e <pbuf_free+0x2e>
  30470. /* is this a ROM or RAM referencing pbuf? */
  30471. } else if (type == PBUF_ROM || type == PBUF_REF) {
  30472. 802b276: 3b01 subs r3, #1
  30473. 802b278: 2b01 cmp r3, #1
  30474. 802b27a: d804 bhi.n 802b286 <pbuf_free+0x36>
  30475. memp_free(MEMP_PBUF, p);
  30476. 802b27c: 200e movs r0, #14
  30477. 802b27e: 4621 mov r1, r4
  30478. 802b280: f7ff fedc bl 802b03c <memp_free>
  30479. 802b284: e002 b.n 802b28c <pbuf_free+0x3c>
  30480. /* type == PBUF_RAM */
  30481. } else {
  30482. mem_free(p);
  30483. 802b286: 4620 mov r0, r4
  30484. 802b288: f7ff fd70 bl 802ad6c <mem_free>
  30485. }
  30486. }
  30487. count++;
  30488. 802b28c: 3501 adds r5, #1
  30489. 802b28e: b2ed uxtb r5, r5
  30490. p->type == PBUF_REF || p->type == PBUF_POOL);
  30491. count = 0;
  30492. /* de-allocate all consecutive pbufs from the head of the chain that
  30493. * obtain a zero reference count after decrementing*/
  30494. while (p != NULL) {
  30495. 802b290: 4634 mov r4, r6
  30496. 802b292: 2e00 cmp r6, #0
  30497. 802b294: d1e0 bne.n 802b258 <pbuf_free+0x8>
  30498. 802b296: e000 b.n 802b29a <pbuf_free+0x4a>
  30499. if (p == NULL) {
  30500. LWIP_ASSERT("p != NULL", p != NULL);
  30501. /* if assertions are disabled, proceed with debug output */
  30502. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
  30503. ("pbuf_free(p == NULL) was called.\n"));
  30504. return 0;
  30505. 802b298: 4605 mov r5, r0
  30506. }
  30507. }
  30508. PERF_STOP("pbuf_free");
  30509. /* return number of de-allocated pbufs */
  30510. return count;
  30511. }
  30512. 802b29a: 4628 mov r0, r5
  30513. 802b29c: bd70 pop {r4, r5, r6, pc}
  30514. 0802b29e <pbuf_realloc>:
  30515. *
  30516. * @note Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain).
  30517. */
  30518. void
  30519. pbuf_realloc(struct pbuf *p, u16_t new_len)
  30520. {
  30521. 802b29e: b538 push {r3, r4, r5, lr}
  30522. p->type == PBUF_ROM ||
  30523. p->type == PBUF_RAM ||
  30524. p->type == PBUF_REF);
  30525. /* desired length larger than current length? */
  30526. if (new_len >= p->tot_len) {
  30527. 802b2a0: 8903 ldrh r3, [r0, #8]
  30528. 802b2a2: 4299 cmp r1, r3
  30529. 802b2a4: d220 bcs.n 802b2e8 <pbuf_realloc+0x4a>
  30530. return;
  30531. }
  30532. /* the pbuf chain grows by (new_len - p->tot_len) bytes
  30533. * (which may be negative in case of shrinking) */
  30534. grow = new_len - p->tot_len;
  30535. 802b2a6: 1aca subs r2, r1, r3
  30536. /* first, step over any pbufs that should remain in the chain */
  30537. rem_len = new_len;
  30538. q = p;
  30539. /* should this pbuf be kept? */
  30540. while (rem_len > q->len) {
  30541. 802b2a8: 460d mov r5, r1
  30542. 802b2aa: 4604 mov r4, r0
  30543. 802b2ac: e005 b.n 802b2ba <pbuf_realloc+0x1c>
  30544. /* decrease remaining length by pbuf length */
  30545. rem_len -= q->len;
  30546. 802b2ae: 1aed subs r5, r5, r3
  30547. /* decrease total length indicator */
  30548. LWIP_ASSERT("grow < max_u16_t", grow < 0xffff);
  30549. q->tot_len += (u16_t)grow;
  30550. 802b2b0: 8923 ldrh r3, [r4, #8]
  30551. 802b2b2: 18d3 adds r3, r2, r3
  30552. 802b2b4: 8123 strh r3, [r4, #8]
  30553. /* proceed to next pbuf in chain */
  30554. q = q->next;
  30555. 802b2b6: 6824 ldr r4, [r4, #0]
  30556. rem_len = new_len;
  30557. q = p;
  30558. /* should this pbuf be kept? */
  30559. while (rem_len > q->len) {
  30560. /* decrease remaining length by pbuf length */
  30561. rem_len -= q->len;
  30562. 802b2b8: b2ad uxth r5, r5
  30563. /* first, step over any pbufs that should remain in the chain */
  30564. rem_len = new_len;
  30565. q = p;
  30566. /* should this pbuf be kept? */
  30567. while (rem_len > q->len) {
  30568. 802b2ba: 8963 ldrh r3, [r4, #10]
  30569. 802b2bc: 429d cmp r5, r3
  30570. 802b2be: d8f6 bhi.n 802b2ae <pbuf_realloc+0x10>
  30571. /* we have now reached the new last pbuf (in q) */
  30572. /* rem_len == desired length for pbuf q */
  30573. /* shrink allocated memory for PBUF_RAM */
  30574. /* (other types merely adjust their length fields */
  30575. if ((q->type == PBUF_RAM) && (rem_len != q->len)) {
  30576. 802b2c0: 7b22 ldrb r2, [r4, #12]
  30577. 802b2c2: b94a cbnz r2, 802b2d8 <pbuf_realloc+0x3a>
  30578. 802b2c4: 429d cmp r5, r3
  30579. 802b2c6: d007 beq.n 802b2d8 <pbuf_realloc+0x3a>
  30580. /* reallocate and adjust the length of the pbuf that will be split */
  30581. q = (struct pbuf *)mem_trim(q, (u16_t)((u8_t *)q->payload - (u8_t *)q) + rem_len);
  30582. 802b2c8: 6863 ldr r3, [r4, #4]
  30583. 802b2ca: 1b1b subs r3, r3, r4
  30584. 802b2cc: 18e9 adds r1, r5, r3
  30585. 802b2ce: 4620 mov r0, r4
  30586. 802b2d0: b289 uxth r1, r1
  30587. 802b2d2: f7ff fda5 bl 802ae20 <mem_trim>
  30588. 802b2d6: 4604 mov r4, r0
  30589. /* adjust length fields for new last pbuf */
  30590. q->len = rem_len;
  30591. q->tot_len = q->len;
  30592. /* any remaining pbufs in chain? */
  30593. if (q->next != NULL) {
  30594. 802b2d8: 6820 ldr r0, [r4, #0]
  30595. /* reallocate and adjust the length of the pbuf that will be split */
  30596. q = (struct pbuf *)mem_trim(q, (u16_t)((u8_t *)q->payload - (u8_t *)q) + rem_len);
  30597. LWIP_ASSERT("mem_trim returned q == NULL", q != NULL);
  30598. }
  30599. /* adjust length fields for new last pbuf */
  30600. q->len = rem_len;
  30601. 802b2da: 8165 strh r5, [r4, #10]
  30602. q->tot_len = q->len;
  30603. 802b2dc: 8125 strh r5, [r4, #8]
  30604. /* any remaining pbufs in chain? */
  30605. if (q->next != NULL) {
  30606. 802b2de: b108 cbz r0, 802b2e4 <pbuf_realloc+0x46>
  30607. /* free remaining pbufs in chain */
  30608. pbuf_free(q->next);
  30609. 802b2e0: f7ff ffb6 bl 802b250 <pbuf_free>
  30610. }
  30611. /* q is last packet in chain */
  30612. q->next = NULL;
  30613. 802b2e4: 2300 movs r3, #0
  30614. 802b2e6: 6023 str r3, [r4, #0]
  30615. 802b2e8: bd38 pop {r3, r4, r5, pc}
  30616. 0802b2ea <pbuf_alloc>:
  30617. * @return the allocated pbuf. If multiple pbufs where allocated, this
  30618. * is the first pbuf of a pbuf chain.
  30619. */
  30620. struct pbuf *
  30621. pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
  30622. {
  30623. 802b2ea: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  30624. 802b2ee: 460d mov r5, r1
  30625. 802b2f0: 4617 mov r7, r2
  30626. u16_t offset;
  30627. s32_t rem_len; /* remaining length */
  30628. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length));
  30629. /* determine header offset */
  30630. switch (layer) {
  30631. 802b2f2: 2803 cmp r0, #3
  30632. 802b2f4: d87c bhi.n 802b3f0 <pbuf_alloc+0x106>
  30633. 802b2f6: e8df f000 tbb [pc, r0]
  30634. 802b2fa: 0802 .short 0x0802
  30635. 802b2fc: 0604 .short 0x0604
  30636. case PBUF_TRANSPORT:
  30637. /* add room for transport (often TCP) layer header */
  30638. offset = PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;
  30639. 802b2fe: 2636 movs r6, #54 ; 0x36
  30640. 802b300: e004 b.n 802b30c <pbuf_alloc+0x22>
  30641. /* add room for IP layer header */
  30642. offset = PBUF_LINK_HLEN + PBUF_IP_HLEN;
  30643. break;
  30644. case PBUF_LINK:
  30645. /* add room for link layer header */
  30646. offset = PBUF_LINK_HLEN;
  30647. 802b302: 260e movs r6, #14
  30648. break;
  30649. 802b304: e002 b.n 802b30c <pbuf_alloc+0x22>
  30650. case PBUF_RAW:
  30651. offset = 0;
  30652. 802b306: 2600 movs r6, #0
  30653. break;
  30654. 802b308: e000 b.n 802b30c <pbuf_alloc+0x22>
  30655. /* add room for transport (often TCP) layer header */
  30656. offset = PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;
  30657. break;
  30658. case PBUF_IP:
  30659. /* add room for IP layer header */
  30660. offset = PBUF_LINK_HLEN + PBUF_IP_HLEN;
  30661. 802b30a: 2622 movs r6, #34 ; 0x22
  30662. default:
  30663. LWIP_ASSERT("pbuf_alloc: bad pbuf layer", 0);
  30664. return NULL;
  30665. }
  30666. switch (type) {
  30667. 802b30c: 2f03 cmp r7, #3
  30668. 802b30e: d86f bhi.n 802b3f0 <pbuf_alloc+0x106>
  30669. 802b310: e8df f007 tbb [pc, r7]
  30670. 802b314: 025e5e46 .word 0x025e5e46
  30671. case PBUF_POOL:
  30672. /* allocate head of pbuf chain into p */
  30673. p = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);
  30674. 802b318: 200f movs r0, #15
  30675. 802b31a: f7ff fe79 bl 802b010 <memp_malloc>
  30676. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p));
  30677. if (p == NULL) {
  30678. 802b31e: 4604 mov r4, r0
  30679. 802b320: b900 cbnz r0, 802b324 <pbuf_alloc+0x3a>
  30680. 802b322: e065 b.n 802b3f0 <pbuf_alloc+0x106>
  30681. }
  30682. p->type = type;
  30683. p->next = NULL;
  30684. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  30685. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  30686. 802b324: 1982 adds r2, r0, r6
  30687. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  30688. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  30689. /* the total length of the pbuf chain is the requested size */
  30690. p->tot_len = length;
  30691. /* set the length of the first pbuf in the chain */
  30692. p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));
  30693. 802b326: 3603 adds r6, #3
  30694. 802b328: f026 0603 bic.w r6, r6, #3
  30695. }
  30696. p->type = type;
  30697. p->next = NULL;
  30698. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  30699. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  30700. 802b32c: 3213 adds r2, #19
  30701. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  30702. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  30703. /* the total length of the pbuf chain is the requested size */
  30704. p->tot_len = length;
  30705. /* set the length of the first pbuf in the chain */
  30706. p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));
  30707. 802b32e: f5c6 66c0 rsb r6, r6, #1536 ; 0x600
  30708. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p));
  30709. if (p == NULL) {
  30710. PBUF_POOL_IS_EMPTY();
  30711. return NULL;
  30712. }
  30713. p->type = type;
  30714. 802b332: 2303 movs r3, #3
  30715. p->next = NULL;
  30716. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  30717. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  30718. 802b334: f022 0203 bic.w r2, r2, #3
  30719. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  30720. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  30721. /* the total length of the pbuf chain is the requested size */
  30722. p->tot_len = length;
  30723. /* set the length of the first pbuf in the chain */
  30724. p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));
  30725. 802b338: 3604 adds r6, #4
  30726. 802b33a: 42ae cmp r6, r5
  30727. 802b33c: bfa8 it ge
  30728. 802b33e: 462e movge r6, r5
  30729. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p));
  30730. if (p == NULL) {
  30731. PBUF_POOL_IS_EMPTY();
  30732. return NULL;
  30733. }
  30734. p->type = type;
  30735. 802b340: 7303 strb r3, [r0, #12]
  30736. p->next = NULL;
  30737. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  30738. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  30739. 802b342: 6042 str r2, [r0, #4]
  30740. if (p == NULL) {
  30741. PBUF_POOL_IS_EMPTY();
  30742. return NULL;
  30743. }
  30744. p->type = type;
  30745. p->next = NULL;
  30746. 802b344: 2300 movs r3, #0
  30747. ((u8_t*)p->payload + p->len <=
  30748. (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
  30749. LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT",
  30750. (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 );
  30751. /* set reference count (needed here in case we fail) */
  30752. p->ref = 1;
  30753. 802b346: 2201 movs r2, #1
  30754. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  30755. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  30756. /* the total length of the pbuf chain is the requested size */
  30757. p->tot_len = length;
  30758. /* set the length of the first pbuf in the chain */
  30759. p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));
  30760. 802b348: 8146 strh r6, [r0, #10]
  30761. if (p == NULL) {
  30762. PBUF_POOL_IS_EMPTY();
  30763. return NULL;
  30764. }
  30765. p->type = type;
  30766. p->next = NULL;
  30767. 802b34a: 6003 str r3, [r0, #0]
  30768. /* make the payload pointer point 'offset' bytes into pbuf data memory */
  30769. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));
  30770. LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
  30771. ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
  30772. /* the total length of the pbuf chain is the requested size */
  30773. p->tot_len = length;
  30774. 802b34c: 8105 strh r5, [r0, #8]
  30775. ((u8_t*)p->payload + p->len <=
  30776. (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
  30777. LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT",
  30778. (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 );
  30779. /* set reference count (needed here in case we fail) */
  30780. p->ref = 1;
  30781. 802b34e: 81c2 strh r2, [r0, #14]
  30782. /* now allocate the tail of the pbuf chain */
  30783. /* remember first pbuf for linkage in next iteration */
  30784. r = p;
  30785. /* remaining length to be allocated */
  30786. rem_len = length - p->len;
  30787. 802b350: 1bae subs r6, r5, r6
  30788. /* any remaining pbufs to be allocated? */
  30789. while (rem_len > 0) {
  30790. 802b352: 4607 mov r7, r0
  30791. 802b354: 4698 mov r8, r3
  30792. r->next = q;
  30793. /* set total length of this pbuf and next in chain */
  30794. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  30795. q->tot_len = (u16_t)rem_len;
  30796. /* this pbuf length is pool size, unless smaller sized tail */
  30797. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  30798. 802b356: f240 6903 movw r9, #1539 ; 0x603
  30799. 802b35a: f240 6a04 movw sl, #1540 ; 0x604
  30800. /* remember first pbuf for linkage in next iteration */
  30801. r = p;
  30802. /* remaining length to be allocated */
  30803. rem_len = length - p->len;
  30804. /* any remaining pbufs to be allocated? */
  30805. while (rem_len > 0) {
  30806. 802b35e: e01c b.n 802b39a <pbuf_alloc+0xb0>
  30807. q = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);
  30808. 802b360: 200f movs r0, #15
  30809. 802b362: f7ff fe55 bl 802b010 <memp_malloc>
  30810. if (q == NULL) {
  30811. 802b366: 4605 mov r5, r0
  30812. 802b368: b918 cbnz r0, 802b372 <pbuf_alloc+0x88>
  30813. PBUF_POOL_IS_EMPTY();
  30814. /* free chain so far allocated */
  30815. pbuf_free(p);
  30816. 802b36a: 4620 mov r0, r4
  30817. 802b36c: f7ff ff70 bl 802b250 <pbuf_free>
  30818. 802b370: e03e b.n 802b3f0 <pbuf_alloc+0x106>
  30819. /* bail out unsuccesfully */
  30820. return NULL;
  30821. }
  30822. q->type = type;
  30823. 802b372: 2303 movs r3, #3
  30824. /* set total length of this pbuf and next in chain */
  30825. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  30826. q->tot_len = (u16_t)rem_len;
  30827. /* this pbuf length is pool size, unless smaller sized tail */
  30828. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  30829. q->payload = (void *)((u8_t *)q + SIZEOF_STRUCT_PBUF);
  30830. 802b374: f100 0210 add.w r2, r0, #16
  30831. /* free chain so far allocated */
  30832. pbuf_free(p);
  30833. /* bail out unsuccesfully */
  30834. return NULL;
  30835. }
  30836. q->type = type;
  30837. 802b378: 7303 strb r3, [r0, #12]
  30838. q->next = NULL;
  30839. /* make previous pbuf point to this pbuf */
  30840. r->next = q;
  30841. /* set total length of this pbuf and next in chain */
  30842. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  30843. q->tot_len = (u16_t)rem_len;
  30844. 802b37a: b2b3 uxth r3, r6
  30845. 802b37c: 8103 strh r3, [r0, #8]
  30846. /* this pbuf length is pool size, unless smaller sized tail */
  30847. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  30848. q->payload = (void *)((u8_t *)q + SIZEOF_STRUCT_PBUF);
  30849. 802b37e: 6042 str r2, [r0, #4]
  30850. r->next = q;
  30851. /* set total length of this pbuf and next in chain */
  30852. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  30853. q->tot_len = (u16_t)rem_len;
  30854. /* this pbuf length is pool size, unless smaller sized tail */
  30855. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  30856. 802b380: 454b cmp r3, r9
  30857. 802b382: bf88 it hi
  30858. 802b384: 4653 movhi r3, sl
  30859. LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned",
  30860. ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0);
  30861. LWIP_ASSERT("check p->payload + p->len does not overflow pbuf",
  30862. ((u8_t*)p->payload + p->len <=
  30863. (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
  30864. q->ref = 1;
  30865. 802b386: 2201 movs r2, #1
  30866. /* bail out unsuccesfully */
  30867. return NULL;
  30868. }
  30869. q->type = type;
  30870. q->flags = 0;
  30871. q->next = NULL;
  30872. 802b388: f8c0 8000 str.w r8, [r0]
  30873. pbuf_free(p);
  30874. /* bail out unsuccesfully */
  30875. return NULL;
  30876. }
  30877. q->type = type;
  30878. q->flags = 0;
  30879. 802b38c: f880 800d strb.w r8, [r0, #13]
  30880. q->next = NULL;
  30881. /* make previous pbuf point to this pbuf */
  30882. r->next = q;
  30883. 802b390: 6038 str r0, [r7, #0]
  30884. /* set total length of this pbuf and next in chain */
  30885. LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff);
  30886. q->tot_len = (u16_t)rem_len;
  30887. /* this pbuf length is pool size, unless smaller sized tail */
  30888. q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);
  30889. 802b392: 8143 strh r3, [r0, #10]
  30890. LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned",
  30891. ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0);
  30892. LWIP_ASSERT("check p->payload + p->len does not overflow pbuf",
  30893. ((u8_t*)p->payload + p->len <=
  30894. (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));
  30895. q->ref = 1;
  30896. 802b394: 81c2 strh r2, [r0, #14]
  30897. /* calculate remaining length to be allocated */
  30898. rem_len -= q->len;
  30899. 802b396: 1af6 subs r6, r6, r3
  30900. 802b398: 4607 mov r7, r0
  30901. /* remember first pbuf for linkage in next iteration */
  30902. r = p;
  30903. /* remaining length to be allocated */
  30904. rem_len = length - p->len;
  30905. /* any remaining pbufs to be allocated? */
  30906. while (rem_len > 0) {
  30907. 802b39a: 2e00 cmp r6, #0
  30908. 802b39c: dce0 bgt.n 802b360 <pbuf_alloc+0x76>
  30909. 802b39e: e022 b.n 802b3e6 <pbuf_alloc+0xfc>
  30910. /*r->next = NULL;*/
  30911. break;
  30912. case PBUF_RAM:
  30913. /* If pbuf is to be allocated in RAM, allocate memory for it. */
  30914. p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length));
  30915. 802b3a0: f106 0013 add.w r0, r6, #19
  30916. 802b3a4: 1ceb adds r3, r5, #3
  30917. 802b3a6: f023 0303 bic.w r3, r3, #3
  30918. 802b3aa: f020 0003 bic.w r0, r0, #3
  30919. 802b3ae: 18c0 adds r0, r0, r3
  30920. 802b3b0: b280 uxth r0, r0
  30921. 802b3b2: f7ff fda3 bl 802aefc <mem_malloc>
  30922. if (p == NULL) {
  30923. 802b3b6: 4604 mov r4, r0
  30924. 802b3b8: b1d0 cbz r0, 802b3f0 <pbuf_alloc+0x106>
  30925. return NULL;
  30926. }
  30927. /* Set up internal structure of the pbuf. */
  30928. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset));
  30929. 802b3ba: 1986 adds r6, r0, r6
  30930. 802b3bc: 3613 adds r6, #19
  30931. p->len = p->tot_len = length;
  30932. p->next = NULL;
  30933. 802b3be: 2300 movs r3, #0
  30934. p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length));
  30935. if (p == NULL) {
  30936. return NULL;
  30937. }
  30938. /* Set up internal structure of the pbuf. */
  30939. p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset));
  30940. 802b3c0: f026 0603 bic.w r6, r6, #3
  30941. 802b3c4: 6046 str r6, [r0, #4]
  30942. p->len = p->tot_len = length;
  30943. 802b3c6: 8105 strh r5, [r0, #8]
  30944. 802b3c8: 8145 strh r5, [r0, #10]
  30945. p->next = NULL;
  30946. 802b3ca: 6003 str r3, [r0, #0]
  30947. p->type = type;
  30948. 802b3cc: 7303 strb r3, [r0, #12]
  30949. 802b3ce: e00a b.n 802b3e6 <pbuf_alloc+0xfc>
  30950. /* pbuf references existing (non-volatile static constant) ROM payload? */
  30951. case PBUF_ROM:
  30952. /* pbuf references existing (externally allocated) RAM payload? */
  30953. case PBUF_REF:
  30954. /* only allocate memory for the pbuf structure */
  30955. p = (struct pbuf *)memp_malloc(MEMP_PBUF);
  30956. 802b3d0: 200e movs r0, #14
  30957. 802b3d2: f7ff fe1d bl 802b010 <memp_malloc>
  30958. if (p == NULL) {
  30959. 802b3d6: 4604 mov r4, r0
  30960. 802b3d8: b150 cbz r0, 802b3f0 <pbuf_alloc+0x106>
  30961. ("pbuf_alloc: Could not allocate MEMP_PBUF for PBUF_%s.\n",
  30962. (type == PBUF_ROM) ? "ROM" : "REF"));
  30963. return NULL;
  30964. }
  30965. /* caller must set this field properly, afterwards */
  30966. p->payload = NULL;
  30967. 802b3da: 2300 movs r3, #0
  30968. 802b3dc: 6043 str r3, [r0, #4]
  30969. p->len = p->tot_len = length;
  30970. 802b3de: 8105 strh r5, [r0, #8]
  30971. 802b3e0: 8145 strh r5, [r0, #10]
  30972. p->next = NULL;
  30973. 802b3e2: 6003 str r3, [r0, #0]
  30974. p->type = type;
  30975. 802b3e4: 7307 strb r7, [r0, #12]
  30976. default:
  30977. LWIP_ASSERT("pbuf_alloc: erroneous type", 0);
  30978. return NULL;
  30979. }
  30980. /* set reference count */
  30981. p->ref = 1;
  30982. 802b3e6: 2301 movs r3, #1
  30983. 802b3e8: 81e3 strh r3, [r4, #14]
  30984. /* set flags */
  30985. p->flags = 0;
  30986. 802b3ea: 2300 movs r3, #0
  30987. 802b3ec: 7363 strb r3, [r4, #13]
  30988. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p));
  30989. return p;
  30990. 802b3ee: e000 b.n 802b3f2 <pbuf_alloc+0x108>
  30991. p->next = NULL;
  30992. p->type = type;
  30993. break;
  30994. default:
  30995. LWIP_ASSERT("pbuf_alloc: erroneous type", 0);
  30996. return NULL;
  30997. 802b3f0: 2400 movs r4, #0
  30998. p->ref = 1;
  30999. /* set flags */
  31000. p->flags = 0;
  31001. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p));
  31002. return p;
  31003. }
  31004. 802b3f2: 4620 mov r0, r4
  31005. 802b3f4: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  31006. 0802b3f8 <pbuf_clen>:
  31007. * @return the number of pbufs in a chain
  31008. */
  31009. u8_t
  31010. pbuf_clen(struct pbuf *p)
  31011. {
  31012. 802b3f8: 4603 mov r3, r0
  31013. u8_t len;
  31014. len = 0;
  31015. 802b3fa: 2000 movs r0, #0
  31016. while (p != NULL) {
  31017. 802b3fc: e002 b.n 802b404 <pbuf_clen+0xc>
  31018. ++len;
  31019. 802b3fe: 3001 adds r0, #1
  31020. p = p->next;
  31021. 802b400: 681b ldr r3, [r3, #0]
  31022. {
  31023. u8_t len;
  31024. len = 0;
  31025. while (p != NULL) {
  31026. ++len;
  31027. 802b402: b2c0 uxtb r0, r0
  31028. pbuf_clen(struct pbuf *p)
  31029. {
  31030. u8_t len;
  31031. len = 0;
  31032. while (p != NULL) {
  31033. 802b404: 2b00 cmp r3, #0
  31034. 802b406: d1fa bne.n 802b3fe <pbuf_clen+0x6>
  31035. ++len;
  31036. p = p->next;
  31037. }
  31038. return len;
  31039. }
  31040. 802b408: 4770 bx lr
  31041. 0802b40a <pbuf_ref>:
  31042. * @param p pbuf to increase reference counter of
  31043. *
  31044. */
  31045. void
  31046. pbuf_ref(struct pbuf *p)
  31047. {
  31048. 802b40a: b510 push {r4, lr}
  31049. SYS_ARCH_DECL_PROTECT(old_level);
  31050. /* pbuf given? */
  31051. if (p != NULL) {
  31052. 802b40c: 4604 mov r4, r0
  31053. 802b40e: b140 cbz r0, 802b422 <pbuf_ref+0x18>
  31054. SYS_ARCH_PROTECT(old_level);
  31055. 802b410: f007 fba2 bl 8032b58 <sys_arch_protect>
  31056. ++(p->ref);
  31057. 802b414: 89e3 ldrh r3, [r4, #14]
  31058. 802b416: 3301 adds r3, #1
  31059. 802b418: 81e3 strh r3, [r4, #14]
  31060. SYS_ARCH_UNPROTECT(old_level);
  31061. }
  31062. }
  31063. 802b41a: e8bd 4010 ldmia.w sp!, {r4, lr}
  31064. SYS_ARCH_DECL_PROTECT(old_level);
  31065. /* pbuf given? */
  31066. if (p != NULL) {
  31067. SYS_ARCH_PROTECT(old_level);
  31068. ++(p->ref);
  31069. SYS_ARCH_UNPROTECT(old_level);
  31070. 802b41e: f007 bba5 b.w 8032b6c <sys_arch_unprotect>
  31071. 802b422: bd10 pop {r4, pc}
  31072. 0802b424 <pbuf_cat>:
  31073. * @see pbuf_chain()
  31074. */
  31075. void
  31076. pbuf_cat(struct pbuf *h, struct pbuf *t)
  31077. {
  31078. 802b424: b510 push {r4, lr}
  31079. struct pbuf *p;
  31080. LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)",
  31081. 802b426: b168 cbz r0, 802b444 <pbuf_cat+0x20>
  31082. 802b428: b161 cbz r1, 802b444 <pbuf_cat+0x20>
  31083. 802b42a: e003 b.n 802b434 <pbuf_cat+0x10>
  31084. ((h != NULL) && (t != NULL)), return;);
  31085. /* proceed to last pbuf of chain */
  31086. for (p = h; p->next != NULL; p = p->next) {
  31087. /* add total length of second chain to all totals of first chain */
  31088. p->tot_len += t->tot_len;
  31089. 802b42c: 8904 ldrh r4, [r0, #8]
  31090. 802b42e: 191b adds r3, r3, r4
  31091. 802b430: 8103 strh r3, [r0, #8]
  31092. LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)",
  31093. ((h != NULL) && (t != NULL)), return;);
  31094. /* proceed to last pbuf of chain */
  31095. for (p = h; p->next != NULL; p = p->next) {
  31096. 802b432: 4610 mov r0, r2
  31097. 802b434: 6802 ldr r2, [r0, #0]
  31098. 802b436: 890b ldrh r3, [r1, #8]
  31099. 802b438: 2a00 cmp r2, #0
  31100. 802b43a: d1f7 bne.n 802b42c <pbuf_cat+0x8>
  31101. }
  31102. /* { p is last pbuf of first h chain, p->next == NULL } */
  31103. LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len);
  31104. LWIP_ASSERT("p->next == NULL", p->next == NULL);
  31105. /* add total length of second chain to last pbuf total of first chain */
  31106. p->tot_len += t->tot_len;
  31107. 802b43c: 8902 ldrh r2, [r0, #8]
  31108. /* chain last pbuf of head (p) with first of tail (t) */
  31109. p->next = t;
  31110. 802b43e: 6001 str r1, [r0, #0]
  31111. }
  31112. /* { p is last pbuf of first h chain, p->next == NULL } */
  31113. LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len);
  31114. LWIP_ASSERT("p->next == NULL", p->next == NULL);
  31115. /* add total length of second chain to last pbuf total of first chain */
  31116. p->tot_len += t->tot_len;
  31117. 802b440: 189b adds r3, r3, r2
  31118. 802b442: 8103 strh r3, [r0, #8]
  31119. 802b444: bd10 pop {r4, pc}
  31120. 0802b446 <pbuf_chain>:
  31121. * The ->ref field of the first pbuf of the tail chain is adjusted.
  31122. *
  31123. */
  31124. void
  31125. pbuf_chain(struct pbuf *h, struct pbuf *t)
  31126. {
  31127. 802b446: b510 push {r4, lr}
  31128. 802b448: 460c mov r4, r1
  31129. pbuf_cat(h, t);
  31130. 802b44a: f7ff ffeb bl 802b424 <pbuf_cat>
  31131. /* t is now referenced by h */
  31132. pbuf_ref(t);
  31133. 802b44e: 4620 mov r0, r4
  31134. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_chain: %p references %p\n", (void *)h, (void *)t));
  31135. }
  31136. 802b450: e8bd 4010 ldmia.w sp!, {r4, lr}
  31137. void
  31138. pbuf_chain(struct pbuf *h, struct pbuf *t)
  31139. {
  31140. pbuf_cat(h, t);
  31141. /* t is now referenced by h */
  31142. pbuf_ref(t);
  31143. 802b454: f7ff bfd9 b.w 802b40a <pbuf_ref>
  31144. 0802b458 <pbuf_copy>:
  31145. * ERR_ARG if one of the pbufs is NULL or p_to is not big
  31146. * enough to hold p_from
  31147. */
  31148. err_t
  31149. pbuf_copy(struct pbuf *p_to, struct pbuf *p_from)
  31150. {
  31151. 802b458: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  31152. 802b45c: 460c mov r4, r1
  31153. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy(%p, %p)\n",
  31154. (void*)p_to, (void*)p_from));
  31155. /* is the target big enough to hold the source? */
  31156. LWIP_ERROR("pbuf_copy: target not big enough to hold source", ((p_to != NULL) &&
  31157. 802b45e: 4605 mov r5, r0
  31158. 802b460: b908 cbnz r0, 802b466 <pbuf_copy+0xe>
  31159. 802b462: 20f2 movs r0, #242 ; 0xf2
  31160. 802b464: e03f b.n 802b4e6 <pbuf_copy+0x8e>
  31161. 802b466: 2900 cmp r1, #0
  31162. 802b468: d0fb beq.n 802b462 <pbuf_copy+0xa>
  31163. 802b46a: 8902 ldrh r2, [r0, #8]
  31164. 802b46c: 890b ldrh r3, [r1, #8]
  31165. 802b46e: 429a cmp r2, r3
  31166. 802b470: d3f7 bcc.n 802b462 <pbuf_copy+0xa>
  31167. 802b472: 2600 movs r6, #0
  31168. 802b474: 4637 mov r7, r6
  31169. /* iterate through pbuf chain */
  31170. do
  31171. {
  31172. /* copy one part of the original chain */
  31173. if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
  31174. 802b476: f8b4 800a ldrh.w r8, [r4, #10]
  31175. 802b47a: 896b ldrh r3, [r5, #10]
  31176. len = p_from->len - offset_from;
  31177. } else {
  31178. /* current p_from does not fit into current p_to */
  31179. len = p_to->len - offset_to;
  31180. }
  31181. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  31182. 802b47c: 6861 ldr r1, [r4, #4]
  31183. 802b47e: 6868 ldr r0, [r5, #4]
  31184. /* iterate through pbuf chain */
  31185. do
  31186. {
  31187. /* copy one part of the original chain */
  31188. if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
  31189. 802b480: ebc6 0808 rsb r8, r6, r8
  31190. 802b484: 1bdb subs r3, r3, r7
  31191. 802b486: 4543 cmp r3, r8
  31192. /* complete current p_from fits into current p_to */
  31193. len = p_from->len - offset_from;
  31194. } else {
  31195. /* current p_from does not fit into current p_to */
  31196. len = p_to->len - offset_to;
  31197. 802b488: bfb4 ite lt
  31198. 802b48a: fa1f f883 uxthlt.w r8, r3
  31199. do
  31200. {
  31201. /* copy one part of the original chain */
  31202. if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
  31203. /* complete current p_from fits into current p_to */
  31204. len = p_from->len - offset_from;
  31205. 802b48e: fa1f f888 uxthge.w r8, r8
  31206. } else {
  31207. /* current p_from does not fit into current p_to */
  31208. len = p_to->len - offset_to;
  31209. }
  31210. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  31211. 802b492: 19c0 adds r0, r0, r7
  31212. 802b494: 1989 adds r1, r1, r6
  31213. 802b496: 4642 mov r2, r8
  31214. 802b498: f7f6 f8d4 bl 8021644 <memcpy>
  31215. offset_to += len;
  31216. offset_from += len;
  31217. 802b49c: 4446 add r6, r8
  31218. LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
  31219. LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
  31220. if (offset_from >= p_from->len) {
  31221. 802b49e: 8963 ldrh r3, [r4, #10]
  31222. /* current p_from does not fit into current p_to */
  31223. len = p_to->len - offset_to;
  31224. }
  31225. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  31226. offset_to += len;
  31227. offset_from += len;
  31228. 802b4a0: b2b6 uxth r6, r6
  31229. LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
  31230. LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
  31231. if (offset_from >= p_from->len) {
  31232. 802b4a2: 42b3 cmp r3, r6
  31233. } else {
  31234. /* current p_from does not fit into current p_to */
  31235. len = p_to->len - offset_to;
  31236. }
  31237. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  31238. offset_to += len;
  31239. 802b4a4: 4447 add r7, r8
  31240. if (offset_from >= p_from->len) {
  31241. /* on to next p_from (if any) */
  31242. offset_from = 0;
  31243. p_from = p_from->next;
  31244. }
  31245. if (offset_to == p_to->len) {
  31246. 802b4a6: 896b ldrh r3, [r5, #10]
  31247. LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
  31248. LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
  31249. if (offset_from >= p_from->len) {
  31250. /* on to next p_from (if any) */
  31251. offset_from = 0;
  31252. p_from = p_from->next;
  31253. 802b4a8: bf98 it ls
  31254. 802b4aa: 6824 ldrls r4, [r4, #0]
  31255. } else {
  31256. /* current p_from does not fit into current p_to */
  31257. len = p_to->len - offset_to;
  31258. }
  31259. MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);
  31260. offset_to += len;
  31261. 802b4ac: b2bf uxth r7, r7
  31262. offset_from += len;
  31263. LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
  31264. LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
  31265. if (offset_from >= p_from->len) {
  31266. /* on to next p_from (if any) */
  31267. offset_from = 0;
  31268. 802b4ae: bf98 it ls
  31269. 802b4b0: 2600 movls r6, #0
  31270. p_from = p_from->next;
  31271. }
  31272. if (offset_to == p_to->len) {
  31273. 802b4b2: 42bb cmp r3, r7
  31274. 802b4b4: d105 bne.n 802b4c2 <pbuf_copy+0x6a>
  31275. /* on to next p_to (if any) */
  31276. offset_to = 0;
  31277. p_to = p_to->next;
  31278. 802b4b6: 682d ldr r5, [r5, #0]
  31279. LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;);
  31280. 802b4b8: b915 cbnz r5, 802b4c0 <pbuf_copy+0x68>
  31281. 802b4ba: 2c00 cmp r4, #0
  31282. 802b4bc: d1d1 bne.n 802b462 <pbuf_copy+0xa>
  31283. 802b4be: e00f b.n 802b4e0 <pbuf_copy+0x88>
  31284. offset_from = 0;
  31285. p_from = p_from->next;
  31286. }
  31287. if (offset_to == p_to->len) {
  31288. /* on to next p_to (if any) */
  31289. offset_to = 0;
  31290. 802b4c0: 2700 movs r7, #0
  31291. p_to = p_to->next;
  31292. LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;);
  31293. }
  31294. if((p_from != NULL) && (p_from->len == p_from->tot_len)) {
  31295. 802b4c2: b12c cbz r4, 802b4d0 <pbuf_copy+0x78>
  31296. 802b4c4: 8962 ldrh r2, [r4, #10]
  31297. 802b4c6: 8923 ldrh r3, [r4, #8]
  31298. 802b4c8: 429a cmp r2, r3
  31299. 802b4ca: d101 bne.n 802b4d0 <pbuf_copy+0x78>
  31300. /* don't copy more than one packet! */
  31301. LWIP_ERROR("pbuf_copy() does not allow packet queues!\n",
  31302. 802b4cc: 6823 ldr r3, [r4, #0]
  31303. 802b4ce: b94b cbnz r3, 802b4e4 <pbuf_copy+0x8c>
  31304. (p_from->next == NULL), return ERR_VAL;);
  31305. }
  31306. if((p_to != NULL) && (p_to->len == p_to->tot_len)) {
  31307. 802b4d0: 896a ldrh r2, [r5, #10]
  31308. 802b4d2: 892b ldrh r3, [r5, #8]
  31309. 802b4d4: 429a cmp r2, r3
  31310. 802b4d6: d101 bne.n 802b4dc <pbuf_copy+0x84>
  31311. /* don't copy more than one packet! */
  31312. LWIP_ERROR("pbuf_copy() does not allow packet queues!\n",
  31313. 802b4d8: 682b ldr r3, [r5, #0]
  31314. 802b4da: b91b cbnz r3, 802b4e4 <pbuf_copy+0x8c>
  31315. (p_to->next == NULL), return ERR_VAL;);
  31316. }
  31317. } while (p_from);
  31318. 802b4dc: 2c00 cmp r4, #0
  31319. 802b4de: d1ca bne.n 802b476 <pbuf_copy+0x1e>
  31320. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n"));
  31321. return ERR_OK;
  31322. 802b4e0: 4620 mov r0, r4
  31323. 802b4e2: e000 b.n 802b4e6 <pbuf_copy+0x8e>
  31324. LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;);
  31325. }
  31326. if((p_from != NULL) && (p_from->len == p_from->tot_len)) {
  31327. /* don't copy more than one packet! */
  31328. LWIP_ERROR("pbuf_copy() does not allow packet queues!\n",
  31329. 802b4e4: 20fa movs r0, #250 ; 0xfa
  31330. (p_to->next == NULL), return ERR_VAL;);
  31331. }
  31332. } while (p_from);
  31333. LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n"));
  31334. return ERR_OK;
  31335. }
  31336. 802b4e6: b240 sxtb r0, r0
  31337. 802b4e8: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  31338. 0802b4ec <pbuf_copy_partial>:
  31339. * @param offset offset into the packet buffer from where to begin copying len bytes
  31340. * @return the number of bytes copied, or 0 on failure
  31341. */
  31342. u16_t
  31343. pbuf_copy_partial(struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)
  31344. {
  31345. 802b4ec: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  31346. 802b4f0: 4688 mov r8, r1
  31347. 802b4f2: 4616 mov r6, r2
  31348. struct pbuf *p;
  31349. u16_t left;
  31350. u16_t buf_copy_len;
  31351. u16_t copied_total = 0;
  31352. LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;);
  31353. 802b4f4: b328 cbz r0, 802b542 <pbuf_copy_partial+0x56>
  31354. LWIP_ERROR("pbuf_copy_partial: invalid dataptr", (dataptr != NULL), return 0;);
  31355. 802b4f6: b331 cbz r1, 802b546 <pbuf_copy_partial+0x5a>
  31356. 802b4f8: 2400 movs r4, #0
  31357. 802b4fa: 4605 mov r5, r0
  31358. 802b4fc: 46a1 mov r9, r4
  31359. 802b4fe: e01c b.n 802b53a <pbuf_copy_partial+0x4e>
  31360. return 0;
  31361. }
  31362. /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */
  31363. for(p = buf; len != 0 && p != NULL; p = p->next) {
  31364. if ((offset != 0) && (offset >= p->len)) {
  31365. 802b500: b12b cbz r3, 802b50e <pbuf_copy_partial+0x22>
  31366. 802b502: 896a ldrh r2, [r5, #10]
  31367. 802b504: 4293 cmp r3, r2
  31368. 802b506: d302 bcc.n 802b50e <pbuf_copy_partial+0x22>
  31369. /* don't copy from this buffer -> on to the next */
  31370. offset -= p->len;
  31371. 802b508: 1a9b subs r3, r3, r2
  31372. 802b50a: b29b uxth r3, r3
  31373. 802b50c: e014 b.n 802b538 <pbuf_copy_partial+0x4c>
  31374. } else {
  31375. /* copy from this buffer. maybe only partially. */
  31376. buf_copy_len = p->len - offset;
  31377. 802b50e: 896f ldrh r7, [r5, #10]
  31378. if (buf_copy_len > len)
  31379. buf_copy_len = len;
  31380. /* copy the necessary parts of the buffer */
  31381. MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len);
  31382. 802b510: 6869 ldr r1, [r5, #4]
  31383. if ((offset != 0) && (offset >= p->len)) {
  31384. /* don't copy from this buffer -> on to the next */
  31385. offset -= p->len;
  31386. } else {
  31387. /* copy from this buffer. maybe only partially. */
  31388. buf_copy_len = p->len - offset;
  31389. 802b512: 1aff subs r7, r7, r3
  31390. 802b514: b2bf uxth r7, r7
  31391. 802b516: 42b7 cmp r7, r6
  31392. 802b518: bf28 it cs
  31393. 802b51a: 4637 movcs r7, r6
  31394. if (buf_copy_len > len)
  31395. buf_copy_len = len;
  31396. /* copy the necessary parts of the buffer */
  31397. MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len);
  31398. 802b51c: eb08 0009 add.w r0, r8, r9
  31399. 802b520: 18c9 adds r1, r1, r3
  31400. 802b522: 463a mov r2, r7
  31401. copied_total += buf_copy_len;
  31402. 802b524: 193c adds r4, r7, r4
  31403. left += buf_copy_len;
  31404. 802b526: 44b9 add r9, r7
  31405. len -= buf_copy_len;
  31406. 802b528: 1bf6 subs r6, r6, r7
  31407. /* copy from this buffer. maybe only partially. */
  31408. buf_copy_len = p->len - offset;
  31409. if (buf_copy_len > len)
  31410. buf_copy_len = len;
  31411. /* copy the necessary parts of the buffer */
  31412. MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len);
  31413. 802b52a: f7f6 f88b bl 8021644 <memcpy>
  31414. copied_total += buf_copy_len;
  31415. 802b52e: b2a4 uxth r4, r4
  31416. left += buf_copy_len;
  31417. 802b530: fa1f f989 uxth.w r9, r9
  31418. len -= buf_copy_len;
  31419. 802b534: b2b6 uxth r6, r6
  31420. offset = 0;
  31421. 802b536: 2300 movs r3, #0
  31422. if((buf == NULL) || (dataptr == NULL)) {
  31423. return 0;
  31424. }
  31425. /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */
  31426. for(p = buf; len != 0 && p != NULL; p = p->next) {
  31427. 802b538: 682d ldr r5, [r5, #0]
  31428. 802b53a: b12e cbz r6, 802b548 <pbuf_copy_partial+0x5c>
  31429. 802b53c: 2d00 cmp r5, #0
  31430. 802b53e: d1df bne.n 802b500 <pbuf_copy_partial+0x14>
  31431. 802b540: e002 b.n 802b548 <pbuf_copy_partial+0x5c>
  31432. struct pbuf *p;
  31433. u16_t left;
  31434. u16_t buf_copy_len;
  31435. u16_t copied_total = 0;
  31436. LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;);
  31437. 802b542: 4604 mov r4, r0
  31438. 802b544: e000 b.n 802b548 <pbuf_copy_partial+0x5c>
  31439. 802b546: 460c mov r4, r1
  31440. len -= buf_copy_len;
  31441. offset = 0;
  31442. }
  31443. }
  31444. return copied_total;
  31445. }
  31446. 802b548: 4620 mov r0, r4
  31447. 802b54a: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  31448. 802b54e: 0000 movs r0, r0
  31449. 0802b550 <raw_input>:
  31450. * caller).
  31451. *
  31452. */
  31453. u8_t
  31454. raw_input(struct pbuf *p, struct netif *inp)
  31455. {
  31456. 802b550: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  31457. u8_t eaten = 0;
  31458. LWIP_UNUSED_ARG(inp);
  31459. iphdr = (struct ip_hdr *)p->payload;
  31460. proto = IPH_PROTO(iphdr);
  31461. 802b554: 6843 ldr r3, [r0, #4]
  31462. /* loop through all raw pcbs until the packet is eaten by one */
  31463. /* this allows multiple pcbs to match against the packet by design */
  31464. while ((eaten == 0) && (pcb != NULL)) {
  31465. if ((pcb->protocol == proto) &&
  31466. (ip_addr_isany(&pcb->local_ip) ||
  31467. ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest))) {
  31468. 802b556: f8df a074 ldr.w sl, [pc, #116] ; 802b5cc <raw_input+0x7c>
  31469. u8_t eaten = 0;
  31470. LWIP_UNUSED_ARG(inp);
  31471. iphdr = (struct ip_hdr *)p->payload;
  31472. proto = IPH_PROTO(iphdr);
  31473. 802b55a: f893 9009 ldrb.w r9, [r3, #9]
  31474. prev = NULL;
  31475. pcb = raw_pcbs;
  31476. 802b55e: 4b19 ldr r3, [pc, #100] ; (802b5c4 <raw_input+0x74>)
  31477. * caller).
  31478. *
  31479. */
  31480. u8_t
  31481. raw_input(struct pbuf *p, struct netif *inp)
  31482. {
  31483. 802b560: 4606 mov r6, r0
  31484. iphdr = (struct ip_hdr *)p->payload;
  31485. proto = IPH_PROTO(iphdr);
  31486. prev = NULL;
  31487. pcb = raw_pcbs;
  31488. 802b562: 681c ldr r4, [r3, #0]
  31489. LWIP_UNUSED_ARG(inp);
  31490. iphdr = (struct ip_hdr *)p->payload;
  31491. proto = IPH_PROTO(iphdr);
  31492. prev = NULL;
  31493. 802b564: 2500 movs r5, #0
  31494. eaten = 1;
  31495. if (prev != NULL) {
  31496. /* move the pcb to the front of raw_pcbs so that is
  31497. found faster next time */
  31498. prev->next = pcb->next;
  31499. pcb->next = raw_pcbs;
  31500. 802b566: 4698 mov r8, r3
  31501. 802b568: e023 b.n 802b5b2 <raw_input+0x62>
  31502. prev = NULL;
  31503. pcb = raw_pcbs;
  31504. /* loop through all raw pcbs until the packet is eaten by one */
  31505. /* this allows multiple pcbs to match against the packet by design */
  31506. while ((eaten == 0) && (pcb != NULL)) {
  31507. if ((pcb->protocol == proto) &&
  31508. 802b56a: 7c23 ldrb r3, [r4, #16]
  31509. 802b56c: 454b cmp r3, r9
  31510. 802b56e: d118 bne.n 802b5a2 <raw_input+0x52>
  31511. (ip_addr_isany(&pcb->local_ip) ||
  31512. 802b570: 6823 ldr r3, [r4, #0]
  31513. 802b572: b11b cbz r3, 802b57c <raw_input+0x2c>
  31514. 802b574: f8da 2000 ldr.w r2, [sl]
  31515. 802b578: 4293 cmp r3, r2
  31516. 802b57a: d112 bne.n 802b5a2 <raw_input+0x52>
  31517. /* broadcast filter? */
  31518. if (ip_get_option(pcb, SOF_BROADCAST) || !ip_addr_isbroadcast(&current_iphdr_dest, inp))
  31519. #endif /* IP_SOF_BROADCAST_RECV */
  31520. {
  31521. /* receive callback function available? */
  31522. if (pcb->recv != NULL) {
  31523. 802b57c: 6967 ldr r7, [r4, #20]
  31524. 802b57e: b187 cbz r7, 802b5a2 <raw_input+0x52>
  31525. /* the receive callback function did not eat the packet? */
  31526. if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) {
  31527. 802b580: 69a0 ldr r0, [r4, #24]
  31528. 802b582: 4b11 ldr r3, [pc, #68] ; (802b5c8 <raw_input+0x78>)
  31529. 802b584: 4621 mov r1, r4
  31530. 802b586: 4632 mov r2, r6
  31531. 802b588: 47b8 blx r7
  31532. 802b58a: b150 cbz r0, 802b5a2 <raw_input+0x52>
  31533. /* receive function ate the packet */
  31534. p = NULL;
  31535. eaten = 1;
  31536. if (prev != NULL) {
  31537. 802b58c: b15d cbz r5, 802b5a6 <raw_input+0x56>
  31538. /* move the pcb to the front of raw_pcbs so that is
  31539. found faster next time */
  31540. prev->next = pcb->next;
  31541. 802b58e: 68e3 ldr r3, [r4, #12]
  31542. 802b590: 60eb str r3, [r5, #12]
  31543. pcb->next = raw_pcbs;
  31544. 802b592: f8d8 3000 ldr.w r3, [r8]
  31545. raw_pcbs = pcb;
  31546. 802b596: f8c8 4000 str.w r4, [r8]
  31547. eaten = 1;
  31548. if (prev != NULL) {
  31549. /* move the pcb to the front of raw_pcbs so that is
  31550. found faster next time */
  31551. prev->next = pcb->next;
  31552. pcb->next = raw_pcbs;
  31553. 802b59a: 60e3 str r3, [r4, #12]
  31554. /* receive callback function available? */
  31555. if (pcb->recv != NULL) {
  31556. /* the receive callback function did not eat the packet? */
  31557. if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) {
  31558. /* receive function ate the packet */
  31559. p = NULL;
  31560. 802b59c: 2600 movs r6, #0
  31561. eaten = 1;
  31562. 802b59e: 2301 movs r3, #1
  31563. 802b5a0: e003 b.n 802b5aa <raw_input+0x5a>
  31564. pcb = raw_pcbs;
  31565. /* loop through all raw pcbs until the packet is eaten by one */
  31566. /* this allows multiple pcbs to match against the packet by design */
  31567. while ((eaten == 0) && (pcb != NULL)) {
  31568. if ((pcb->protocol == proto) &&
  31569. (ip_addr_isany(&pcb->local_ip) ||
  31570. 802b5a2: 2300 movs r3, #0
  31571. 802b5a4: e001 b.n 802b5aa <raw_input+0x5a>
  31572. if (pcb->recv != NULL) {
  31573. /* the receive callback function did not eat the packet? */
  31574. if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) {
  31575. /* receive function ate the packet */
  31576. p = NULL;
  31577. eaten = 1;
  31578. 802b5a6: 2301 movs r3, #1
  31579. /* receive callback function available? */
  31580. if (pcb->recv != NULL) {
  31581. /* the receive callback function did not eat the packet? */
  31582. if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) {
  31583. /* receive function ate the packet */
  31584. p = NULL;
  31585. 802b5a8: 462e mov r6, r5
  31586. /* no receive callback function was set for this raw PCB */
  31587. }
  31588. /* drop the packet */
  31589. }
  31590. prev = pcb;
  31591. pcb = pcb->next;
  31592. 802b5aa: 68e2 ldr r2, [r4, #12]
  31593. 802b5ac: 4625 mov r5, r4
  31594. prev = NULL;
  31595. pcb = raw_pcbs;
  31596. /* loop through all raw pcbs until the packet is eaten by one */
  31597. /* this allows multiple pcbs to match against the packet by design */
  31598. while ((eaten == 0) && (pcb != NULL)) {
  31599. 802b5ae: b92b cbnz r3, 802b5bc <raw_input+0x6c>
  31600. /* no receive callback function was set for this raw PCB */
  31601. }
  31602. /* drop the packet */
  31603. }
  31604. prev = pcb;
  31605. pcb = pcb->next;
  31606. 802b5b0: 4614 mov r4, r2
  31607. prev = NULL;
  31608. pcb = raw_pcbs;
  31609. /* loop through all raw pcbs until the packet is eaten by one */
  31610. /* this allows multiple pcbs to match against the packet by design */
  31611. while ((eaten == 0) && (pcb != NULL)) {
  31612. 802b5b2: 2c00 cmp r4, #0
  31613. 802b5b4: d1d9 bne.n 802b56a <raw_input+0x1a>
  31614. 802b5b6: 4620 mov r0, r4
  31615. 802b5b8: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  31616. 802b5bc: 2001 movs r0, #1
  31617. }
  31618. prev = pcb;
  31619. pcb = pcb->next;
  31620. }
  31621. return eaten;
  31622. }
  31623. 802b5be: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  31624. 802b5c2: bf00 nop
  31625. 802b5c4: 2000e09c .word 0x2000e09c
  31626. 802b5c8: 20010d98 .word 0x20010d98
  31627. 802b5cc: 20010da0 .word 0x20010da0
  31628. 0802b5d0 <tcp_accept_null>:
  31629. LWIP_UNUSED_ARG(arg);
  31630. LWIP_UNUSED_ARG(pcb);
  31631. LWIP_UNUSED_ARG(err);
  31632. return ERR_ABRT;
  31633. }
  31634. 802b5d0: f06f 0009 mvn.w r0, #9
  31635. 802b5d4: 4770 bx lr
  31636. 802b5d6: 0000 movs r0, r0
  31637. 0802b5d8 <tcp_new_port>:
  31638. *
  31639. * @return a new (free) local TCP port number
  31640. */
  31641. static u16_t
  31642. tcp_new_port(void)
  31643. {
  31644. 802b5d8: 4b13 ldr r3, [pc, #76] ; (802b628 <tcp_new_port+0x50>)
  31645. 802b5da: b570 push {r4, r5, r6, lr}
  31646. 802b5dc: 8818 ldrh r0, [r3, #0]
  31647. if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
  31648. tcp_port = TCP_LOCAL_PORT_RANGE_START;
  31649. }
  31650. /* Check all PCB lists. */
  31651. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  31652. for(pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
  31653. 802b5de: 4d13 ldr r5, [pc, #76] ; (802b62c <tcp_new_port+0x54>)
  31654. *
  31655. * @return a new (free) local TCP port number
  31656. */
  31657. static u16_t
  31658. tcp_new_port(void)
  31659. {
  31660. 802b5e0: f44f 4280 mov.w r2, #16384 ; 0x4000
  31661. u8_t i;
  31662. u16_t n = 0;
  31663. struct tcp_pcb *pcb;
  31664. again:
  31665. if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
  31666. 802b5e4: f64f 74ff movw r4, #65535 ; 0xffff
  31667. 802b5e8: 42a0 cmp r0, r4
  31668. 802b5ea: d002 beq.n 802b5f2 <tcp_new_port+0x1a>
  31669. 802b5ec: 3001 adds r0, #1
  31670. 802b5ee: b280 uxth r0, r0
  31671. 802b5f0: e001 b.n 802b5f6 <tcp_new_port+0x1e>
  31672. tcp_port = TCP_LOCAL_PORT_RANGE_START;
  31673. 802b5f2: f44f 4040 mov.w r0, #49152 ; 0xc000
  31674. 802b5f6: 2300 movs r3, #0
  31675. }
  31676. /* Check all PCB lists. */
  31677. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  31678. for(pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
  31679. 802b5f8: 5959 ldr r1, [r3, r5]
  31680. 802b5fa: 6809 ldr r1, [r1, #0]
  31681. 802b5fc: e00b b.n 802b616 <tcp_new_port+0x3e>
  31682. if (pcb->local_port == tcp_port) {
  31683. 802b5fe: 8b4e ldrh r6, [r1, #26]
  31684. 802b600: 4286 cmp r6, r0
  31685. 802b602: d107 bne.n 802b614 <tcp_new_port+0x3c>
  31686. 802b604: 3a01 subs r2, #1
  31687. 802b606: b292 uxth r2, r2
  31688. if (++n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) {
  31689. 802b608: 2a00 cmp r2, #0
  31690. 802b60a: d1ed bne.n 802b5e8 <tcp_new_port+0x10>
  31691. 802b60c: 4b06 ldr r3, [pc, #24] ; (802b628 <tcp_new_port+0x50>)
  31692. 802b60e: 8018 strh r0, [r3, #0]
  31693. return 0;
  31694. 802b610: 4610 mov r0, r2
  31695. 802b612: bd70 pop {r4, r5, r6, pc}
  31696. if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
  31697. tcp_port = TCP_LOCAL_PORT_RANGE_START;
  31698. }
  31699. /* Check all PCB lists. */
  31700. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  31701. for(pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
  31702. 802b614: 68c9 ldr r1, [r1, #12]
  31703. 802b616: 2900 cmp r1, #0
  31704. 802b618: d1f1 bne.n 802b5fe <tcp_new_port+0x26>
  31705. 802b61a: 3304 adds r3, #4
  31706. again:
  31707. if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
  31708. tcp_port = TCP_LOCAL_PORT_RANGE_START;
  31709. }
  31710. /* Check all PCB lists. */
  31711. for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
  31712. 802b61c: 2b10 cmp r3, #16
  31713. 802b61e: d1eb bne.n 802b5f8 <tcp_new_port+0x20>
  31714. 802b620: 4b01 ldr r3, [pc, #4] ; (802b628 <tcp_new_port+0x50>)
  31715. 802b622: 8018 strh r0, [r3, #0]
  31716. goto again;
  31717. }
  31718. }
  31719. }
  31720. return tcp_port;
  31721. }
  31722. 802b624: bd70 pop {r4, r5, r6, pc}
  31723. 802b626: bf00 nop
  31724. 802b628: 200015e4 .word 0x200015e4
  31725. 802b62c: 0803abd4 .word 0x0803abd4
  31726. 0802b630 <tcp_init>:
  31727. /**
  31728. * Initialize this module.
  31729. */
  31730. void
  31731. tcp_init(void)
  31732. {
  31733. 802b630: 4770 bx lr
  31734. 802b632: 0000 movs r0, r0
  31735. 0802b634 <tcp_bind>:
  31736. * ERR_VAL if bind failed because the PCB is not in a valid state
  31737. * ERR_OK if bound
  31738. */
  31739. err_t
  31740. tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  31741. {
  31742. 802b634: b5f8 push {r3, r4, r5, r6, r7, lr}
  31743. int i;
  31744. int max_pcb_list = NUM_TCP_PCB_LISTS;
  31745. struct tcp_pcb *cpcb;
  31746. LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL);
  31747. 802b636: 7e03 ldrb r3, [r0, #24]
  31748. * ERR_VAL if bind failed because the PCB is not in a valid state
  31749. * ERR_OK if bound
  31750. */
  31751. err_t
  31752. tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  31753. {
  31754. 802b638: 4604 mov r4, r0
  31755. 802b63a: 460d mov r5, r1
  31756. int i;
  31757. int max_pcb_list = NUM_TCP_PCB_LISTS;
  31758. struct tcp_pcb *cpcb;
  31759. LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL);
  31760. 802b63c: bb33 cbnz r3, 802b68c <tcp_bind+0x58>
  31761. if (ip_get_option(pcb, SOF_REUSEADDR)) {
  31762. max_pcb_list = NUM_TCP_PCB_LISTS_NO_TIME_WAIT;
  31763. }
  31764. #endif /* SO_REUSE */
  31765. if (port == 0) {
  31766. 802b63e: b91a cbnz r2, 802b648 <tcp_bind+0x14>
  31767. port = tcp_new_port();
  31768. 802b640: f7ff ffca bl 802b5d8 <tcp_new_port>
  31769. if (port == 0) {
  31770. 802b644: 4602 mov r2, r0
  31771. 802b646: b318 cbz r0, 802b690 <tcp_bind+0x5c>
  31772. }
  31773. }
  31774. /* Check if the address already is in use (on all lists) */
  31775. for (i = 0; i < max_pcb_list; i++) {
  31776. for(cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
  31777. 802b648: 4f14 ldr r7, [pc, #80] ; (802b69c <tcp_bind+0x68>)
  31778. * ERR_VAL if bind failed because the PCB is not in a valid state
  31779. * ERR_OK if bound
  31780. */
  31781. err_t
  31782. tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  31783. {
  31784. 802b64a: 2100 movs r1, #0
  31785. }
  31786. }
  31787. /* Check if the address already is in use (on all lists) */
  31788. for (i = 0; i < max_pcb_list; i++) {
  31789. for(cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
  31790. 802b64c: 59cb ldr r3, [r1, r7]
  31791. 802b64e: 681b ldr r3, [r3, #0]
  31792. 802b650: e00a b.n 802b668 <tcp_bind+0x34>
  31793. if (cpcb->local_port == port) {
  31794. 802b652: 8b58 ldrh r0, [r3, #26]
  31795. 802b654: 4290 cmp r0, r2
  31796. 802b656: d106 bne.n 802b666 <tcp_bind+0x32>
  31797. tcp_connect. */
  31798. if (!ip_get_option(pcb, SOF_REUSEADDR) ||
  31799. !ip_get_option(cpcb, SOF_REUSEADDR))
  31800. #endif /* SO_REUSE */
  31801. {
  31802. if (ip_addr_isany(&(cpcb->local_ip)) ||
  31803. 802b658: 681e ldr r6, [r3, #0]
  31804. 802b65a: b1de cbz r6, 802b694 <tcp_bind+0x60>
  31805. 802b65c: b1d5 cbz r5, 802b694 <tcp_bind+0x60>
  31806. ip_addr_isany(ipaddr) ||
  31807. 802b65e: 6828 ldr r0, [r5, #0]
  31808. 802b660: b1c0 cbz r0, 802b694 <tcp_bind+0x60>
  31809. 802b662: 4286 cmp r6, r0
  31810. 802b664: d016 beq.n 802b694 <tcp_bind+0x60>
  31811. }
  31812. }
  31813. /* Check if the address already is in use (on all lists) */
  31814. for (i = 0; i < max_pcb_list; i++) {
  31815. for(cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
  31816. 802b666: 68db ldr r3, [r3, #12]
  31817. 802b668: 2b00 cmp r3, #0
  31818. 802b66a: d1f2 bne.n 802b652 <tcp_bind+0x1e>
  31819. 802b66c: 3104 adds r1, #4
  31820. return ERR_BUF;
  31821. }
  31822. }
  31823. /* Check if the address already is in use (on all lists) */
  31824. for (i = 0; i < max_pcb_list; i++) {
  31825. 802b66e: 2910 cmp r1, #16
  31826. 802b670: d1ec bne.n 802b64c <tcp_bind+0x18>
  31827. }
  31828. }
  31829. }
  31830. }
  31831. if (!ip_addr_isany(ipaddr)) {
  31832. 802b672: b115 cbz r5, 802b67a <tcp_bind+0x46>
  31833. 802b674: 682b ldr r3, [r5, #0]
  31834. 802b676: b103 cbz r3, 802b67a <tcp_bind+0x46>
  31835. pcb->local_ip = *ipaddr;
  31836. 802b678: 6023 str r3, [r4, #0]
  31837. }
  31838. pcb->local_port = port;
  31839. TCP_REG(&tcp_bound_pcbs, pcb);
  31840. 802b67a: 4b09 ldr r3, [pc, #36] ; (802b6a0 <tcp_bind+0x6c>)
  31841. }
  31842. if (!ip_addr_isany(ipaddr)) {
  31843. pcb->local_ip = *ipaddr;
  31844. }
  31845. pcb->local_port = port;
  31846. 802b67c: 8362 strh r2, [r4, #26]
  31847. TCP_REG(&tcp_bound_pcbs, pcb);
  31848. 802b67e: 681a ldr r2, [r3, #0]
  31849. 802b680: 601c str r4, [r3, #0]
  31850. 802b682: 60e2 str r2, [r4, #12]
  31851. 802b684: f002 f8de bl 802d844 <tcp_timer_needed>
  31852. LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port));
  31853. return ERR_OK;
  31854. 802b688: 2000 movs r0, #0
  31855. 802b68a: e004 b.n 802b696 <tcp_bind+0x62>
  31856. {
  31857. int i;
  31858. int max_pcb_list = NUM_TCP_PCB_LISTS;
  31859. struct tcp_pcb *cpcb;
  31860. LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL);
  31861. 802b68c: 20fa movs r0, #250 ; 0xfa
  31862. 802b68e: e002 b.n 802b696 <tcp_bind+0x62>
  31863. #endif /* SO_REUSE */
  31864. if (port == 0) {
  31865. port = tcp_new_port();
  31866. if (port == 0) {
  31867. return ERR_BUF;
  31868. 802b690: 20fe movs r0, #254 ; 0xfe
  31869. 802b692: e000 b.n 802b696 <tcp_bind+0x62>
  31870. #endif /* SO_REUSE */
  31871. {
  31872. if (ip_addr_isany(&(cpcb->local_ip)) ||
  31873. ip_addr_isany(ipaddr) ||
  31874. ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
  31875. return ERR_USE;
  31876. 802b694: 20f8 movs r0, #248 ; 0xf8
  31877. }
  31878. pcb->local_port = port;
  31879. TCP_REG(&tcp_bound_pcbs, pcb);
  31880. LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port));
  31881. return ERR_OK;
  31882. }
  31883. 802b696: b240 sxtb r0, r0
  31884. 802b698: bdf8 pop {r3, r4, r5, r6, r7, pc}
  31885. 802b69a: bf00 nop
  31886. 802b69c: 0803abd4 .word 0x0803abd4
  31887. 802b6a0: 20010d88 .word 0x20010d88
  31888. 0802b6a4 <tcp_listen_with_backlog>:
  31889. * called like this:
  31890. * tpcb = tcp_listen(tpcb);
  31891. */
  31892. struct tcp_pcb *
  31893. tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
  31894. {
  31895. 802b6a4: b538 push {r3, r4, r5, lr}
  31896. struct tcp_pcb_listen *lpcb;
  31897. LWIP_UNUSED_ARG(backlog);
  31898. LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, return NULL);
  31899. 802b6a6: 7e03 ldrb r3, [r0, #24]
  31900. * called like this:
  31901. * tpcb = tcp_listen(tpcb);
  31902. */
  31903. struct tcp_pcb *
  31904. tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
  31905. {
  31906. 802b6a8: 4604 mov r4, r0
  31907. struct tcp_pcb_listen *lpcb;
  31908. LWIP_UNUSED_ARG(backlog);
  31909. LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, return NULL);
  31910. 802b6aa: b10b cbz r3, 802b6b0 <tcp_listen_with_backlog+0xc>
  31911. 802b6ac: 2000 movs r0, #0
  31912. 802b6ae: bd38 pop {r3, r4, r5, pc}
  31913. }
  31914. }
  31915. }
  31916. }
  31917. #endif /* SO_REUSE */
  31918. lpcb = (struct tcp_pcb_listen *)memp_malloc(MEMP_TCP_PCB_LISTEN);
  31919. 802b6b0: 2003 movs r0, #3
  31920. 802b6b2: f7ff fcad bl 802b010 <memp_malloc>
  31921. if (lpcb == NULL) {
  31922. 802b6b6: 4605 mov r5, r0
  31923. 802b6b8: 2800 cmp r0, #0
  31924. 802b6ba: d0f7 beq.n 802b6ac <tcp_listen_with_backlog+0x8>
  31925. return NULL;
  31926. }
  31927. lpcb->callback_arg = pcb->callback_arg;
  31928. 802b6bc: 6923 ldr r3, [r4, #16]
  31929. 802b6be: 6103 str r3, [r0, #16]
  31930. lpcb->local_port = pcb->local_port;
  31931. 802b6c0: 8b63 ldrh r3, [r4, #26]
  31932. 802b6c2: 8343 strh r3, [r0, #26]
  31933. lpcb->state = LISTEN;
  31934. 802b6c4: 2301 movs r3, #1
  31935. 802b6c6: 7603 strb r3, [r0, #24]
  31936. lpcb->prio = pcb->prio;
  31937. 802b6c8: 7e63 ldrb r3, [r4, #25]
  31938. 802b6ca: 7643 strb r3, [r0, #25]
  31939. lpcb->so_options = pcb->so_options;
  31940. ip_set_option(lpcb, SOF_ACCEPTCONN);
  31941. 802b6cc: 7a23 ldrb r3, [r4, #8]
  31942. 802b6ce: f043 0302 orr.w r3, r3, #2
  31943. 802b6d2: 7203 strb r3, [r0, #8]
  31944. lpcb->ttl = pcb->ttl;
  31945. 802b6d4: 7aa3 ldrb r3, [r4, #10]
  31946. 802b6d6: 7283 strb r3, [r0, #10]
  31947. lpcb->tos = pcb->tos;
  31948. 802b6d8: 7a63 ldrb r3, [r4, #9]
  31949. 802b6da: 7243 strb r3, [r0, #9]
  31950. ip_addr_copy(lpcb->local_ip, pcb->local_ip);
  31951. 802b6dc: 6823 ldr r3, [r4, #0]
  31952. 802b6de: 6003 str r3, [r0, #0]
  31953. if (pcb->local_port != 0) {
  31954. 802b6e0: 8b63 ldrh r3, [r4, #26]
  31955. 802b6e2: b1ab cbz r3, 802b710 <tcp_listen_with_backlog+0x6c>
  31956. TCP_RMV(&tcp_bound_pcbs, pcb);
  31957. 802b6e4: 4a11 ldr r2, [pc, #68] ; (802b72c <tcp_listen_with_backlog+0x88>)
  31958. 802b6e6: 6813 ldr r3, [r2, #0]
  31959. 802b6e8: 42a3 cmp r3, r4
  31960. 802b6ea: d101 bne.n 802b6f0 <tcp_listen_with_backlog+0x4c>
  31961. 802b6ec: 68e3 ldr r3, [r4, #12]
  31962. 802b6ee: e00c b.n 802b70a <tcp_listen_with_backlog+0x66>
  31963. 802b6f0: 4a0f ldr r2, [pc, #60] ; (802b730 <tcp_listen_with_backlog+0x8c>)
  31964. 802b6f2: 6013 str r3, [r2, #0]
  31965. 802b6f4: e007 b.n 802b706 <tcp_listen_with_backlog+0x62>
  31966. 802b6f6: 68d9 ldr r1, [r3, #12]
  31967. 802b6f8: 42a1 cmp r1, r4
  31968. 802b6fa: d103 bne.n 802b704 <tcp_listen_with_backlog+0x60>
  31969. 802b6fc: 6013 str r3, [r2, #0]
  31970. 802b6fe: 68e2 ldr r2, [r4, #12]
  31971. 802b700: 60da str r2, [r3, #12]
  31972. 802b702: e003 b.n 802b70c <tcp_listen_with_backlog+0x68>
  31973. 802b704: 460b mov r3, r1
  31974. 802b706: 2b00 cmp r3, #0
  31975. 802b708: d1f5 bne.n 802b6f6 <tcp_listen_with_backlog+0x52>
  31976. 802b70a: 6013 str r3, [r2, #0]
  31977. 802b70c: 2300 movs r3, #0
  31978. 802b70e: 60e3 str r3, [r4, #12]
  31979. }
  31980. memp_free(MEMP_TCP_PCB, pcb);
  31981. 802b710: 2002 movs r0, #2
  31982. 802b712: 4621 mov r1, r4
  31983. 802b714: f7ff fc92 bl 802b03c <memp_free>
  31984. #if LWIP_CALLBACK_API
  31985. lpcb->accept = tcp_accept_null;
  31986. 802b718: 4b06 ldr r3, [pc, #24] ; (802b734 <tcp_listen_with_backlog+0x90>)
  31987. 802b71a: 616b str r3, [r5, #20]
  31988. #endif /* LWIP_CALLBACK_API */
  31989. #if TCP_LISTEN_BACKLOG
  31990. lpcb->accepts_pending = 0;
  31991. lpcb->backlog = (backlog ? backlog : 1);
  31992. #endif /* TCP_LISTEN_BACKLOG */
  31993. TCP_REG(&tcp_listen_pcbs.pcbs, (struct tcp_pcb *)lpcb);
  31994. 802b71c: 4b06 ldr r3, [pc, #24] ; (802b738 <tcp_listen_with_backlog+0x94>)
  31995. 802b71e: 681a ldr r2, [r3, #0]
  31996. 802b720: 601d str r5, [r3, #0]
  31997. 802b722: 60ea str r2, [r5, #12]
  31998. 802b724: f002 f88e bl 802d844 <tcp_timer_needed>
  31999. return (struct tcp_pcb *)lpcb;
  32000. 802b728: 4628 mov r0, r5
  32001. }
  32002. 802b72a: bd38 pop {r3, r4, r5, pc}
  32003. 802b72c: 20010d88 .word 0x20010d88
  32004. 802b730: 20010d84 .word 0x20010d84
  32005. 802b734: 0802b5d1 .word 0x0802b5d1
  32006. 802b738: 20010d80 .word 0x20010d80
  32007. 0802b73c <tcp_update_rcv_ann_wnd>:
  32008. *
  32009. * Returns how much extra window would be advertised if we sent an
  32010. * update now.
  32011. */
  32012. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  32013. {
  32014. 802b73c: b530 push {r4, r5, lr}
  32015. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  32016. if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
  32017. 802b73e: 6b01 ldr r1, [r0, #48] ; 0x30
  32018. * Returns how much extra window would be advertised if we sent an
  32019. * update now.
  32020. */
  32021. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  32022. {
  32023. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  32024. 802b740: 8d84 ldrh r4, [r0, #44] ; 0x2c
  32025. if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
  32026. 802b742: 8ec5 ldrh r5, [r0, #54] ; 0x36
  32027. * Returns how much extra window would be advertised if we sent an
  32028. * update now.
  32029. */
  32030. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  32031. {
  32032. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  32033. 802b744: 6a82 ldr r2, [r0, #40] ; 0x28
  32034. *
  32035. * Returns how much extra window would be advertised if we sent an
  32036. * update now.
  32037. */
  32038. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  32039. {
  32040. 802b746: 4603 mov r3, r0
  32041. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  32042. if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
  32043. 802b748: f640 3068 movw r0, #2920 ; 0xb68
  32044. 802b74c: 4285 cmp r5, r0
  32045. 802b74e: bf28 it cs
  32046. 802b750: 4605 movcs r5, r0
  32047. * Returns how much extra window would be advertised if we sent an
  32048. * update now.
  32049. */
  32050. u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
  32051. {
  32052. u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
  32053. 802b752: 1a60 subs r0, r4, r1
  32054. if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
  32055. 802b754: 1880 adds r0, r0, r2
  32056. 802b756: 1b45 subs r5, r0, r5
  32057. 802b758: 2d00 cmp r5, #0
  32058. 802b75a: db01 blt.n 802b760 <tcp_update_rcv_ann_wnd+0x24>
  32059. /* we can advertise more window */
  32060. pcb->rcv_ann_wnd = pcb->rcv_wnd;
  32061. 802b75c: 85dc strh r4, [r3, #46] ; 0x2e
  32062. return new_right_edge - pcb->rcv_ann_right_edge;
  32063. 802b75e: bd30 pop {r4, r5, pc}
  32064. } else {
  32065. if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {
  32066. 802b760: 1a50 subs r0, r2, r1
  32067. 802b762: 2800 cmp r0, #0
  32068. 802b764: f04f 0000 mov.w r0, #0
  32069. 802b768: dd01 ble.n 802b76e <tcp_update_rcv_ann_wnd+0x32>
  32070. /* Can happen due to other end sending out of advertised window,
  32071. * but within actual available (but not yet advertised) window */
  32072. pcb->rcv_ann_wnd = 0;
  32073. 802b76a: 85d8 strh r0, [r3, #46] ; 0x2e
  32074. 802b76c: bd30 pop {r4, r5, pc}
  32075. } else {
  32076. /* keep the right edge of window constant */
  32077. u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
  32078. 802b76e: 1a8a subs r2, r1, r2
  32079. LWIP_ASSERT("new_rcv_ann_wnd <= 0xffff", new_rcv_ann_wnd <= 0xffff);
  32080. pcb->rcv_ann_wnd = (u16_t)new_rcv_ann_wnd;
  32081. 802b770: 85da strh r2, [r3, #46] ; 0x2e
  32082. }
  32083. return 0;
  32084. }
  32085. }
  32086. 802b772: bd30 pop {r4, r5, pc}
  32087. 0802b774 <tcp_recved>:
  32088. LWIP_ASSERT("don't call tcp_recved for listen-pcbs",
  32089. pcb->state != LISTEN);
  32090. LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n",
  32091. len <= 0xffff - pcb->rcv_wnd );
  32092. pcb->rcv_wnd += len;
  32093. 802b774: 8d83 ldrh r3, [r0, #44] ; 0x2c
  32094. 802b776: 18c9 adds r1, r1, r3
  32095. 802b778: b289 uxth r1, r1
  32096. if (pcb->rcv_wnd > TCP_WND) {
  32097. 802b77a: f241 63d0 movw r3, #5840 ; 0x16d0
  32098. 802b77e: 4299 cmp r1, r3
  32099. * @param pcb the tcp_pcb for which data is read
  32100. * @param len the amount of bytes that have been read by the application
  32101. */
  32102. void
  32103. tcp_recved(struct tcp_pcb *pcb, u16_t len)
  32104. {
  32105. 802b780: b510 push {r4, lr}
  32106. LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n",
  32107. len <= 0xffff - pcb->rcv_wnd );
  32108. pcb->rcv_wnd += len;
  32109. if (pcb->rcv_wnd > TCP_WND) {
  32110. pcb->rcv_wnd = TCP_WND;
  32111. 802b782: bf8c ite hi
  32112. 802b784: 8583 strhhi r3, [r0, #44] ; 0x2c
  32113. LWIP_ASSERT("don't call tcp_recved for listen-pcbs",
  32114. pcb->state != LISTEN);
  32115. LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n",
  32116. len <= 0xffff - pcb->rcv_wnd );
  32117. pcb->rcv_wnd += len;
  32118. 802b786: 8581 strhls r1, [r0, #44] ; 0x2c
  32119. * @param pcb the tcp_pcb for which data is read
  32120. * @param len the amount of bytes that have been read by the application
  32121. */
  32122. void
  32123. tcp_recved(struct tcp_pcb *pcb, u16_t len)
  32124. {
  32125. 802b788: 4604 mov r4, r0
  32126. pcb->rcv_wnd += len;
  32127. if (pcb->rcv_wnd > TCP_WND) {
  32128. pcb->rcv_wnd = TCP_WND;
  32129. }
  32130. wnd_inflation = tcp_update_rcv_ann_wnd(pcb);
  32131. 802b78a: f7ff ffd7 bl 802b73c <tcp_update_rcv_ann_wnd>
  32132. /* If the change in the right edge of window is significant (default
  32133. * watermark is TCP_WND/4), then send an explicit update now.
  32134. * Otherwise wait for a packet to be sent in the normal course of
  32135. * events (or more window to be available later) */
  32136. if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {
  32137. 802b78e: f240 53b3 movw r3, #1459 ; 0x5b3
  32138. 802b792: 4298 cmp r0, r3
  32139. 802b794: dd08 ble.n 802b7a8 <tcp_recved+0x34>
  32140. tcp_ack_now(pcb);
  32141. 802b796: 7fa3 ldrb r3, [r4, #30]
  32142. tcp_output(pcb);
  32143. 802b798: 4620 mov r0, r4
  32144. /* If the change in the right edge of window is significant (default
  32145. * watermark is TCP_WND/4), then send an explicit update now.
  32146. * Otherwise wait for a packet to be sent in the normal course of
  32147. * events (or more window to be available later) */
  32148. if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {
  32149. tcp_ack_now(pcb);
  32150. 802b79a: f043 0302 orr.w r3, r3, #2
  32151. 802b79e: 77a3 strb r3, [r4, #30]
  32152. tcp_output(pcb);
  32153. }
  32154. LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %"U16_F" bytes, wnd %"U16_F" (%"U16_F").\n",
  32155. len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd));
  32156. }
  32157. 802b7a0: e8bd 4010 ldmia.w sp!, {r4, lr}
  32158. * watermark is TCP_WND/4), then send an explicit update now.
  32159. * Otherwise wait for a packet to be sent in the normal course of
  32160. * events (or more window to be available later) */
  32161. if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {
  32162. tcp_ack_now(pcb);
  32163. tcp_output(pcb);
  32164. 802b7a4: f001 bd90 b.w 802d2c8 <tcp_output>
  32165. 802b7a8: bd10 pop {r4, pc}
  32166. 0802b7aa <tcp_seg_free>:
  32167. *
  32168. * @param seg single tcp_seg to free
  32169. */
  32170. void
  32171. tcp_seg_free(struct tcp_seg *seg)
  32172. {
  32173. 802b7aa: b510 push {r4, lr}
  32174. if (seg != NULL) {
  32175. 802b7ac: 4604 mov r4, r0
  32176. 802b7ae: b148 cbz r0, 802b7c4 <tcp_seg_free+0x1a>
  32177. if (seg->p != NULL) {
  32178. 802b7b0: 6840 ldr r0, [r0, #4]
  32179. 802b7b2: b108 cbz r0, 802b7b8 <tcp_seg_free+0xe>
  32180. pbuf_free(seg->p);
  32181. 802b7b4: f7ff fd4c bl 802b250 <pbuf_free>
  32182. #if TCP_DEBUG
  32183. seg->p = NULL;
  32184. #endif /* TCP_DEBUG */
  32185. }
  32186. memp_free(MEMP_TCP_SEG, seg);
  32187. 802b7b8: 2004 movs r0, #4
  32188. 802b7ba: 4621 mov r1, r4
  32189. }
  32190. }
  32191. 802b7bc: e8bd 4010 ldmia.w sp!, {r4, lr}
  32192. pbuf_free(seg->p);
  32193. #if TCP_DEBUG
  32194. seg->p = NULL;
  32195. #endif /* TCP_DEBUG */
  32196. }
  32197. memp_free(MEMP_TCP_SEG, seg);
  32198. 802b7c0: f7ff bc3c b.w 802b03c <memp_free>
  32199. 802b7c4: bd10 pop {r4, pc}
  32200. 0802b7c6 <tcp_segs_free>:
  32201. *
  32202. * @param seg tcp_seg list of TCP segments to free
  32203. */
  32204. void
  32205. tcp_segs_free(struct tcp_seg *seg)
  32206. {
  32207. 802b7c6: b510 push {r4, lr}
  32208. while (seg != NULL) {
  32209. 802b7c8: e003 b.n 802b7d2 <tcp_segs_free+0xc>
  32210. struct tcp_seg *next = seg->next;
  32211. 802b7ca: 6804 ldr r4, [r0, #0]
  32212. tcp_seg_free(seg);
  32213. 802b7cc: f7ff ffed bl 802b7aa <tcp_seg_free>
  32214. seg = next;
  32215. 802b7d0: 4620 mov r0, r4
  32216. * @param seg tcp_seg list of TCP segments to free
  32217. */
  32218. void
  32219. tcp_segs_free(struct tcp_seg *seg)
  32220. {
  32221. while (seg != NULL) {
  32222. 802b7d2: 2800 cmp r0, #0
  32223. 802b7d4: d1f9 bne.n 802b7ca <tcp_segs_free+0x4>
  32224. struct tcp_seg *next = seg->next;
  32225. tcp_seg_free(seg);
  32226. seg = next;
  32227. }
  32228. }
  32229. 802b7d6: bd10 pop {r4, pc}
  32230. 0802b7d8 <tcp_arg>:
  32231. void
  32232. tcp_arg(struct tcp_pcb *pcb, void *arg)
  32233. {
  32234. /* This function is allowed to be called for both listen pcbs and
  32235. connection pcbs. */
  32236. pcb->callback_arg = arg;
  32237. 802b7d8: 6101 str r1, [r0, #16]
  32238. 802b7da: 4770 bx lr
  32239. 0802b7dc <tcp_recv>:
  32240. */
  32241. void
  32242. tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv)
  32243. {
  32244. LWIP_ASSERT("invalid socket state for recv callback", pcb->state != LISTEN);
  32245. pcb->recv = recv;
  32246. 802b7dc: 67c1 str r1, [r0, #124] ; 0x7c
  32247. 802b7de: 4770 bx lr
  32248. 0802b7e0 <tcp_sent>:
  32249. */
  32250. void
  32251. tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent)
  32252. {
  32253. LWIP_ASSERT("invalid socket state for sent callback", pcb->state != LISTEN);
  32254. pcb->sent = sent;
  32255. 802b7e0: 6781 str r1, [r0, #120] ; 0x78
  32256. 802b7e2: 4770 bx lr
  32257. 0802b7e4 <tcp_err>:
  32258. */
  32259. void
  32260. tcp_err(struct tcp_pcb *pcb, tcp_err_fn err)
  32261. {
  32262. LWIP_ASSERT("invalid socket state for err callback", pcb->state != LISTEN);
  32263. pcb->errf = err;
  32264. 802b7e4: f8c0 1088 str.w r1, [r0, #136] ; 0x88
  32265. 802b7e8: 4770 bx lr
  32266. 0802b7ea <tcp_accept>:
  32267. void
  32268. tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept)
  32269. {
  32270. /* This function is allowed to be called for both listen pcbs and
  32271. connection pcbs. */
  32272. pcb->accept = accept;
  32273. 802b7ea: 6141 str r1, [r0, #20]
  32274. 802b7ec: 4770 bx lr
  32275. 0802b7ee <tcp_poll>:
  32276. void
  32277. tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval)
  32278. {
  32279. LWIP_ASSERT("invalid socket state for poll", pcb->state != LISTEN);
  32280. #if LWIP_CALLBACK_API
  32281. pcb->poll = poll;
  32282. 802b7ee: f8c0 1084 str.w r1, [r0, #132] ; 0x84
  32283. #else /* LWIP_CALLBACK_API */
  32284. LWIP_UNUSED_ARG(poll);
  32285. #endif /* LWIP_CALLBACK_API */
  32286. pcb->pollinterval = interval;
  32287. 802b7f2: f880 2020 strb.w r2, [r0, #32]
  32288. 802b7f6: 4770 bx lr
  32289. 0802b7f8 <tcp_pcb_purge>:
  32290. * @param pcb tcp_pcb to purge. The pcb itself is not deallocated!
  32291. */
  32292. void
  32293. tcp_pcb_purge(struct tcp_pcb *pcb)
  32294. {
  32295. if (pcb->state != CLOSED &&
  32296. 802b7f8: 7e03 ldrb r3, [r0, #24]
  32297. *
  32298. * @param pcb tcp_pcb to purge. The pcb itself is not deallocated!
  32299. */
  32300. void
  32301. tcp_pcb_purge(struct tcp_pcb *pcb)
  32302. {
  32303. 802b7fa: b510 push {r4, lr}
  32304. 802b7fc: 4604 mov r4, r0
  32305. if (pcb->state != CLOSED &&
  32306. 802b7fe: b1bb cbz r3, 802b830 <tcp_pcb_purge+0x38>
  32307. 802b800: 2b0a cmp r3, #10
  32308. 802b802: d015 beq.n 802b830 <tcp_pcb_purge+0x38>
  32309. pcb->state != TIME_WAIT &&
  32310. 802b804: 2b01 cmp r3, #1
  32311. 802b806: d013 beq.n 802b830 <tcp_pcb_purge+0x38>
  32312. }
  32313. }
  32314. #endif /* TCP_LISTEN_BACKLOG */
  32315. if (pcb->refused_data != NULL) {
  32316. 802b808: 6f40 ldr r0, [r0, #116] ; 0x74
  32317. 802b80a: b118 cbz r0, 802b814 <tcp_pcb_purge+0x1c>
  32318. LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->refused_data\n"));
  32319. pbuf_free(pcb->refused_data);
  32320. 802b80c: f7ff fd20 bl 802b250 <pbuf_free>
  32321. pcb->refused_data = NULL;
  32322. 802b810: 2300 movs r3, #0
  32323. 802b812: 6763 str r3, [r4, #116] ; 0x74
  32324. pcb->ooseq = NULL;
  32325. #endif /* TCP_QUEUE_OOSEQ */
  32326. /* Stop the retransmission timer as it will expect data on unacked
  32327. queue if it fires */
  32328. pcb->rtime = -1;
  32329. 802b814: f64f 73ff movw r3, #65535 ; 0xffff
  32330. 802b818: 86a3 strh r3, [r4, #52] ; 0x34
  32331. tcp_segs_free(pcb->unsent);
  32332. 802b81a: 6ee0 ldr r0, [r4, #108] ; 0x6c
  32333. 802b81c: f7ff ffd3 bl 802b7c6 <tcp_segs_free>
  32334. tcp_segs_free(pcb->unacked);
  32335. 802b820: 6f20 ldr r0, [r4, #112] ; 0x70
  32336. 802b822: f7ff ffd0 bl 802b7c6 <tcp_segs_free>
  32337. pcb->unacked = pcb->unsent = NULL;
  32338. 802b826: 2300 movs r3, #0
  32339. 802b828: 66e3 str r3, [r4, #108] ; 0x6c
  32340. 802b82a: 6723 str r3, [r4, #112] ; 0x70
  32341. #if TCP_OVERSIZE
  32342. pcb->unsent_oversize = 0;
  32343. 802b82c: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  32344. 802b830: bd10 pop {r4, pc}
  32345. 802b832: 0000 movs r0, r0
  32346. 0802b834 <tcp_slowtmr>:
  32347. u8_t pcb_reset; /* flag if a RST should be sent when removing */
  32348. err_t err;
  32349. err = ERR_OK;
  32350. ++tcp_ticks;
  32351. 802b834: 4b9c ldr r3, [pc, #624] ; (802baa8 <tcp_slowtmr+0x274>)
  32352. *
  32353. * Automatically called from tcp_tmr().
  32354. */
  32355. void
  32356. tcp_slowtmr(void)
  32357. {
  32358. 802b836: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  32359. u8_t pcb_reset; /* flag if a RST should be sent when removing */
  32360. err_t err;
  32361. err = ERR_OK;
  32362. ++tcp_ticks;
  32363. 802b83a: 681a ldr r2, [r3, #0]
  32364. err_arg = pcb->callback_arg;
  32365. pcb2 = pcb;
  32366. pcb = pcb->next;
  32367. memp_free(MEMP_TCP_PCB, pcb2);
  32368. tcp_active_pcbs_changed = 0;
  32369. 802b83c: f8df 8284 ldr.w r8, [pc, #644] ; 802bac4 <tcp_slowtmr+0x290>
  32370. u8_t pcb_reset; /* flag if a RST should be sent when removing */
  32371. err_t err;
  32372. err = ERR_OK;
  32373. ++tcp_ticks;
  32374. 802b840: 3201 adds r2, #1
  32375. 802b842: 601a str r2, [r3, #0]
  32376. ++tcp_timer_ctr;
  32377. 802b844: 4b99 ldr r3, [pc, #612] ; (802baac <tcp_slowtmr+0x278>)
  32378. 802b846: 781a ldrb r2, [r3, #0]
  32379. 802b848: 3201 adds r2, #1
  32380. 802b84a: 701a strb r2, [r3, #0]
  32381. 802b84c: 46c1 mov r9, r8
  32382. tcp_slowtmr_start:
  32383. /* Steps through all of the active PCBs. */
  32384. prev = NULL;
  32385. pcb = tcp_active_pcbs;
  32386. 802b84e: 4b98 ldr r3, [pc, #608] ; (802bab0 <tcp_slowtmr+0x27c>)
  32387. while (pcb != NULL) {
  32388. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n"));
  32389. LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
  32390. LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
  32391. LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
  32392. if (pcb->last_timer == tcp_timer_ctr) {
  32393. 802b850: f8df a258 ldr.w sl, [pc, #600] ; 802baac <tcp_slowtmr+0x278>
  32394. ++tcp_timer_ctr;
  32395. tcp_slowtmr_start:
  32396. /* Steps through all of the active PCBs. */
  32397. prev = NULL;
  32398. pcb = tcp_active_pcbs;
  32399. 802b854: 681c ldr r4, [r3, #0]
  32400. ++tcp_ticks;
  32401. ++tcp_timer_ctr;
  32402. tcp_slowtmr_start:
  32403. /* Steps through all of the active PCBs. */
  32404. prev = NULL;
  32405. 802b856: 2600 movs r6, #0
  32406. pcb = tcp_active_pcbs;
  32407. if (pcb == NULL) {
  32408. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n"));
  32409. }
  32410. while (pcb != NULL) {
  32411. 802b858: e0ff b.n 802ba5a <tcp_slowtmr+0x226>
  32412. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n"));
  32413. LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
  32414. LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
  32415. LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
  32416. if (pcb->last_timer == tcp_timer_ctr) {
  32417. 802b85a: f89a 3000 ldrb.w r3, [sl]
  32418. 802b85e: f894 2021 ldrb.w r2, [r4, #33] ; 0x21
  32419. 802b862: 429a cmp r2, r3
  32420. 802b864: d101 bne.n 802b86a <tcp_slowtmr+0x36>
  32421. /* skip this pcb, we have already processed it */
  32422. pcb = pcb->next;
  32423. 802b866: 68e7 ldr r7, [r4, #12]
  32424. continue;
  32425. 802b868: e0f6 b.n 802ba58 <tcp_slowtmr+0x224>
  32426. pcb->last_timer = tcp_timer_ctr;
  32427. pcb_remove = 0;
  32428. pcb_reset = 0;
  32429. if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) {
  32430. 802b86a: 7e21 ldrb r1, [r4, #24]
  32431. if (pcb->last_timer == tcp_timer_ctr) {
  32432. /* skip this pcb, we have already processed it */
  32433. pcb = pcb->next;
  32434. continue;
  32435. }
  32436. pcb->last_timer = tcp_timer_ctr;
  32437. 802b86c: f884 3021 strb.w r3, [r4, #33] ; 0x21
  32438. pcb_remove = 0;
  32439. pcb_reset = 0;
  32440. if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) {
  32441. 802b870: 2902 cmp r1, #2
  32442. 802b872: f894 2046 ldrb.w r2, [r4, #70] ; 0x46
  32443. 802b876: d101 bne.n 802b87c <tcp_slowtmr+0x48>
  32444. 802b878: 2a06 cmp r2, #6
  32445. 802b87a: d051 beq.n 802b920 <tcp_slowtmr+0xec>
  32446. ++pcb_remove;
  32447. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n"));
  32448. }
  32449. else if (pcb->nrtx == TCP_MAXRTX) {
  32450. 802b87c: 2a0c cmp r2, #12
  32451. 802b87e: d04f beq.n 802b920 <tcp_slowtmr+0xec>
  32452. ++pcb_remove;
  32453. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  32454. } else {
  32455. if (pcb->persist_backoff > 0) {
  32456. 802b880: f894 3091 ldrb.w r3, [r4, #145] ; 0x91
  32457. 802b884: b1c3 cbz r3, 802b8b8 <tcp_slowtmr+0x84>
  32458. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  32459. * instead of using the standard retransmission mechanism. */
  32460. pcb->persist_cnt++;
  32461. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  32462. 802b886: 498b ldr r1, [pc, #556] ; (802bab4 <tcp_slowtmr+0x280>)
  32463. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  32464. } else {
  32465. if (pcb->persist_backoff > 0) {
  32466. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  32467. * instead of using the standard retransmission mechanism. */
  32468. pcb->persist_cnt++;
  32469. 802b888: f894 2090 ldrb.w r2, [r4, #144] ; 0x90
  32470. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  32471. 802b88c: 18c9 adds r1, r1, r3
  32472. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  32473. } else {
  32474. if (pcb->persist_backoff > 0) {
  32475. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  32476. * instead of using the standard retransmission mechanism. */
  32477. pcb->persist_cnt++;
  32478. 802b88e: 3201 adds r2, #1
  32479. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  32480. 802b890: f811 1c01 ldrb.w r1, [r1, #-1]
  32481. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  32482. } else {
  32483. if (pcb->persist_backoff > 0) {
  32484. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  32485. * instead of using the standard retransmission mechanism. */
  32486. pcb->persist_cnt++;
  32487. 802b894: b2d2 uxtb r2, r2
  32488. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  32489. 802b896: 4291 cmp r1, r2
  32490. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
  32491. } else {
  32492. if (pcb->persist_backoff > 0) {
  32493. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  32494. * instead of using the standard retransmission mechanism. */
  32495. pcb->persist_cnt++;
  32496. 802b898: f884 2090 strb.w r2, [r4, #144] ; 0x90
  32497. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  32498. 802b89c: d900 bls.n 802b8a0 <tcp_slowtmr+0x6c>
  32499. 802b89e: e03d b.n 802b91c <tcp_slowtmr+0xe8>
  32500. pcb->persist_cnt = 0;
  32501. 802b8a0: 2200 movs r2, #0
  32502. if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) {
  32503. 802b8a2: 2b06 cmp r3, #6
  32504. if (pcb->persist_backoff > 0) {
  32505. /* If snd_wnd is zero, use persist timer to send 1 byte probes
  32506. * instead of using the standard retransmission mechanism. */
  32507. pcb->persist_cnt++;
  32508. if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) {
  32509. pcb->persist_cnt = 0;
  32510. 802b8a4: f884 2090 strb.w r2, [r4, #144] ; 0x90
  32511. if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) {
  32512. 802b8a8: d802 bhi.n 802b8b0 <tcp_slowtmr+0x7c>
  32513. pcb->persist_backoff++;
  32514. 802b8aa: 3301 adds r3, #1
  32515. 802b8ac: f884 3091 strb.w r3, [r4, #145] ; 0x91
  32516. }
  32517. tcp_zero_window_probe(pcb);
  32518. 802b8b0: 4620 mov r0, r4
  32519. 802b8b2: f001 ff04 bl 802d6be <tcp_zero_window_probe>
  32520. 802b8b6: e031 b.n 802b91c <tcp_slowtmr+0xe8>
  32521. }
  32522. } else {
  32523. /* Increase the retransmission timer if it is running */
  32524. if(pcb->rtime >= 0) {
  32525. 802b8b8: 8ea3 ldrh r3, [r4, #52] ; 0x34
  32526. 802b8ba: 0418 lsls r0, r3, #16
  32527. 802b8bc: d401 bmi.n 802b8c2 <tcp_slowtmr+0x8e>
  32528. ++pcb->rtime;
  32529. 802b8be: 3301 adds r3, #1
  32530. 802b8c0: 86a3 strh r3, [r4, #52] ; 0x34
  32531. }
  32532. if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) {
  32533. 802b8c2: 6f23 ldr r3, [r4, #112] ; 0x70
  32534. 802b8c4: b353 cbz r3, 802b91c <tcp_slowtmr+0xe8>
  32535. 802b8c6: f9b4 0034 ldrsh.w r0, [r4, #52] ; 0x34
  32536. 802b8ca: f9b4 3044 ldrsh.w r3, [r4, #68] ; 0x44
  32537. 802b8ce: 4298 cmp r0, r3
  32538. 802b8d0: db24 blt.n 802b91c <tcp_slowtmr+0xe8>
  32539. " pcb->rto %"S16_F"\n",
  32540. pcb->rtime, pcb->rto));
  32541. /* Double retransmission time-out unless we are trying to
  32542. * connect to somebody (i.e., we are in SYN_SENT). */
  32543. if (pcb->state != SYN_SENT) {
  32544. 802b8d2: 2902 cmp r1, #2
  32545. 802b8d4: d00b beq.n 802b8ee <tcp_slowtmr+0xba>
  32546. pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx];
  32547. 802b8d6: f9b4 1040 ldrsh.w r1, [r4, #64] ; 0x40
  32548. 802b8da: f9b4 3042 ldrsh.w r3, [r4, #66] ; 0x42
  32549. 802b8de: eb03 03e1 add.w r3, r3, r1, asr #3
  32550. 802b8e2: 4975 ldr r1, [pc, #468] ; (802bab8 <tcp_slowtmr+0x284>)
  32551. 802b8e4: 5c8a ldrb r2, [r1, r2]
  32552. 802b8e6: fa03 f302 lsl.w r3, r3, r2
  32553. 802b8ea: f8a4 3044 strh.w r3, [r4, #68] ; 0x44
  32554. }
  32555. /* Reset the retransmission timer. */
  32556. pcb->rtime = 0;
  32557. 802b8ee: 2300 movs r3, #0
  32558. /* Reduce congestion window and ssthresh. */
  32559. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  32560. 802b8f0: f8b4 104c ldrh.w r1, [r4, #76] ; 0x4c
  32561. if (pcb->state != SYN_SENT) {
  32562. pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx];
  32563. }
  32564. /* Reset the retransmission timer. */
  32565. pcb->rtime = 0;
  32566. 802b8f4: 86a3 strh r3, [r4, #52] ; 0x34
  32567. /* Reduce congestion window and ssthresh. */
  32568. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  32569. 802b8f6: f8b4 3060 ldrh.w r3, [r4, #96] ; 0x60
  32570. pcb->ssthresh = eff_wnd >> 1;
  32571. 802b8fa: 4299 cmp r1, r3
  32572. 802b8fc: bf28 it cs
  32573. 802b8fe: 4619 movcs r1, r3
  32574. if (pcb->ssthresh < (pcb->mss << 1)) {
  32575. 802b900: 8ee3 ldrh r3, [r4, #54] ; 0x36
  32576. /* Reset the retransmission timer. */
  32577. pcb->rtime = 0;
  32578. /* Reduce congestion window and ssthresh. */
  32579. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  32580. pcb->ssthresh = eff_wnd >> 1;
  32581. 802b902: 0849 lsrs r1, r1, #1
  32582. if (pcb->ssthresh < (pcb->mss << 1)) {
  32583. 802b904: 005a lsls r2, r3, #1
  32584. 802b906: 4291 cmp r1, r2
  32585. /* Reset the retransmission timer. */
  32586. pcb->rtime = 0;
  32587. /* Reduce congestion window and ssthresh. */
  32588. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  32589. pcb->ssthresh = eff_wnd >> 1;
  32590. 802b908: f8a4 104e strh.w r1, [r4, #78] ; 0x4e
  32591. if (pcb->ssthresh < (pcb->mss << 1)) {
  32592. pcb->ssthresh = (pcb->mss << 1);
  32593. }
  32594. pcb->cwnd = pcb->mss;
  32595. 802b90c: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  32596. /* Reduce congestion window and ssthresh. */
  32597. eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  32598. pcb->ssthresh = eff_wnd >> 1;
  32599. if (pcb->ssthresh < (pcb->mss << 1)) {
  32600. pcb->ssthresh = (pcb->mss << 1);
  32601. 802b910: bfb8 it lt
  32602. 802b912: f8a4 204e strhlt.w r2, [r4, #78] ; 0x4e
  32603. " ssthresh %"U16_F"\n",
  32604. pcb->cwnd, pcb->ssthresh));
  32605. /* The following needs to be called AFTER cwnd is set to one
  32606. mss - STJ */
  32607. tcp_rexmit_rto(pcb);
  32608. 802b916: 4620 mov r0, r4
  32609. 802b918: f001 fe40 bl 802d59c <tcp_rexmit_rto>
  32610. pcb = pcb->next;
  32611. continue;
  32612. }
  32613. pcb->last_timer = tcp_timer_ctr;
  32614. pcb_remove = 0;
  32615. 802b91c: 2500 movs r5, #0
  32616. 802b91e: e000 b.n 802b922 <tcp_slowtmr+0xee>
  32617. pcb_reset = 0;
  32618. if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) {
  32619. ++pcb_remove;
  32620. 802b920: 2501 movs r5, #1
  32621. tcp_rexmit_rto(pcb);
  32622. }
  32623. }
  32624. }
  32625. /* Check if this PCB has stayed too long in FIN-WAIT-2 */
  32626. if (pcb->state == FIN_WAIT_2) {
  32627. 802b922: 7e23 ldrb r3, [r4, #24]
  32628. 802b924: 2b06 cmp r3, #6
  32629. 802b926: d10c bne.n 802b942 <tcp_slowtmr+0x10e>
  32630. /* If this PCB is in FIN_WAIT_2 because of SHUT_WR don't let it time out. */
  32631. if (pcb->flags & TF_RXCLOSED) {
  32632. 802b928: 7fa2 ldrb r2, [r4, #30]
  32633. 802b92a: f002 0210 and.w r2, r2, #16
  32634. 802b92e: b2d2 uxtb r2, r2
  32635. 802b930: b13a cbz r2, 802b942 <tcp_slowtmr+0x10e>
  32636. /* PCB was fully closed (either through close() or SHUT_RDWR):
  32637. normal FIN-WAIT timeout handling. */
  32638. if ((u32_t)(tcp_ticks - pcb->tmr) >
  32639. 802b932: 4a5d ldr r2, [pc, #372] ; (802baa8 <tcp_slowtmr+0x274>)
  32640. 802b934: 6811 ldr r1, [r2, #0]
  32641. 802b936: 6a62 ldr r2, [r4, #36] ; 0x24
  32642. 802b938: 1a8a subs r2, r1, r2
  32643. 802b93a: 2a28 cmp r2, #40 ; 0x28
  32644. 802b93c: d901 bls.n 802b942 <tcp_slowtmr+0x10e>
  32645. TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
  32646. ++pcb_remove;
  32647. 802b93e: 3501 adds r5, #1
  32648. 802b940: b2ed uxtb r5, r5
  32649. }
  32650. }
  32651. }
  32652. /* Check if KEEPALIVE should be sent */
  32653. if(ip_get_option(pcb, SOF_KEEPALIVE) &&
  32654. 802b942: 7a27 ldrb r7, [r4, #8]
  32655. 802b944: f007 0708 and.w r7, r7, #8
  32656. 802b948: b2ff uxtb r7, r7
  32657. 802b94a: b34f cbz r7, 802b9a0 <tcp_slowtmr+0x16c>
  32658. 802b94c: 2b04 cmp r3, #4
  32659. 802b94e: d001 beq.n 802b954 <tcp_slowtmr+0x120>
  32660. ((pcb->state == ESTABLISHED) ||
  32661. 802b950: 2b07 cmp r3, #7
  32662. 802b952: d124 bne.n 802b99e <tcp_slowtmr+0x16a>
  32663. (pcb->state == CLOSE_WAIT))) {
  32664. if((u32_t)(tcp_ticks - pcb->tmr) >
  32665. 802b954: 4b54 ldr r3, [pc, #336] ; (802baa8 <tcp_slowtmr+0x274>)
  32666. (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL)
  32667. 802b956: f8d4 008c ldr.w r0, [r4, #140] ; 0x8c
  32668. /* Check if KEEPALIVE should be sent */
  32669. if(ip_get_option(pcb, SOF_KEEPALIVE) &&
  32670. ((pcb->state == ESTABLISHED) ||
  32671. (pcb->state == CLOSE_WAIT))) {
  32672. if((u32_t)(tcp_ticks - pcb->tmr) >
  32673. 802b95a: 681a ldr r2, [r3, #0]
  32674. 802b95c: 6a63 ldr r3, [r4, #36] ; 0x24
  32675. 802b95e: 1ad2 subs r2, r2, r3
  32676. (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL)
  32677. 802b960: f500 2324 add.w r3, r0, #671744 ; 0xa4000
  32678. 802b964: f603 43b8 addw r3, r3, #3256 ; 0xcb8
  32679. 802b968: f44f 71fa mov.w r1, #500 ; 0x1f4
  32680. 802b96c: fbb3 f3f1 udiv r3, r3, r1
  32681. /* Check if KEEPALIVE should be sent */
  32682. if(ip_get_option(pcb, SOF_KEEPALIVE) &&
  32683. ((pcb->state == ESTABLISHED) ||
  32684. (pcb->state == CLOSE_WAIT))) {
  32685. if((u32_t)(tcp_ticks - pcb->tmr) >
  32686. 802b970: 429a cmp r2, r3
  32687. 802b972: d903 bls.n 802b97c <tcp_slowtmr+0x148>
  32688. {
  32689. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to %"U16_F".%"U16_F".%"U16_F".%"U16_F".\n",
  32690. ip4_addr1_16(&pcb->remote_ip), ip4_addr2_16(&pcb->remote_ip),
  32691. ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip)));
  32692. ++pcb_remove;
  32693. 802b974: 3501 adds r5, #1
  32694. 802b976: b2ed uxtb r5, r5
  32695. ++pcb_reset;
  32696. 802b978: 2701 movs r7, #1
  32697. 802b97a: e011 b.n 802b9a0 <tcp_slowtmr+0x16c>
  32698. }
  32699. else if((u32_t)(tcp_ticks - pcb->tmr) >
  32700. (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))
  32701. 802b97c: f894 3092 ldrb.w r3, [r4, #146] ; 0x92
  32702. 802b980: 4f4e ldr r7, [pc, #312] ; (802babc <tcp_slowtmr+0x288>)
  32703. 802b982: fb07 0003 mla r0, r7, r3, r0
  32704. / TCP_SLOW_INTERVAL)
  32705. 802b986: fbb0 f1f1 udiv r1, r0, r1
  32706. ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip)));
  32707. ++pcb_remove;
  32708. ++pcb_reset;
  32709. }
  32710. else if((u32_t)(tcp_ticks - pcb->tmr) >
  32711. 802b98a: 428a cmp r2, r1
  32712. 802b98c: d907 bls.n 802b99e <tcp_slowtmr+0x16a>
  32713. (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))
  32714. / TCP_SLOW_INTERVAL)
  32715. {
  32716. tcp_keepalive(pcb);
  32717. 802b98e: 4620 mov r0, r4
  32718. 802b990: f001 fe76 bl 802d680 <tcp_keepalive>
  32719. pcb->keep_cnt_sent++;
  32720. 802b994: f894 3092 ldrb.w r3, [r4, #146] ; 0x92
  32721. 802b998: 3301 adds r3, #1
  32722. 802b99a: f884 3092 strb.w r3, [r4, #146] ; 0x92
  32723. continue;
  32724. }
  32725. pcb->last_timer = tcp_timer_ctr;
  32726. pcb_remove = 0;
  32727. pcb_reset = 0;
  32728. 802b99e: 2700 movs r7, #0
  32729. LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n"));
  32730. }
  32731. #endif /* TCP_QUEUE_OOSEQ */
  32732. /* Check if this PCB has stayed too long in SYN-RCVD */
  32733. if (pcb->state == SYN_RCVD) {
  32734. 802b9a0: 7e23 ldrb r3, [r4, #24]
  32735. 802b9a2: 2b03 cmp r3, #3
  32736. 802b9a4: d108 bne.n 802b9b8 <tcp_slowtmr+0x184>
  32737. if ((u32_t)(tcp_ticks - pcb->tmr) >
  32738. 802b9a6: 4b40 ldr r3, [pc, #256] ; (802baa8 <tcp_slowtmr+0x274>)
  32739. 802b9a8: 681a ldr r2, [r3, #0]
  32740. 802b9aa: 6a63 ldr r3, [r4, #36] ; 0x24
  32741. 802b9ac: 1ad3 subs r3, r2, r3
  32742. 802b9ae: 2b28 cmp r3, #40 ; 0x28
  32743. 802b9b0: d90a bls.n 802b9c8 <tcp_slowtmr+0x194>
  32744. TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {
  32745. ++pcb_remove;
  32746. 802b9b2: 3501 adds r5, #1
  32747. 802b9b4: b2ed uxtb r5, r5
  32748. 802b9b6: e007 b.n 802b9c8 <tcp_slowtmr+0x194>
  32749. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n"));
  32750. }
  32751. }
  32752. /* Check if this PCB has stayed too long in LAST-ACK */
  32753. if (pcb->state == LAST_ACK) {
  32754. 802b9b8: 2b09 cmp r3, #9
  32755. 802b9ba: d105 bne.n 802b9c8 <tcp_slowtmr+0x194>
  32756. if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
  32757. 802b9bc: 4b3a ldr r3, [pc, #232] ; (802baa8 <tcp_slowtmr+0x274>)
  32758. 802b9be: 681a ldr r2, [r3, #0]
  32759. 802b9c0: 6a63 ldr r3, [r4, #36] ; 0x24
  32760. 802b9c2: 1ad3 subs r3, r2, r3
  32761. 802b9c4: 2bf0 cmp r3, #240 ; 0xf0
  32762. 802b9c6: d800 bhi.n 802b9ca <tcp_slowtmr+0x196>
  32763. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in LAST-ACK\n"));
  32764. }
  32765. }
  32766. /* If the PCB should be removed, do it. */
  32767. if (pcb_remove) {
  32768. 802b9c8: b345 cbz r5, 802ba1c <tcp_slowtmr+0x1e8>
  32769. struct tcp_pcb *pcb2;
  32770. tcp_err_fn err_fn;
  32771. void *err_arg;
  32772. tcp_pcb_purge(pcb);
  32773. 802b9ca: 4620 mov r0, r4
  32774. 802b9cc: f7ff ff14 bl 802b7f8 <tcp_pcb_purge>
  32775. 802b9d0: 68e3 ldr r3, [r4, #12]
  32776. /* Remove PCB from tcp_active_pcbs list. */
  32777. if (prev != NULL) {
  32778. 802b9d2: b10e cbz r6, 802b9d8 <tcp_slowtmr+0x1a4>
  32779. LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
  32780. prev->next = pcb->next;
  32781. 802b9d4: 60f3 str r3, [r6, #12]
  32782. 802b9d6: e001 b.n 802b9dc <tcp_slowtmr+0x1a8>
  32783. } else {
  32784. /* This PCB was the first. */
  32785. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
  32786. tcp_active_pcbs = pcb->next;
  32787. 802b9d8: 4a35 ldr r2, [pc, #212] ; (802bab0 <tcp_slowtmr+0x27c>)
  32788. 802b9da: 6013 str r3, [r2, #0]
  32789. }
  32790. if (pcb_reset) {
  32791. 802b9dc: b14f cbz r7, 802b9f2 <tcp_slowtmr+0x1be>
  32792. tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  32793. 802b9de: 8b63 ldrh r3, [r4, #26]
  32794. 802b9e0: 9300 str r3, [sp, #0]
  32795. 802b9e2: 8ba3 ldrh r3, [r4, #28]
  32796. 802b9e4: 9301 str r3, [sp, #4]
  32797. 802b9e6: 6d20 ldr r0, [r4, #80] ; 0x50
  32798. 802b9e8: 6aa1 ldr r1, [r4, #40] ; 0x28
  32799. 802b9ea: 4622 mov r2, r4
  32800. 802b9ec: 1d23 adds r3, r4, #4
  32801. 802b9ee: f001 fd8f bl 802d510 <tcp_rst>
  32802. pcb->local_port, pcb->remote_port);
  32803. }
  32804. err_fn = pcb->errf;
  32805. 802b9f2: f8d4 5088 ldr.w r5, [r4, #136] ; 0x88
  32806. err_arg = pcb->callback_arg;
  32807. 802b9f6: f8d4 b010 ldr.w fp, [r4, #16]
  32808. pcb2 = pcb;
  32809. pcb = pcb->next;
  32810. 802b9fa: 68e7 ldr r7, [r4, #12]
  32811. memp_free(MEMP_TCP_PCB, pcb2);
  32812. 802b9fc: 2002 movs r0, #2
  32813. 802b9fe: 4621 mov r1, r4
  32814. 802ba00: f7ff fb1c bl 802b03c <memp_free>
  32815. tcp_active_pcbs_changed = 0;
  32816. 802ba04: 2300 movs r3, #0
  32817. 802ba06: f888 3000 strb.w r3, [r8]
  32818. TCP_EVENT_ERR(err_fn, err_arg, ERR_ABRT);
  32819. 802ba0a: b11d cbz r5, 802ba14 <tcp_slowtmr+0x1e0>
  32820. 802ba0c: 4658 mov r0, fp
  32821. 802ba0e: f06f 0109 mvn.w r1, #9
  32822. 802ba12: 47a8 blx r5
  32823. if (tcp_active_pcbs_changed) {
  32824. 802ba14: f899 3000 ldrb.w r3, [r9]
  32825. 802ba18: b1f3 cbz r3, 802ba58 <tcp_slowtmr+0x224>
  32826. 802ba1a: e718 b.n 802b84e <tcp_slowtmr+0x1a>
  32827. /* get the 'next' element now and work with 'prev' below (in case of abort) */
  32828. prev = pcb;
  32829. pcb = pcb->next;
  32830. /* We check if we should poll the connection. */
  32831. ++prev->polltmr;
  32832. 802ba1c: 7fe3 ldrb r3, [r4, #31]
  32833. if (prev->polltmr >= prev->pollinterval) {
  32834. 802ba1e: f894 2020 ldrb.w r2, [r4, #32]
  32835. goto tcp_slowtmr_start;
  32836. }
  32837. } else {
  32838. /* get the 'next' element now and work with 'prev' below (in case of abort) */
  32839. prev = pcb;
  32840. pcb = pcb->next;
  32841. 802ba22: 68e7 ldr r7, [r4, #12]
  32842. /* We check if we should poll the connection. */
  32843. ++prev->polltmr;
  32844. 802ba24: 3301 adds r3, #1
  32845. 802ba26: b2db uxtb r3, r3
  32846. if (prev->polltmr >= prev->pollinterval) {
  32847. 802ba28: 429a cmp r2, r3
  32848. /* get the 'next' element now and work with 'prev' below (in case of abort) */
  32849. prev = pcb;
  32850. pcb = pcb->next;
  32851. /* We check if we should poll the connection. */
  32852. ++prev->polltmr;
  32853. 802ba2a: 77e3 strb r3, [r4, #31]
  32854. if (prev->polltmr >= prev->pollinterval) {
  32855. 802ba2c: d813 bhi.n 802ba56 <tcp_slowtmr+0x222>
  32856. prev->polltmr = 0;
  32857. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n"));
  32858. tcp_active_pcbs_changed = 0;
  32859. TCP_EVENT_POLL(prev, err);
  32860. 802ba2e: f8d4 3084 ldr.w r3, [r4, #132] ; 0x84
  32861. pcb = pcb->next;
  32862. /* We check if we should poll the connection. */
  32863. ++prev->polltmr;
  32864. if (prev->polltmr >= prev->pollinterval) {
  32865. prev->polltmr = 0;
  32866. 802ba32: 77e5 strb r5, [r4, #31]
  32867. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n"));
  32868. tcp_active_pcbs_changed = 0;
  32869. 802ba34: f888 5000 strb.w r5, [r8]
  32870. TCP_EVENT_POLL(prev, err);
  32871. 802ba38: b11b cbz r3, 802ba42 <tcp_slowtmr+0x20e>
  32872. 802ba3a: 6920 ldr r0, [r4, #16]
  32873. 802ba3c: 4621 mov r1, r4
  32874. 802ba3e: 4798 blx r3
  32875. 802ba40: e000 b.n 802ba44 <tcp_slowtmr+0x210>
  32876. 802ba42: 4628 mov r0, r5
  32877. if (tcp_active_pcbs_changed) {
  32878. 802ba44: f899 3000 ldrb.w r3, [r9]
  32879. 802ba48: 2b00 cmp r3, #0
  32880. 802ba4a: f47f af00 bne.w 802b84e <tcp_slowtmr+0x1a>
  32881. goto tcp_slowtmr_start;
  32882. }
  32883. /* if err == ERR_ABRT, 'prev' is already deallocated */
  32884. if (err == ERR_OK) {
  32885. 802ba4e: b910 cbnz r0, 802ba56 <tcp_slowtmr+0x222>
  32886. tcp_output(prev);
  32887. 802ba50: 4620 mov r0, r4
  32888. 802ba52: f001 fc39 bl 802d2c8 <tcp_output>
  32889. TCP_EVENT_POLL(prev, err);
  32890. if (tcp_active_pcbs_changed) {
  32891. goto tcp_slowtmr_start;
  32892. }
  32893. /* if err == ERR_ABRT, 'prev' is already deallocated */
  32894. if (err == ERR_OK) {
  32895. 802ba56: 4626 mov r6, r4
  32896. prev = pcb;
  32897. pcb = pcb->next;
  32898. /* We check if we should poll the connection. */
  32899. ++prev->polltmr;
  32900. if (prev->polltmr >= prev->pollinterval) {
  32901. 802ba58: 463c mov r4, r7
  32902. prev = NULL;
  32903. pcb = tcp_active_pcbs;
  32904. if (pcb == NULL) {
  32905. LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n"));
  32906. }
  32907. while (pcb != NULL) {
  32908. 802ba5a: 2c00 cmp r4, #0
  32909. 802ba5c: f47f aefd bne.w 802b85a <tcp_slowtmr+0x26>
  32910. }
  32911. /* Steps through all of the TIME-WAIT PCBs. */
  32912. prev = NULL;
  32913. pcb = tcp_tw_pcbs;
  32914. 802ba60: 4b17 ldr r3, [pc, #92] ; (802bac0 <tcp_slowtmr+0x28c>)
  32915. while (pcb != NULL) {
  32916. LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  32917. pcb_remove = 0;
  32918. /* Check if this PCB has stayed long enough in TIME-WAIT */
  32919. if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
  32920. 802ba62: 4e11 ldr r6, [pc, #68] ; (802baa8 <tcp_slowtmr+0x274>)
  32921. }
  32922. /* Steps through all of the TIME-WAIT PCBs. */
  32923. prev = NULL;
  32924. pcb = tcp_tw_pcbs;
  32925. 802ba64: 681d ldr r5, [r3, #0]
  32926. LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
  32927. prev->next = pcb->next;
  32928. } else {
  32929. /* This PCB was the first. */
  32930. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  32931. tcp_tw_pcbs = pcb->next;
  32932. 802ba66: 461f mov r7, r3
  32933. /* Steps through all of the TIME-WAIT PCBs. */
  32934. prev = NULL;
  32935. pcb = tcp_tw_pcbs;
  32936. while (pcb != NULL) {
  32937. 802ba68: e00f b.n 802ba8a <tcp_slowtmr+0x256>
  32938. LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  32939. pcb_remove = 0;
  32940. /* Check if this PCB has stayed long enough in TIME-WAIT */
  32941. if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
  32942. 802ba6a: 6832 ldr r2, [r6, #0]
  32943. 802ba6c: 6a6b ldr r3, [r5, #36] ; 0x24
  32944. 802ba6e: 1ad3 subs r3, r2, r3
  32945. 802ba70: 2bf0 cmp r3, #240 ; 0xf0
  32946. 802ba72: d810 bhi.n 802ba96 <tcp_slowtmr+0x262>
  32947. 802ba74: e00c b.n 802ba90 <tcp_slowtmr+0x25c>
  32948. struct tcp_pcb *pcb2;
  32949. tcp_pcb_purge(pcb);
  32950. /* Remove PCB from tcp_tw_pcbs list. */
  32951. if (prev != NULL) {
  32952. LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
  32953. prev->next = pcb->next;
  32954. 802ba76: 60e2 str r2, [r4, #12]
  32955. 802ba78: e000 b.n 802ba7c <tcp_slowtmr+0x248>
  32956. } else {
  32957. /* This PCB was the first. */
  32958. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  32959. tcp_tw_pcbs = pcb->next;
  32960. 802ba7a: 603a str r2, [r7, #0]
  32961. }
  32962. pcb2 = pcb;
  32963. pcb = pcb->next;
  32964. memp_free(MEMP_TCP_PCB, pcb2);
  32965. 802ba7c: 4629 mov r1, r5
  32966. 802ba7e: 2002 movs r0, #2
  32967. /* This PCB was the first. */
  32968. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  32969. tcp_tw_pcbs = pcb->next;
  32970. }
  32971. pcb2 = pcb;
  32972. pcb = pcb->next;
  32973. 802ba80: f8d5 800c ldr.w r8, [r5, #12]
  32974. memp_free(MEMP_TCP_PCB, pcb2);
  32975. 802ba84: f7ff fada bl 802b03c <memp_free>
  32976. /* This PCB was the first. */
  32977. LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  32978. tcp_tw_pcbs = pcb->next;
  32979. }
  32980. pcb2 = pcb;
  32981. pcb = pcb->next;
  32982. 802ba88: 4645 mov r5, r8
  32983. /* Steps through all of the TIME-WAIT PCBs. */
  32984. prev = NULL;
  32985. pcb = tcp_tw_pcbs;
  32986. while (pcb != NULL) {
  32987. 802ba8a: 2d00 cmp r5, #0
  32988. 802ba8c: d1ed bne.n 802ba6a <tcp_slowtmr+0x236>
  32989. 802ba8e: e009 b.n 802baa4 <tcp_slowtmr+0x270>
  32990. pcb2 = pcb;
  32991. pcb = pcb->next;
  32992. memp_free(MEMP_TCP_PCB, pcb2);
  32993. } else {
  32994. prev = pcb;
  32995. pcb = pcb->next;
  32996. 802ba90: 462c mov r4, r5
  32997. 802ba92: 68ed ldr r5, [r5, #12]
  32998. 802ba94: e7f9 b.n 802ba8a <tcp_slowtmr+0x256>
  32999. /* If the PCB should be removed, do it. */
  33000. if (pcb_remove) {
  33001. struct tcp_pcb *pcb2;
  33002. tcp_pcb_purge(pcb);
  33003. 802ba96: 4628 mov r0, r5
  33004. 802ba98: f7ff feae bl 802b7f8 <tcp_pcb_purge>
  33005. 802ba9c: 68ea ldr r2, [r5, #12]
  33006. /* Remove PCB from tcp_tw_pcbs list. */
  33007. if (prev != NULL) {
  33008. 802ba9e: 2c00 cmp r4, #0
  33009. 802baa0: d1e9 bne.n 802ba76 <tcp_slowtmr+0x242>
  33010. 802baa2: e7ea b.n 802ba7a <tcp_slowtmr+0x246>
  33011. } else {
  33012. prev = pcb;
  33013. pcb = pcb->next;
  33014. }
  33015. }
  33016. }
  33017. 802baa4: e8bd 8ffe ldmia.w sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  33018. 802baa8: 20010d7c .word 0x20010d7c
  33019. 802baac: 2000e0a1 .word 0x2000e0a1
  33020. 802bab0: 20010d78 .word 0x20010d78
  33021. 802bab4: 0803abf1 .word 0x0803abf1
  33022. 802bab8: 0803abe4 .word 0x0803abe4
  33023. 802babc: 000124f8 .word 0x000124f8
  33024. 802bac0: 20010d8c .word 0x20010d8c
  33025. 802bac4: 20010d74 .word 0x20010d74
  33026. 0802bac8 <tcp_pcb_remove>:
  33027. * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated!
  33028. */
  33029. void
  33030. tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
  33031. {
  33032. TCP_RMV(pcblist, pcb);
  33033. 802bac8: 6803 ldr r3, [r0, #0]
  33034. 802baca: 428b cmp r3, r1
  33035. * @param pcblist PCB list to purge.
  33036. * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated!
  33037. */
  33038. void
  33039. tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
  33040. {
  33041. 802bacc: b510 push {r4, lr}
  33042. 802bace: 460c mov r4, r1
  33043. TCP_RMV(pcblist, pcb);
  33044. 802bad0: d102 bne.n 802bad8 <tcp_pcb_remove+0x10>
  33045. 802bad2: 68cb ldr r3, [r1, #12]
  33046. 802bad4: 6003 str r3, [r0, #0]
  33047. 802bad6: e00d b.n 802baf4 <tcp_pcb_remove+0x2c>
  33048. 802bad8: 4a11 ldr r2, [pc, #68] ; (802bb20 <tcp_pcb_remove+0x58>)
  33049. 802bada: 6013 str r3, [r2, #0]
  33050. 802badc: e007 b.n 802baee <tcp_pcb_remove+0x26>
  33051. 802bade: 68d9 ldr r1, [r3, #12]
  33052. 802bae0: 42a1 cmp r1, r4
  33053. 802bae2: d103 bne.n 802baec <tcp_pcb_remove+0x24>
  33054. 802bae4: 6013 str r3, [r2, #0]
  33055. 802bae6: 68e2 ldr r2, [r4, #12]
  33056. 802bae8: 60da str r2, [r3, #12]
  33057. 802baea: e003 b.n 802baf4 <tcp_pcb_remove+0x2c>
  33058. 802baec: 460b mov r3, r1
  33059. 802baee: 2b00 cmp r3, #0
  33060. 802baf0: d1f5 bne.n 802bade <tcp_pcb_remove+0x16>
  33061. 802baf2: 6013 str r3, [r2, #0]
  33062. 802baf4: 2300 movs r3, #0
  33063. 802baf6: 60e3 str r3, [r4, #12]
  33064. tcp_pcb_purge(pcb);
  33065. 802baf8: 4620 mov r0, r4
  33066. 802bafa: f7ff fe7d bl 802b7f8 <tcp_pcb_purge>
  33067. /* if there is an outstanding delayed ACKs, send it */
  33068. if (pcb->state != TIME_WAIT &&
  33069. 802bafe: 7e23 ldrb r3, [r4, #24]
  33070. 802bb00: 2b0a cmp r3, #10
  33071. 802bb02: d00a beq.n 802bb1a <tcp_pcb_remove+0x52>
  33072. 802bb04: 2b01 cmp r3, #1
  33073. 802bb06: d008 beq.n 802bb1a <tcp_pcb_remove+0x52>
  33074. pcb->state != LISTEN &&
  33075. pcb->flags & TF_ACK_DELAY) {
  33076. 802bb08: 7fa3 ldrb r3, [r4, #30]
  33077. tcp_pcb_purge(pcb);
  33078. /* if there is an outstanding delayed ACKs, send it */
  33079. if (pcb->state != TIME_WAIT &&
  33080. pcb->state != LISTEN &&
  33081. 802bb0a: 07da lsls r2, r3, #31
  33082. 802bb0c: d505 bpl.n 802bb1a <tcp_pcb_remove+0x52>
  33083. pcb->flags & TF_ACK_DELAY) {
  33084. pcb->flags |= TF_ACK_NOW;
  33085. 802bb0e: f043 0302 orr.w r3, r3, #2
  33086. 802bb12: 77a3 strb r3, [r4, #30]
  33087. tcp_output(pcb);
  33088. 802bb14: 4620 mov r0, r4
  33089. 802bb16: f001 fbd7 bl 802d2c8 <tcp_output>
  33090. #if TCP_QUEUE_OOSEQ
  33091. LWIP_ASSERT("ooseq segments leaking", pcb->ooseq == NULL);
  33092. #endif /* TCP_QUEUE_OOSEQ */
  33093. }
  33094. pcb->state = CLOSED;
  33095. 802bb1a: 2300 movs r3, #0
  33096. 802bb1c: 7623 strb r3, [r4, #24]
  33097. 802bb1e: bd10 pop {r4, pc}
  33098. 802bb20: 20010d84 .word 0x20010d84
  33099. 0802bb24 <tcp_abandon>:
  33100. LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs",
  33101. pcb->state != LISTEN);
  33102. /* Figure out on which TCP PCB list we are, and remove us. If we
  33103. are in an active state, call the receive function associated with
  33104. the PCB with a NULL argument, and send an RST to the remote end. */
  33105. if (pcb->state == TIME_WAIT) {
  33106. 802bb24: 7e03 ldrb r3, [r0, #24]
  33107. 802bb26: 2b0a cmp r3, #10
  33108. * @param pcb the tcp_pcb to abort
  33109. * @param reset boolean to indicate whether a reset should be sent
  33110. */
  33111. void
  33112. tcp_abandon(struct tcp_pcb *pcb, int reset)
  33113. {
  33114. 802bb28: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr}
  33115. 802bb2c: 4604 mov r4, r0
  33116. 802bb2e: 4689 mov r9, r1
  33117. LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs",
  33118. pcb->state != LISTEN);
  33119. /* Figure out on which TCP PCB list we are, and remove us. If we
  33120. are in an active state, call the receive function associated with
  33121. the PCB with a NULL argument, and send an RST to the remote end. */
  33122. if (pcb->state == TIME_WAIT) {
  33123. 802bb30: d10a bne.n 802bb48 <tcp_abandon+0x24>
  33124. tcp_pcb_remove(&tcp_tw_pcbs, pcb);
  33125. 802bb32: 4621 mov r1, r4
  33126. 802bb34: 481b ldr r0, [pc, #108] ; (802bba4 <tcp_abandon+0x80>)
  33127. 802bb36: f7ff ffc7 bl 802bac8 <tcp_pcb_remove>
  33128. memp_free(MEMP_TCP_PCB, pcb);
  33129. 802bb3a: 2002 movs r0, #2
  33130. 802bb3c: 4621 mov r1, r4
  33131. tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, pcb->local_port, pcb->remote_port);
  33132. }
  33133. memp_free(MEMP_TCP_PCB, pcb);
  33134. TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT);
  33135. }
  33136. }
  33137. 802bb3e: b003 add sp, #12
  33138. 802bb40: e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr}
  33139. /* Figure out on which TCP PCB list we are, and remove us. If we
  33140. are in an active state, call the receive function associated with
  33141. the PCB with a NULL argument, and send an RST to the remote end. */
  33142. if (pcb->state == TIME_WAIT) {
  33143. tcp_pcb_remove(&tcp_tw_pcbs, pcb);
  33144. memp_free(MEMP_TCP_PCB, pcb);
  33145. 802bb44: f7ff ba7a b.w 802b03c <memp_free>
  33146. } else {
  33147. seqno = pcb->snd_nxt;
  33148. 802bb48: f8d0 8050 ldr.w r8, [r0, #80] ; 0x50
  33149. ackno = pcb->rcv_nxt;
  33150. 802bb4c: 6a87 ldr r7, [r0, #40] ; 0x28
  33151. #if LWIP_CALLBACK_API
  33152. errf = pcb->errf;
  33153. 802bb4e: f8d0 5088 ldr.w r5, [r0, #136] ; 0x88
  33154. #endif /* LWIP_CALLBACK_API */
  33155. errf_arg = pcb->callback_arg;
  33156. 802bb52: 6906 ldr r6, [r0, #16]
  33157. TCP_PCB_REMOVE_ACTIVE(pcb);
  33158. 802bb54: 4814 ldr r0, [pc, #80] ; (802bba8 <tcp_abandon+0x84>)
  33159. 802bb56: 4621 mov r1, r4
  33160. 802bb58: f7ff ffb6 bl 802bac8 <tcp_pcb_remove>
  33161. 802bb5c: 4b13 ldr r3, [pc, #76] ; (802bbac <tcp_abandon+0x88>)
  33162. if (pcb->unacked != NULL) {
  33163. 802bb5e: 6f20 ldr r0, [r4, #112] ; 0x70
  33164. ackno = pcb->rcv_nxt;
  33165. #if LWIP_CALLBACK_API
  33166. errf = pcb->errf;
  33167. #endif /* LWIP_CALLBACK_API */
  33168. errf_arg = pcb->callback_arg;
  33169. TCP_PCB_REMOVE_ACTIVE(pcb);
  33170. 802bb60: 2201 movs r2, #1
  33171. 802bb62: 701a strb r2, [r3, #0]
  33172. if (pcb->unacked != NULL) {
  33173. 802bb64: b108 cbz r0, 802bb6a <tcp_abandon+0x46>
  33174. tcp_segs_free(pcb->unacked);
  33175. 802bb66: f7ff fe2e bl 802b7c6 <tcp_segs_free>
  33176. }
  33177. if (pcb->unsent != NULL) {
  33178. 802bb6a: 6ee0 ldr r0, [r4, #108] ; 0x6c
  33179. 802bb6c: b108 cbz r0, 802bb72 <tcp_abandon+0x4e>
  33180. tcp_segs_free(pcb->unsent);
  33181. 802bb6e: f7ff fe2a bl 802b7c6 <tcp_segs_free>
  33182. #if TCP_QUEUE_OOSEQ
  33183. if (pcb->ooseq != NULL) {
  33184. tcp_segs_free(pcb->ooseq);
  33185. }
  33186. #endif /* TCP_QUEUE_OOSEQ */
  33187. if (reset) {
  33188. 802bb72: f1b9 0f00 cmp.w r9, #0
  33189. 802bb76: d009 beq.n 802bb8c <tcp_abandon+0x68>
  33190. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abandon: sending RST\n"));
  33191. tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, pcb->local_port, pcb->remote_port);
  33192. 802bb78: 8b63 ldrh r3, [r4, #26]
  33193. 802bb7a: 9300 str r3, [sp, #0]
  33194. 802bb7c: 8ba3 ldrh r3, [r4, #28]
  33195. 802bb7e: 4640 mov r0, r8
  33196. 802bb80: 9301 str r3, [sp, #4]
  33197. 802bb82: 4639 mov r1, r7
  33198. 802bb84: 4622 mov r2, r4
  33199. 802bb86: 1d23 adds r3, r4, #4
  33200. 802bb88: f001 fcc2 bl 802d510 <tcp_rst>
  33201. }
  33202. memp_free(MEMP_TCP_PCB, pcb);
  33203. 802bb8c: 2002 movs r0, #2
  33204. 802bb8e: 4621 mov r1, r4
  33205. 802bb90: f7ff fa54 bl 802b03c <memp_free>
  33206. TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT);
  33207. 802bb94: b11d cbz r5, 802bb9e <tcp_abandon+0x7a>
  33208. 802bb96: 4630 mov r0, r6
  33209. 802bb98: f06f 0109 mvn.w r1, #9
  33210. 802bb9c: 47a8 blx r5
  33211. }
  33212. }
  33213. 802bb9e: b003 add sp, #12
  33214. 802bba0: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  33215. 802bba4: 20010d8c .word 0x20010d8c
  33216. 802bba8: 20010d78 .word 0x20010d78
  33217. 802bbac: 20010d74 .word 0x20010d74
  33218. 0802bbb0 <tcp_abort>:
  33219. * @param pcb the tcp pcb to abort
  33220. */
  33221. void
  33222. tcp_abort(struct tcp_pcb *pcb)
  33223. {
  33224. tcp_abandon(pcb, 1);
  33225. 802bbb0: 2101 movs r1, #1
  33226. 802bbb2: f7ff bfb7 b.w 802bb24 <tcp_abandon>
  33227. 802bbb6: 0000 movs r0, r0
  33228. 0802bbb8 <tcp_close_shutdown>:
  33229. * @return ERR_OK if connection has been closed
  33230. * another err_t if closing failed and pcb is not freed
  33231. */
  33232. static err_t
  33233. tcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data)
  33234. {
  33235. 802bbb8: b537 push {r0, r1, r2, r4, r5, lr}
  33236. 802bbba: 4604 mov r4, r0
  33237. err_t err;
  33238. if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) {
  33239. 802bbbc: 2900 cmp r1, #0
  33240. 802bbbe: d043 beq.n 802bc48 <tcp_close_shutdown+0x90>
  33241. 802bbc0: 7e03 ldrb r3, [r0, #24]
  33242. 802bbc2: 2b04 cmp r3, #4
  33243. 802bbc4: d001 beq.n 802bbca <tcp_close_shutdown+0x12>
  33244. 802bbc6: 2b07 cmp r3, #7
  33245. 802bbc8: d13e bne.n 802bc48 <tcp_close_shutdown+0x90>
  33246. if ((pcb->refused_data != NULL) || (pcb->rcv_wnd != TCP_WND)) {
  33247. 802bbca: 6f63 ldr r3, [r4, #116] ; 0x74
  33248. 802bbcc: b923 cbnz r3, 802bbd8 <tcp_close_shutdown+0x20>
  33249. 802bbce: 8da2 ldrh r2, [r4, #44] ; 0x2c
  33250. 802bbd0: f241 63d0 movw r3, #5840 ; 0x16d0
  33251. 802bbd4: 429a cmp r2, r3
  33252. 802bbd6: d037 beq.n 802bc48 <tcp_close_shutdown+0x90>
  33253. side about this. */
  33254. LWIP_ASSERT("pcb->flags & TF_RXCLOSED", pcb->flags & TF_RXCLOSED);
  33255. /* don't call tcp_abort here: we must not deallocate the pcb since
  33256. that might not be expected when calling tcp_close */
  33257. tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  33258. 802bbd8: 8b63 ldrh r3, [r4, #26]
  33259. 802bbda: 6d20 ldr r0, [r4, #80] ; 0x50
  33260. 802bbdc: 9300 str r3, [sp, #0]
  33261. 802bbde: 8ba3 ldrh r3, [r4, #28]
  33262. 802bbe0: 6aa1 ldr r1, [r4, #40] ; 0x28
  33263. 802bbe2: 9301 str r3, [sp, #4]
  33264. 802bbe4: 4622 mov r2, r4
  33265. 802bbe6: 1d23 adds r3, r4, #4
  33266. 802bbe8: f001 fc92 bl 802d510 <tcp_rst>
  33267. pcb->local_port, pcb->remote_port);
  33268. tcp_pcb_purge(pcb);
  33269. 802bbec: 4620 mov r0, r4
  33270. 802bbee: f7ff fe03 bl 802b7f8 <tcp_pcb_purge>
  33271. TCP_RMV_ACTIVE(pcb);
  33272. 802bbf2: 4a42 ldr r2, [pc, #264] ; (802bcfc <tcp_close_shutdown+0x144>)
  33273. 802bbf4: 6813 ldr r3, [r2, #0]
  33274. 802bbf6: 42a3 cmp r3, r4
  33275. 802bbf8: d101 bne.n 802bbfe <tcp_close_shutdown+0x46>
  33276. 802bbfa: 68e3 ldr r3, [r4, #12]
  33277. 802bbfc: e00c b.n 802bc18 <tcp_close_shutdown+0x60>
  33278. 802bbfe: 4a40 ldr r2, [pc, #256] ; (802bd00 <tcp_close_shutdown+0x148>)
  33279. 802bc00: 6013 str r3, [r2, #0]
  33280. 802bc02: e007 b.n 802bc14 <tcp_close_shutdown+0x5c>
  33281. 802bc04: 68d9 ldr r1, [r3, #12]
  33282. 802bc06: 42a1 cmp r1, r4
  33283. 802bc08: d103 bne.n 802bc12 <tcp_close_shutdown+0x5a>
  33284. 802bc0a: 6013 str r3, [r2, #0]
  33285. 802bc0c: 68e2 ldr r2, [r4, #12]
  33286. 802bc0e: 60da str r2, [r3, #12]
  33287. 802bc10: e003 b.n 802bc1a <tcp_close_shutdown+0x62>
  33288. 802bc12: 460b mov r3, r1
  33289. 802bc14: 2b00 cmp r3, #0
  33290. 802bc16: d1f5 bne.n 802bc04 <tcp_close_shutdown+0x4c>
  33291. 802bc18: 6013 str r3, [r2, #0]
  33292. 802bc1a: 4b3a ldr r3, [pc, #232] ; (802bd04 <tcp_close_shutdown+0x14c>)
  33293. 802bc1c: 2201 movs r2, #1
  33294. 802bc1e: 701a strb r2, [r3, #0]
  33295. if (pcb->state == ESTABLISHED) {
  33296. 802bc20: 7e23 ldrb r3, [r4, #24]
  33297. that might not be expected when calling tcp_close */
  33298. tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  33299. pcb->local_port, pcb->remote_port);
  33300. tcp_pcb_purge(pcb);
  33301. TCP_RMV_ACTIVE(pcb);
  33302. 802bc22: 2500 movs r5, #0
  33303. if (pcb->state == ESTABLISHED) {
  33304. 802bc24: 2b04 cmp r3, #4
  33305. that might not be expected when calling tcp_close */
  33306. tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
  33307. pcb->local_port, pcb->remote_port);
  33308. tcp_pcb_purge(pcb);
  33309. TCP_RMV_ACTIVE(pcb);
  33310. 802bc26: 60e5 str r5, [r4, #12]
  33311. if (pcb->state == ESTABLISHED) {
  33312. 802bc28: d108 bne.n 802bc3c <tcp_close_shutdown+0x84>
  33313. /* move to TIME_WAIT since we close actively */
  33314. pcb->state = TIME_WAIT;
  33315. 802bc2a: 230a movs r3, #10
  33316. 802bc2c: 7623 strb r3, [r4, #24]
  33317. TCP_REG(&tcp_tw_pcbs, pcb);
  33318. 802bc2e: 4b36 ldr r3, [pc, #216] ; (802bd08 <tcp_close_shutdown+0x150>)
  33319. 802bc30: 681a ldr r2, [r3, #0]
  33320. 802bc32: 601c str r4, [r3, #0]
  33321. 802bc34: 60e2 str r2, [r4, #12]
  33322. 802bc36: f001 fe05 bl 802d844 <tcp_timer_needed>
  33323. 802bc3a: e003 b.n 802bc44 <tcp_close_shutdown+0x8c>
  33324. } else {
  33325. /* CLOSE_WAIT: deallocate the pcb since we already sent a RST for it */
  33326. memp_free(MEMP_TCP_PCB, pcb);
  33327. 802bc3c: 2002 movs r0, #2
  33328. 802bc3e: 4621 mov r1, r4
  33329. 802bc40: f7ff f9fc bl 802b03c <memp_free>
  33330. }
  33331. return ERR_OK;
  33332. 802bc44: 4628 mov r0, r5
  33333. 802bc46: e051 b.n 802bcec <tcp_close_shutdown+0x134>
  33334. }
  33335. }
  33336. switch (pcb->state) {
  33337. 802bc48: 7e23 ldrb r3, [r4, #24]
  33338. 802bc4a: 2b07 cmp r3, #7
  33339. 802bc4c: d853 bhi.n 802bcf6 <tcp_close_shutdown+0x13e>
  33340. 802bc4e: e8df f003 tbb [pc, r3]
  33341. 802bc52: 1e04 .short 0x1e04
  33342. 802bc54: 523c3527 .word 0x523c3527
  33343. 802bc58: 4452 .short 0x4452
  33344. * Calling tcp_close() with a pcb that has already been closed, (i.e. twice)
  33345. * or for a pcb that has been used and then entered the CLOSED state
  33346. * is erroneous, but this should never happen as the pcb has in those cases
  33347. * been freed, and so any remaining handles are bogus. */
  33348. err = ERR_OK;
  33349. if (pcb->local_port != 0) {
  33350. 802bc5a: 8b63 ldrh r3, [r4, #26]
  33351. 802bc5c: b1ab cbz r3, 802bc8a <tcp_close_shutdown+0xd2>
  33352. TCP_RMV(&tcp_bound_pcbs, pcb);
  33353. 802bc5e: 4a2b ldr r2, [pc, #172] ; (802bd0c <tcp_close_shutdown+0x154>)
  33354. 802bc60: 6813 ldr r3, [r2, #0]
  33355. 802bc62: 42a3 cmp r3, r4
  33356. 802bc64: d101 bne.n 802bc6a <tcp_close_shutdown+0xb2>
  33357. 802bc66: 68e3 ldr r3, [r4, #12]
  33358. 802bc68: e00c b.n 802bc84 <tcp_close_shutdown+0xcc>
  33359. 802bc6a: 4a25 ldr r2, [pc, #148] ; (802bd00 <tcp_close_shutdown+0x148>)
  33360. 802bc6c: 6013 str r3, [r2, #0]
  33361. 802bc6e: e007 b.n 802bc80 <tcp_close_shutdown+0xc8>
  33362. 802bc70: 68d9 ldr r1, [r3, #12]
  33363. 802bc72: 42a1 cmp r1, r4
  33364. 802bc74: d103 bne.n 802bc7e <tcp_close_shutdown+0xc6>
  33365. 802bc76: 6013 str r3, [r2, #0]
  33366. 802bc78: 68e2 ldr r2, [r4, #12]
  33367. 802bc7a: 60da str r2, [r3, #12]
  33368. 802bc7c: e003 b.n 802bc86 <tcp_close_shutdown+0xce>
  33369. 802bc7e: 460b mov r3, r1
  33370. 802bc80: 2b00 cmp r3, #0
  33371. 802bc82: d1f5 bne.n 802bc70 <tcp_close_shutdown+0xb8>
  33372. 802bc84: 6013 str r3, [r2, #0]
  33373. 802bc86: 2300 movs r3, #0
  33374. 802bc88: 60e3 str r3, [r4, #12]
  33375. }
  33376. memp_free(MEMP_TCP_PCB, pcb);
  33377. 802bc8a: 2002 movs r0, #2
  33378. 802bc8c: e004 b.n 802bc98 <tcp_close_shutdown+0xe0>
  33379. pcb = NULL;
  33380. break;
  33381. case LISTEN:
  33382. err = ERR_OK;
  33383. tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb);
  33384. 802bc8e: 4820 ldr r0, [pc, #128] ; (802bd10 <tcp_close_shutdown+0x158>)
  33385. 802bc90: 4621 mov r1, r4
  33386. 802bc92: f7ff ff19 bl 802bac8 <tcp_pcb_remove>
  33387. memp_free(MEMP_TCP_PCB_LISTEN, pcb);
  33388. 802bc96: 2003 movs r0, #3
  33389. 802bc98: 4621 mov r1, r4
  33390. 802bc9a: f7ff f9cf bl 802b03c <memp_free>
  33391. pcb = NULL;
  33392. break;
  33393. 802bc9e: e02a b.n 802bcf6 <tcp_close_shutdown+0x13e>
  33394. case SYN_SENT:
  33395. err = ERR_OK;
  33396. TCP_PCB_REMOVE_ACTIVE(pcb);
  33397. 802bca0: 4621 mov r1, r4
  33398. 802bca2: 4816 ldr r0, [pc, #88] ; (802bcfc <tcp_close_shutdown+0x144>)
  33399. 802bca4: f7ff ff10 bl 802bac8 <tcp_pcb_remove>
  33400. 802bca8: 4b16 ldr r3, [pc, #88] ; (802bd04 <tcp_close_shutdown+0x14c>)
  33401. 802bcaa: 2201 movs r2, #1
  33402. memp_free(MEMP_TCP_PCB, pcb);
  33403. 802bcac: 2002 movs r0, #2
  33404. 802bcae: 4621 mov r1, r4
  33405. memp_free(MEMP_TCP_PCB_LISTEN, pcb);
  33406. pcb = NULL;
  33407. break;
  33408. case SYN_SENT:
  33409. err = ERR_OK;
  33410. TCP_PCB_REMOVE_ACTIVE(pcb);
  33411. 802bcb0: 701a strb r2, [r3, #0]
  33412. memp_free(MEMP_TCP_PCB, pcb);
  33413. 802bcb2: f7ff f9c3 bl 802b03c <memp_free>
  33414. pcb = NULL;
  33415. snmp_inc_tcpattemptfails();
  33416. 802bcb6: f004 f893 bl 802fde0 <snmp_inc_tcpattemptfails>
  33417. break;
  33418. 802bcba: e01c b.n 802bcf6 <tcp_close_shutdown+0x13e>
  33419. case SYN_RCVD:
  33420. err = tcp_send_fin(pcb);
  33421. 802bcbc: 4620 mov r0, r4
  33422. 802bcbe: f001 fabe bl 802d23e <tcp_send_fin>
  33423. if (err == ERR_OK) {
  33424. 802bcc2: b998 cbnz r0, 802bcec <tcp_close_shutdown+0x134>
  33425. snmp_inc_tcpattemptfails();
  33426. 802bcc4: f004 f88c bl 802fde0 <snmp_inc_tcpattemptfails>
  33427. 802bcc8: e005 b.n 802bcd6 <tcp_close_shutdown+0x11e>
  33428. pcb->state = FIN_WAIT_1;
  33429. }
  33430. break;
  33431. case ESTABLISHED:
  33432. err = tcp_send_fin(pcb);
  33433. 802bcca: 4620 mov r0, r4
  33434. 802bccc: f001 fab7 bl 802d23e <tcp_send_fin>
  33435. if (err == ERR_OK) {
  33436. 802bcd0: b960 cbnz r0, 802bcec <tcp_close_shutdown+0x134>
  33437. snmp_inc_tcpestabresets();
  33438. 802bcd2: f004 f88d bl 802fdf0 <snmp_inc_tcpestabresets>
  33439. pcb->state = FIN_WAIT_1;
  33440. 802bcd6: 2305 movs r3, #5
  33441. 802bcd8: e006 b.n 802bce8 <tcp_close_shutdown+0x130>
  33442. }
  33443. break;
  33444. case CLOSE_WAIT:
  33445. err = tcp_send_fin(pcb);
  33446. 802bcda: 4620 mov r0, r4
  33447. 802bcdc: f001 faaf bl 802d23e <tcp_send_fin>
  33448. if (err == ERR_OK) {
  33449. 802bce0: b920 cbnz r0, 802bcec <tcp_close_shutdown+0x134>
  33450. snmp_inc_tcpestabresets();
  33451. 802bce2: f004 f885 bl 802fdf0 <snmp_inc_tcpestabresets>
  33452. pcb->state = LAST_ACK;
  33453. 802bce6: 2309 movs r3, #9
  33454. 802bce8: 7623 strb r3, [r4, #24]
  33455. 802bcea: e001 b.n 802bcf0 <tcp_close_shutdown+0x138>
  33456. 802bcec: b240 sxtb r0, r0
  33457. 802bcee: e004 b.n 802bcfa <tcp_close_shutdown+0x142>
  33458. returns (unsent data is sent from tcp timer functions, also), we don't care
  33459. for the return value of tcp_output for now. */
  33460. /* @todo: When implementing SO_LINGER, this must be changed somehow:
  33461. If SOF_LINGER is set, the data should be sent and acked before close returns.
  33462. This can only be valid for sequential APIs, not for the raw API. */
  33463. tcp_output(pcb);
  33464. 802bcf0: 4620 mov r0, r4
  33465. 802bcf2: f001 fae9 bl 802d2c8 <tcp_output>
  33466. 802bcf6: 2000 movs r0, #0
  33467. 802bcf8: e7f8 b.n 802bcec <tcp_close_shutdown+0x134>
  33468. }
  33469. return err;
  33470. }
  33471. 802bcfa: bd3e pop {r1, r2, r3, r4, r5, pc}
  33472. 802bcfc: 20010d78 .word 0x20010d78
  33473. 802bd00: 20010d84 .word 0x20010d84
  33474. 802bd04: 20010d74 .word 0x20010d74
  33475. 802bd08: 20010d8c .word 0x20010d8c
  33476. 802bd0c: 20010d88 .word 0x20010d88
  33477. 802bd10: 20010d80 .word 0x20010d80
  33478. 0802bd14 <tcp_close>:
  33479. #if TCP_DEBUG
  33480. LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in "));
  33481. tcp_debug_print_state(pcb->state);
  33482. #endif /* TCP_DEBUG */
  33483. if (pcb->state != LISTEN) {
  33484. 802bd14: 7e03 ldrb r3, [r0, #24]
  33485. 802bd16: 2b01 cmp r3, #1
  33486. 802bd18: d003 beq.n 802bd22 <tcp_close+0xe>
  33487. /* Set a flag not to receive any more data... */
  33488. pcb->flags |= TF_RXCLOSED;
  33489. 802bd1a: 7f83 ldrb r3, [r0, #30]
  33490. 802bd1c: f043 0310 orr.w r3, r3, #16
  33491. 802bd20: 7783 strb r3, [r0, #30]
  33492. }
  33493. /* ... and close */
  33494. return tcp_close_shutdown(pcb, 1);
  33495. 802bd22: 2101 movs r1, #1
  33496. 802bd24: f7ff bf48 b.w 802bbb8 <tcp_close_shutdown>
  33497. 0802bd28 <tcp_recv_null>:
  33498. * Default receive callback that is called if the user didn't register
  33499. * a recv callback for the pcb.
  33500. */
  33501. err_t
  33502. tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
  33503. {
  33504. 802bd28: b510 push {r4, lr}
  33505. 802bd2a: 4608 mov r0, r1
  33506. LWIP_UNUSED_ARG(arg);
  33507. if (p != NULL) {
  33508. 802bd2c: 4614 mov r4, r2
  33509. 802bd2e: b132 cbz r2, 802bd3e <tcp_recv_null+0x16>
  33510. tcp_recved(pcb, p->tot_len);
  33511. 802bd30: 8911 ldrh r1, [r2, #8]
  33512. 802bd32: f7ff fd1f bl 802b774 <tcp_recved>
  33513. pbuf_free(p);
  33514. 802bd36: 4620 mov r0, r4
  33515. 802bd38: f7ff fa8a bl 802b250 <pbuf_free>
  33516. 802bd3c: e004 b.n 802bd48 <tcp_recv_null+0x20>
  33517. } else if (err == ERR_OK) {
  33518. 802bd3e: b91b cbnz r3, 802bd48 <tcp_recv_null+0x20>
  33519. return tcp_close(pcb);
  33520. }
  33521. return ERR_OK;
  33522. }
  33523. 802bd40: e8bd 4010 ldmia.w sp!, {r4, lr}
  33524. LWIP_UNUSED_ARG(arg);
  33525. if (p != NULL) {
  33526. tcp_recved(pcb, p->tot_len);
  33527. pbuf_free(p);
  33528. } else if (err == ERR_OK) {
  33529. return tcp_close(pcb);
  33530. 802bd44: f7ff bfe6 b.w 802bd14 <tcp_close>
  33531. }
  33532. return ERR_OK;
  33533. }
  33534. 802bd48: 2000 movs r0, #0
  33535. 802bd4a: bd10 pop {r4, pc}
  33536. 0802bd4c <tcp_process_refused_data>:
  33537. }
  33538. /** Pass pcb->refused_data to the recv callback */
  33539. err_t
  33540. tcp_process_refused_data(struct tcp_pcb *pcb)
  33541. {
  33542. 802bd4c: b5f8 push {r3, r4, r5, r6, r7, lr}
  33543. err_t err;
  33544. u8_t refused_flags = pcb->refused_data->flags;
  33545. 802bd4e: 6f45 ldr r5, [r0, #116] ; 0x74
  33546. closes the pcb */
  33547. struct pbuf *refused_data = pcb->refused_data;
  33548. pcb->refused_data = NULL;
  33549. /* Notify again application with data previously received. */
  33550. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n"));
  33551. TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err);
  33552. 802bd50: 6fc6 ldr r6, [r0, #124] ; 0x7c
  33553. /** Pass pcb->refused_data to the recv callback */
  33554. err_t
  33555. tcp_process_refused_data(struct tcp_pcb *pcb)
  33556. {
  33557. err_t err;
  33558. u8_t refused_flags = pcb->refused_data->flags;
  33559. 802bd52: 7b6f ldrb r7, [r5, #13]
  33560. /* set pcb->refused_data to NULL in case the callback frees it and then
  33561. closes the pcb */
  33562. struct pbuf *refused_data = pcb->refused_data;
  33563. pcb->refused_data = NULL;
  33564. 802bd54: 2300 movs r3, #0
  33565. }
  33566. /** Pass pcb->refused_data to the recv callback */
  33567. err_t
  33568. tcp_process_refused_data(struct tcp_pcb *pcb)
  33569. {
  33570. 802bd56: 4604 mov r4, r0
  33571. err_t err;
  33572. u8_t refused_flags = pcb->refused_data->flags;
  33573. /* set pcb->refused_data to NULL in case the callback frees it and then
  33574. closes the pcb */
  33575. struct pbuf *refused_data = pcb->refused_data;
  33576. pcb->refused_data = NULL;
  33577. 802bd58: 6743 str r3, [r0, #116] ; 0x74
  33578. /* Notify again application with data previously received. */
  33579. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n"));
  33580. TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err);
  33581. 802bd5a: b126 cbz r6, 802bd66 <tcp_process_refused_data+0x1a>
  33582. 802bd5c: 4621 mov r1, r4
  33583. 802bd5e: 462a mov r2, r5
  33584. 802bd60: 6900 ldr r0, [r0, #16]
  33585. 802bd62: 47b0 blx r6
  33586. 802bd64: e005 b.n 802bd72 <tcp_process_refused_data+0x26>
  33587. 802bd66: 4630 mov r0, r6
  33588. 802bd68: 4621 mov r1, r4
  33589. 802bd6a: 462a mov r2, r5
  33590. 802bd6c: 4633 mov r3, r6
  33591. 802bd6e: f7ff ffdb bl 802bd28 <tcp_recv_null>
  33592. if (err == ERR_OK) {
  33593. 802bd72: b9b0 cbnz r0, 802bda2 <tcp_process_refused_data+0x56>
  33594. /* did refused_data include a FIN? */
  33595. if (refused_flags & PBUF_FLAG_TCP_FIN) {
  33596. 802bd74: f007 0720 and.w r7, r7, #32
  33597. 802bd78: b2ff uxtb r7, r7
  33598. 802bd7a: b1bf cbz r7, 802bdac <tcp_process_refused_data+0x60>
  33599. /* correct rcv_wnd as the application won't call tcp_recved()
  33600. for the FIN's seqno */
  33601. if (pcb->rcv_wnd != TCP_WND) {
  33602. 802bd7c: 8da3 ldrh r3, [r4, #44] ; 0x2c
  33603. 802bd7e: f241 62d0 movw r2, #5840 ; 0x16d0
  33604. 802bd82: 4293 cmp r3, r2
  33605. 802bd84: d001 beq.n 802bd8a <tcp_process_refused_data+0x3e>
  33606. pcb->rcv_wnd++;
  33607. 802bd86: 3301 adds r3, #1
  33608. 802bd88: 85a3 strh r3, [r4, #44] ; 0x2c
  33609. }
  33610. TCP_EVENT_CLOSED(pcb, err);
  33611. 802bd8a: 6fe5 ldr r5, [r4, #124] ; 0x7c
  33612. 802bd8c: b905 cbnz r5, 802bd90 <tcp_process_refused_data+0x44>
  33613. 802bd8e: e00c b.n 802bdaa <tcp_process_refused_data+0x5e>
  33614. 802bd90: 2200 movs r2, #0
  33615. 802bd92: 6920 ldr r0, [r4, #16]
  33616. 802bd94: 4621 mov r1, r4
  33617. 802bd96: 4613 mov r3, r2
  33618. 802bd98: 47a8 blx r5
  33619. if (err == ERR_ABRT) {
  33620. 802bd9a: 300a adds r0, #10
  33621. 802bd9c: d105 bne.n 802bdaa <tcp_process_refused_data+0x5e>
  33622. return ERR_ABRT;
  33623. 802bd9e: 20f6 movs r0, #246 ; 0xf6
  33624. 802bda0: e004 b.n 802bdac <tcp_process_refused_data+0x60>
  33625. }
  33626. }
  33627. } else if (err == ERR_ABRT) {
  33628. 802bda2: b240 sxtb r0, r0
  33629. 802bda4: 300a adds r0, #10
  33630. 802bda6: d0fa beq.n 802bd9e <tcp_process_refused_data+0x52>
  33631. segment contains data). */
  33632. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: drop incoming packets, because pcb is \"full\"\n"));
  33633. return ERR_ABRT;
  33634. } else {
  33635. /* data is still refused, pbuf is still valid (go on for ACK-only packets) */
  33636. pcb->refused_data = refused_data;
  33637. 802bda8: 6765 str r5, [r4, #116] ; 0x74
  33638. }
  33639. return ERR_OK;
  33640. 802bdaa: 2000 movs r0, #0
  33641. }
  33642. 802bdac: b240 sxtb r0, r0
  33643. 802bdae: bdf8 pop {r3, r4, r5, r6, r7, pc}
  33644. 0802bdb0 <tcp_fasttmr>:
  33645. *
  33646. * Automatically called from tcp_tmr().
  33647. */
  33648. void
  33649. tcp_fasttmr(void)
  33650. {
  33651. 802bdb0: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  33652. struct tcp_pcb *pcb;
  33653. ++tcp_timer_ctr;
  33654. 802bdb4: 4b18 ldr r3, [pc, #96] ; (802be18 <tcp_fasttmr+0x68>)
  33655. tcp_fasttmr_start:
  33656. pcb = tcp_active_pcbs;
  33657. 802bdb6: 4f19 ldr r7, [pc, #100] ; (802be1c <tcp_fasttmr+0x6c>)
  33658. void
  33659. tcp_fasttmr(void)
  33660. {
  33661. struct tcp_pcb *pcb;
  33662. ++tcp_timer_ctr;
  33663. 802bdb8: 781a ldrb r2, [r3, #0]
  33664. 802bdba: 3201 adds r2, #1
  33665. 802bdbc: 701a strb r2, [r3, #0]
  33666. tcp_fasttmr_start:
  33667. pcb = tcp_active_pcbs;
  33668. while(pcb != NULL) {
  33669. if (pcb->last_timer != tcp_timer_ctr) {
  33670. 802bdbe: 4698 mov r8, r3
  33671. struct tcp_pcb *pcb;
  33672. ++tcp_timer_ctr;
  33673. tcp_fasttmr_start:
  33674. pcb = tcp_active_pcbs;
  33675. 802bdc0: 683c ldr r4, [r7, #0]
  33676. next = pcb->next;
  33677. /* If there is data which was previously "refused" by upper layer */
  33678. if (pcb->refused_data != NULL) {
  33679. tcp_active_pcbs_changed = 0;
  33680. 802bdc2: 4d17 ldr r5, [pc, #92] ; (802be20 <tcp_fasttmr+0x70>)
  33681. 802bdc4: 2600 movs r6, #0
  33682. ++tcp_timer_ctr;
  33683. tcp_fasttmr_start:
  33684. pcb = tcp_active_pcbs;
  33685. while(pcb != NULL) {
  33686. 802bdc6: e022 b.n 802be0e <tcp_fasttmr+0x5e>
  33687. if (pcb->last_timer != tcp_timer_ctr) {
  33688. 802bdc8: f898 2000 ldrb.w r2, [r8]
  33689. 802bdcc: f894 3021 ldrb.w r3, [r4, #33] ; 0x21
  33690. 802bdd0: 4293 cmp r3, r2
  33691. 802bdd2: d020 beq.n 802be16 <tcp_fasttmr+0x66>
  33692. struct tcp_pcb *next;
  33693. pcb->last_timer = tcp_timer_ctr;
  33694. 802bdd4: f884 2021 strb.w r2, [r4, #33] ; 0x21
  33695. /* send delayed ACKs */
  33696. if (pcb->flags & TF_ACK_DELAY) {
  33697. 802bdd8: 7fa2 ldrb r2, [r4, #30]
  33698. 802bdda: 07d1 lsls r1, r2, #31
  33699. 802bddc: d509 bpl.n 802bdf2 <tcp_fasttmr+0x42>
  33700. LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n"));
  33701. tcp_ack_now(pcb);
  33702. 802bdde: f042 0202 orr.w r2, r2, #2
  33703. 802bde2: 77a2 strb r2, [r4, #30]
  33704. tcp_output(pcb);
  33705. 802bde4: 4620 mov r0, r4
  33706. 802bde6: f001 fa6f bl 802d2c8 <tcp_output>
  33707. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  33708. 802bdea: 7fa3 ldrb r3, [r4, #30]
  33709. 802bdec: f023 0303 bic.w r3, r3, #3
  33710. 802bdf0: 77a3 strb r3, [r4, #30]
  33711. }
  33712. next = pcb->next;
  33713. /* If there is data which was previously "refused" by upper layer */
  33714. if (pcb->refused_data != NULL) {
  33715. 802bdf2: 6f63 ldr r3, [r4, #116] ; 0x74
  33716. tcp_ack_now(pcb);
  33717. tcp_output(pcb);
  33718. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  33719. }
  33720. next = pcb->next;
  33721. 802bdf4: f8d4 900c ldr.w r9, [r4, #12]
  33722. /* If there is data which was previously "refused" by upper layer */
  33723. if (pcb->refused_data != NULL) {
  33724. 802bdf8: b90b cbnz r3, 802bdfe <tcp_fasttmr+0x4e>
  33725. 802bdfa: 464c mov r4, r9
  33726. 802bdfc: e007 b.n 802be0e <tcp_fasttmr+0x5e>
  33727. tcp_active_pcbs_changed = 0;
  33728. tcp_process_refused_data(pcb);
  33729. 802bdfe: 4620 mov r0, r4
  33730. next = pcb->next;
  33731. /* If there is data which was previously "refused" by upper layer */
  33732. if (pcb->refused_data != NULL) {
  33733. tcp_active_pcbs_changed = 0;
  33734. 802be00: 702e strb r6, [r5, #0]
  33735. tcp_process_refused_data(pcb);
  33736. 802be02: f7ff ffa3 bl 802bd4c <tcp_process_refused_data>
  33737. if (tcp_active_pcbs_changed) {
  33738. 802be06: 782b ldrb r3, [r5, #0]
  33739. 802be08: 2b00 cmp r3, #0
  33740. 802be0a: d1d9 bne.n 802bdc0 <tcp_fasttmr+0x10>
  33741. 802be0c: e7f5 b.n 802bdfa <tcp_fasttmr+0x4a>
  33742. ++tcp_timer_ctr;
  33743. tcp_fasttmr_start:
  33744. pcb = tcp_active_pcbs;
  33745. while(pcb != NULL) {
  33746. 802be0e: 2c00 cmp r4, #0
  33747. 802be10: d1da bne.n 802bdc8 <tcp_fasttmr+0x18>
  33748. 802be12: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  33749. 802be16: e7fe b.n 802be16 <tcp_fasttmr+0x66>
  33750. 802be18: 2000e0a1 .word 0x2000e0a1
  33751. 802be1c: 20010d78 .word 0x20010d78
  33752. 802be20: 20010d74 .word 0x20010d74
  33753. 0802be24 <tcp_tmr>:
  33754. /**
  33755. * Called periodically to dispatch TCP timers.
  33756. */
  33757. void
  33758. tcp_tmr(void)
  33759. {
  33760. 802be24: b508 push {r3, lr}
  33761. /* Call tcp_fasttmr() every 250 ms */
  33762. tcp_fasttmr();
  33763. 802be26: f7ff ffc3 bl 802bdb0 <tcp_fasttmr>
  33764. if (++tcp_timer & 1) {
  33765. 802be2a: 4a06 ldr r2, [pc, #24] ; (802be44 <tcp_tmr+0x20>)
  33766. 802be2c: 7813 ldrb r3, [r2, #0]
  33767. 802be2e: 3301 adds r3, #1
  33768. 802be30: b2db uxtb r3, r3
  33769. 802be32: 07d8 lsls r0, r3, #31
  33770. 802be34: 7013 strb r3, [r2, #0]
  33771. 802be36: d503 bpl.n 802be40 <tcp_tmr+0x1c>
  33772. /* Call tcp_tmr() every 500 ms, i.e., every other timer
  33773. tcp_tmr() is called. */
  33774. tcp_slowtmr();
  33775. }
  33776. }
  33777. 802be38: e8bd 4008 ldmia.w sp!, {r3, lr}
  33778. tcp_fasttmr();
  33779. if (++tcp_timer & 1) {
  33780. /* Call tcp_tmr() every 500 ms, i.e., every other timer
  33781. tcp_tmr() is called. */
  33782. tcp_slowtmr();
  33783. 802be3c: f7ff bcfa b.w 802b834 <tcp_slowtmr>
  33784. 802be40: bd08 pop {r3, pc}
  33785. 802be42: bf00 nop
  33786. 802be44: 2000e0a0 .word 0x2000e0a0
  33787. 0802be48 <tcp_next_iss>:
  33788. u32_t
  33789. tcp_next_iss(void)
  33790. {
  33791. static u32_t iss = 6510;
  33792. iss += tcp_ticks; /* XXX */
  33793. 802be48: 4b03 ldr r3, [pc, #12] ; (802be58 <tcp_next_iss+0x10>)
  33794. 802be4a: 4a04 ldr r2, [pc, #16] ; (802be5c <tcp_next_iss+0x14>)
  33795. 802be4c: 6810 ldr r0, [r2, #0]
  33796. 802be4e: 681a ldr r2, [r3, #0]
  33797. 802be50: 1880 adds r0, r0, r2
  33798. 802be52: 6018 str r0, [r3, #0]
  33799. return iss;
  33800. }
  33801. 802be54: 4770 bx lr
  33802. 802be56: bf00 nop
  33803. 802be58: 200015e0 .word 0x200015e0
  33804. 802be5c: 20010d7c .word 0x20010d7c
  33805. 0802be60 <tcp_alloc>:
  33806. * @param prio priority for the new pcb
  33807. * @return a new tcp_pcb that initially is in state CLOSED
  33808. */
  33809. struct tcp_pcb *
  33810. tcp_alloc(u8_t prio)
  33811. {
  33812. 802be60: b5f8 push {r3, r4, r5, r6, r7, lr}
  33813. 802be62: 4605 mov r5, r0
  33814. struct tcp_pcb *pcb;
  33815. u32_t iss;
  33816. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  33817. 802be64: 2002 movs r0, #2
  33818. 802be66: f7ff f8d3 bl 802b010 <memp_malloc>
  33819. if (pcb == NULL) {
  33820. 802be6a: 4604 mov r4, r0
  33821. 802be6c: 2800 cmp r0, #0
  33822. 802be6e: d136 bne.n 802bede <tcp_alloc+0x7e>
  33823. u32_t inactivity;
  33824. inactivity = 0;
  33825. inactive = NULL;
  33826. /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
  33827. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  33828. 802be70: 4b39 ldr r3, [pc, #228] ; (802bf58 <tcp_alloc+0xf8>)
  33829. if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  33830. 802be72: 4a3a ldr r2, [pc, #232] ; (802bf5c <tcp_alloc+0xfc>)
  33831. u32_t inactivity;
  33832. inactivity = 0;
  33833. inactive = NULL;
  33834. /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
  33835. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  33836. 802be74: 681b ldr r3, [r3, #0]
  33837. if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  33838. 802be76: 6811 ldr r1, [r2, #0]
  33839. 802be78: e007 b.n 802be8a <tcp_alloc+0x2a>
  33840. 802be7a: 6a5a ldr r2, [r3, #36] ; 0x24
  33841. 802be7c: 1a8a subs r2, r1, r2
  33842. 802be7e: 42a2 cmp r2, r4
  33843. 802be80: bf34 ite cc
  33844. 802be82: 4622 movcc r2, r4
  33845. 802be84: 4618 movcs r0, r3
  33846. u32_t inactivity;
  33847. inactivity = 0;
  33848. inactive = NULL;
  33849. /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
  33850. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  33851. 802be86: 68db ldr r3, [r3, #12]
  33852. 802be88: 4614 mov r4, r2
  33853. 802be8a: 2b00 cmp r3, #0
  33854. 802be8c: d1f5 bne.n 802be7a <tcp_alloc+0x1a>
  33855. if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  33856. inactivity = tcp_ticks - pcb->tmr;
  33857. inactive = pcb;
  33858. }
  33859. }
  33860. if (inactive != NULL) {
  33861. 802be8e: b108 cbz r0, 802be94 <tcp_alloc+0x34>
  33862. LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n",
  33863. (void *)inactive, inactivity));
  33864. tcp_abort(inactive);
  33865. 802be90: f7ff fe8e bl 802bbb0 <tcp_abort>
  33866. if (pcb == NULL) {
  33867. /* Try killing oldest connection in TIME-WAIT. */
  33868. LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n"));
  33869. tcp_kill_timewait();
  33870. /* Try to allocate a tcp_pcb again. */
  33871. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  33872. 802be94: 2002 movs r0, #2
  33873. 802be96: f7ff f8bb bl 802b010 <memp_malloc>
  33874. if (pcb == NULL) {
  33875. 802be9a: 4604 mov r4, r0
  33876. 802be9c: b9f8 cbnz r0, 802bede <tcp_alloc+0x7e>
  33877. inactivity = 0;
  33878. inactive = NULL;
  33879. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  33880. if (pcb->prio <= prio &&
  33881. pcb->prio <= mprio &&
  33882. (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  33883. 802be9e: 4a2f ldr r2, [pc, #188] ; (802bf5c <tcp_alloc+0xfc>)
  33884. mprio = TCP_PRIO_MAX;
  33885. /* We kill the oldest active connection that has lower priority than prio. */
  33886. inactivity = 0;
  33887. inactive = NULL;
  33888. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  33889. 802bea0: 4b2f ldr r3, [pc, #188] ; (802bf60 <tcp_alloc+0x100>)
  33890. if (pcb->prio <= prio &&
  33891. pcb->prio <= mprio &&
  33892. (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  33893. 802bea2: 6817 ldr r7, [r2, #0]
  33894. mprio = TCP_PRIO_MAX;
  33895. /* We kill the oldest active connection that has lower priority than prio. */
  33896. inactivity = 0;
  33897. inactive = NULL;
  33898. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  33899. 802bea4: 681b ldr r3, [r3, #0]
  33900. struct tcp_pcb *pcb, *inactive;
  33901. u32_t inactivity;
  33902. u8_t mprio;
  33903. mprio = TCP_PRIO_MAX;
  33904. 802bea6: 207f movs r0, #127 ; 0x7f
  33905. /* We kill the oldest active connection that has lower priority than prio. */
  33906. inactivity = 0;
  33907. inactive = NULL;
  33908. 802bea8: 4622 mov r2, r4
  33909. 802beaa: e00c b.n 802bec6 <tcp_alloc+0x66>
  33910. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  33911. if (pcb->prio <= prio &&
  33912. 802beac: 7e59 ldrb r1, [r3, #25]
  33913. 802beae: 42a9 cmp r1, r5
  33914. 802beb0: d808 bhi.n 802bec4 <tcp_alloc+0x64>
  33915. 802beb2: 4281 cmp r1, r0
  33916. 802beb4: d806 bhi.n 802bec4 <tcp_alloc+0x64>
  33917. pcb->prio <= mprio &&
  33918. (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  33919. 802beb6: 6a5e ldr r6, [r3, #36] ; 0x24
  33920. 802beb8: 1bbe subs r6, r7, r6
  33921. /* We kill the oldest active connection that has lower priority than prio. */
  33922. inactivity = 0;
  33923. inactive = NULL;
  33924. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  33925. if (pcb->prio <= prio &&
  33926. pcb->prio <= mprio &&
  33927. 802beba: 42a6 cmp r6, r4
  33928. 802bebc: d302 bcc.n 802bec4 <tcp_alloc+0x64>
  33929. 802bebe: 4608 mov r0, r1
  33930. 802bec0: 4634 mov r4, r6
  33931. 802bec2: 461a mov r2, r3
  33932. mprio = TCP_PRIO_MAX;
  33933. /* We kill the oldest active connection that has lower priority than prio. */
  33934. inactivity = 0;
  33935. inactive = NULL;
  33936. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  33937. 802bec4: 68db ldr r3, [r3, #12]
  33938. 802bec6: 2b00 cmp r3, #0
  33939. 802bec8: d1f0 bne.n 802beac <tcp_alloc+0x4c>
  33940. inactivity = tcp_ticks - pcb->tmr;
  33941. inactive = pcb;
  33942. mprio = pcb->prio;
  33943. }
  33944. }
  33945. if (inactive != NULL) {
  33946. 802beca: b112 cbz r2, 802bed2 <tcp_alloc+0x72>
  33947. LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n",
  33948. (void *)inactive, inactivity));
  33949. tcp_abort(inactive);
  33950. 802becc: 4610 mov r0, r2
  33951. 802bece: f7ff fe6f bl 802bbb0 <tcp_abort>
  33952. if (pcb == NULL) {
  33953. /* Try killing active connections with lower priority than the new one. */
  33954. LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing connection with prio lower than %d\n", prio));
  33955. tcp_kill_prio(prio);
  33956. /* Try to allocate a tcp_pcb again. */
  33957. pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
  33958. 802bed2: 2002 movs r0, #2
  33959. 802bed4: f7ff f89c bl 802b010 <memp_malloc>
  33960. if (pcb != NULL) {
  33961. /* adjust err stats: timewait PCB was freed above */
  33962. MEMP_STATS_DEC(err, MEMP_TCP_PCB);
  33963. }
  33964. }
  33965. if (pcb != NULL) {
  33966. 802bed8: 4604 mov r4, r0
  33967. 802beda: 2800 cmp r0, #0
  33968. 802bedc: d039 beq.n 802bf52 <tcp_alloc+0xf2>
  33969. memset(pcb, 0, sizeof(struct tcp_pcb));
  33970. 802bede: 2100 movs r1, #0
  33971. 802bee0: 2294 movs r2, #148 ; 0x94
  33972. 802bee2: 4620 mov r0, r4
  33973. 802bee4: f7f5 fc68 bl 80217b8 <memset>
  33974. pcb->prio = prio;
  33975. pcb->snd_buf = TCP_SND_BUF;
  33976. pcb->snd_queuelen = 0;
  33977. pcb->rcv_wnd = TCP_WND;
  33978. 802bee8: f241 62d0 movw r2, #5840 ; 0x16d0
  33979. }
  33980. }
  33981. if (pcb != NULL) {
  33982. memset(pcb, 0, sizeof(struct tcp_pcb));
  33983. pcb->prio = prio;
  33984. pcb->snd_buf = TCP_SND_BUF;
  33985. 802beec: f246 63a8 movw r3, #26280 ; 0x66a8
  33986. 802bef0: f8a4 3066 strh.w r3, [r4, #102] ; 0x66
  33987. pcb->snd_queuelen = 0;
  33988. pcb->rcv_wnd = TCP_WND;
  33989. 802bef4: 85a2 strh r2, [r4, #44] ; 0x2c
  33990. }
  33991. if (pcb != NULL) {
  33992. memset(pcb, 0, sizeof(struct tcp_pcb));
  33993. pcb->prio = prio;
  33994. pcb->snd_buf = TCP_SND_BUF;
  33995. pcb->snd_queuelen = 0;
  33996. 802bef6: 2300 movs r3, #0
  33997. pcb->rcv_wnd = TCP_WND;
  33998. pcb->rcv_ann_wnd = TCP_WND;
  33999. 802bef8: 85e2 strh r2, [r4, #46] ; 0x2e
  34000. pcb->tos = 0;
  34001. pcb->ttl = TCP_TTL;
  34002. 802befa: 22ff movs r2, #255 ; 0xff
  34003. MEMP_STATS_DEC(err, MEMP_TCP_PCB);
  34004. }
  34005. }
  34006. if (pcb != NULL) {
  34007. memset(pcb, 0, sizeof(struct tcp_pcb));
  34008. pcb->prio = prio;
  34009. 802befc: 7665 strb r5, [r4, #25]
  34010. pcb->snd_buf = TCP_SND_BUF;
  34011. pcb->snd_queuelen = 0;
  34012. 802befe: f8a4 3068 strh.w r3, [r4, #104] ; 0x68
  34013. 802bf02: 461d mov r5, r3
  34014. pcb->rcv_wnd = TCP_WND;
  34015. pcb->rcv_ann_wnd = TCP_WND;
  34016. pcb->tos = 0;
  34017. 802bf04: 7263 strb r3, [r4, #9]
  34018. pcb->ttl = TCP_TTL;
  34019. 802bf06: 72a2 strb r2, [r4, #10]
  34020. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  34021. The send MSS is updated when an MSS option is received. */
  34022. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  34023. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  34024. pcb->sa = 0;
  34025. 802bf08: f8a4 3040 strh.w r3, [r4, #64] ; 0x40
  34026. pcb->rcv_ann_wnd = TCP_WND;
  34027. pcb->tos = 0;
  34028. pcb->ttl = TCP_TTL;
  34029. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  34030. The send MSS is updated when an MSS option is received. */
  34031. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  34032. 802bf0c: f44f 7206 mov.w r2, #536 ; 0x218
  34033. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  34034. pcb->sa = 0;
  34035. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  34036. pcb->rtime = -1;
  34037. 802bf10: f64f 73ff movw r3, #65535 ; 0xffff
  34038. pcb->rcv_ann_wnd = TCP_WND;
  34039. pcb->tos = 0;
  34040. pcb->ttl = TCP_TTL;
  34041. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  34042. The send MSS is updated when an MSS option is received. */
  34043. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  34044. 802bf14: 86e2 strh r2, [r4, #54] ; 0x36
  34045. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  34046. pcb->sa = 0;
  34047. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  34048. pcb->rtime = -1;
  34049. 802bf16: 86a3 strh r3, [r4, #52] ; 0x34
  34050. pcb->tos = 0;
  34051. pcb->ttl = TCP_TTL;
  34052. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  34053. The send MSS is updated when an MSS option is received. */
  34054. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  34055. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  34056. 802bf18: 2206 movs r2, #6
  34057. pcb->sa = 0;
  34058. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  34059. pcb->rtime = -1;
  34060. pcb->cwnd = 1;
  34061. 802bf1a: 2301 movs r3, #1
  34062. 802bf1c: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  34063. pcb->tos = 0;
  34064. pcb->ttl = TCP_TTL;
  34065. /* As initial send MSS, we use TCP_MSS but limit it to 536.
  34066. The send MSS is updated when an MSS option is received. */
  34067. pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
  34068. pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  34069. 802bf20: f8a4 2044 strh.w r2, [r4, #68] ; 0x44
  34070. pcb->sa = 0;
  34071. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  34072. 802bf24: f8a4 2042 strh.w r2, [r4, #66] ; 0x42
  34073. pcb->rtime = -1;
  34074. pcb->cwnd = 1;
  34075. iss = tcp_next_iss();
  34076. 802bf28: f7ff ff8e bl 802be48 <tcp_next_iss>
  34077. pcb->snd_wl2 = iss;
  34078. pcb->snd_nxt = iss;
  34079. pcb->lastack = iss;
  34080. pcb->snd_lbb = iss;
  34081. pcb->tmr = tcp_ticks;
  34082. 802bf2c: 4b0b ldr r3, [pc, #44] ; (802bf5c <tcp_alloc+0xfc>)
  34083. pcb->sa = 0;
  34084. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  34085. pcb->rtime = -1;
  34086. pcb->cwnd = 1;
  34087. iss = tcp_next_iss();
  34088. pcb->snd_wl2 = iss;
  34089. 802bf2e: 65a0 str r0, [r4, #88] ; 0x58
  34090. pcb->snd_nxt = iss;
  34091. pcb->lastack = iss;
  34092. pcb->snd_lbb = iss;
  34093. pcb->tmr = tcp_ticks;
  34094. 802bf30: 681b ldr r3, [r3, #0]
  34095. pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  34096. pcb->rtime = -1;
  34097. pcb->cwnd = 1;
  34098. iss = tcp_next_iss();
  34099. pcb->snd_wl2 = iss;
  34100. pcb->snd_nxt = iss;
  34101. 802bf32: 6520 str r0, [r4, #80] ; 0x50
  34102. pcb->lastack = iss;
  34103. pcb->snd_lbb = iss;
  34104. pcb->tmr = tcp_ticks;
  34105. 802bf34: 6263 str r3, [r4, #36] ; 0x24
  34106. pcb->last_timer = tcp_timer_ctr;
  34107. 802bf36: 4b0b ldr r3, [pc, #44] ; (802bf64 <tcp_alloc+0x104>)
  34108. pcb->rtime = -1;
  34109. pcb->cwnd = 1;
  34110. iss = tcp_next_iss();
  34111. pcb->snd_wl2 = iss;
  34112. pcb->snd_nxt = iss;
  34113. pcb->lastack = iss;
  34114. 802bf38: 64a0 str r0, [r4, #72] ; 0x48
  34115. pcb->snd_lbb = iss;
  34116. pcb->tmr = tcp_ticks;
  34117. pcb->last_timer = tcp_timer_ctr;
  34118. 802bf3a: 781b ldrb r3, [r3, #0]
  34119. pcb->cwnd = 1;
  34120. iss = tcp_next_iss();
  34121. pcb->snd_wl2 = iss;
  34122. pcb->snd_nxt = iss;
  34123. pcb->lastack = iss;
  34124. pcb->snd_lbb = iss;
  34125. 802bf3c: 65e0 str r0, [r4, #92] ; 0x5c
  34126. pcb->tmr = tcp_ticks;
  34127. pcb->last_timer = tcp_timer_ctr;
  34128. 802bf3e: f884 3021 strb.w r3, [r4, #33] ; 0x21
  34129. pcb->polltmr = 0;
  34130. #if LWIP_CALLBACK_API
  34131. pcb->recv = tcp_recv_null;
  34132. 802bf42: 4b09 ldr r3, [pc, #36] ; (802bf68 <tcp_alloc+0x108>)
  34133. pcb->lastack = iss;
  34134. pcb->snd_lbb = iss;
  34135. pcb->tmr = tcp_ticks;
  34136. pcb->last_timer = tcp_timer_ctr;
  34137. pcb->polltmr = 0;
  34138. 802bf44: 77e5 strb r5, [r4, #31]
  34139. #if LWIP_CALLBACK_API
  34140. pcb->recv = tcp_recv_null;
  34141. 802bf46: 67e3 str r3, [r4, #124] ; 0x7c
  34142. #endif /* LWIP_CALLBACK_API */
  34143. /* Init KEEPALIVE timer */
  34144. pcb->keep_idle = TCP_KEEPIDLE_DEFAULT;
  34145. 802bf48: 4b08 ldr r3, [pc, #32] ; (802bf6c <tcp_alloc+0x10c>)
  34146. #if LWIP_TCP_KEEPALIVE
  34147. pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
  34148. pcb->keep_cnt = TCP_KEEPCNT_DEFAULT;
  34149. #endif /* LWIP_TCP_KEEPALIVE */
  34150. pcb->keep_cnt_sent = 0;
  34151. 802bf4a: f884 5092 strb.w r5, [r4, #146] ; 0x92
  34152. #if LWIP_CALLBACK_API
  34153. pcb->recv = tcp_recv_null;
  34154. #endif /* LWIP_CALLBACK_API */
  34155. /* Init KEEPALIVE timer */
  34156. pcb->keep_idle = TCP_KEEPIDLE_DEFAULT;
  34157. 802bf4e: f8c4 308c str.w r3, [r4, #140] ; 0x8c
  34158. #endif /* LWIP_TCP_KEEPALIVE */
  34159. pcb->keep_cnt_sent = 0;
  34160. }
  34161. return pcb;
  34162. }
  34163. 802bf52: 4620 mov r0, r4
  34164. 802bf54: bdf8 pop {r3, r4, r5, r6, r7, pc}
  34165. 802bf56: bf00 nop
  34166. 802bf58: 20010d8c .word 0x20010d8c
  34167. 802bf5c: 20010d7c .word 0x20010d7c
  34168. 802bf60: 20010d78 .word 0x20010d78
  34169. 802bf64: 2000e0a1 .word 0x2000e0a1
  34170. 802bf68: 0802bd29 .word 0x0802bd29
  34171. 802bf6c: 006ddd00 .word 0x006ddd00
  34172. 0802bf70 <tcp_new>:
  34173. * @return a new tcp_pcb that initially is in state CLOSED
  34174. */
  34175. struct tcp_pcb *
  34176. tcp_new(void)
  34177. {
  34178. return tcp_alloc(TCP_PRIO_NORMAL);
  34179. 802bf70: 2040 movs r0, #64 ; 0x40
  34180. 802bf72: f7ff bf75 b.w 802be60 <tcp_alloc>
  34181. 0802bf76 <tcp_eff_send_mss>:
  34182. * by using ip_route to determin the netif used to send to the address and
  34183. * calculating the minimum of TCP_MSS and that netif's mtu (if set).
  34184. */
  34185. u16_t
  34186. tcp_eff_send_mss(u16_t sendmss, ip_addr_t *addr)
  34187. {
  34188. 802bf76: b510 push {r4, lr}
  34189. 802bf78: 4604 mov r4, r0
  34190. u16_t mss_s;
  34191. struct netif *outif;
  34192. outif = ip_route(addr);
  34193. 802bf7a: 4608 mov r0, r1
  34194. 802bf7c: f002 f8f2 bl 802e164 <ip_route>
  34195. if ((outif != NULL) && (outif->mtu != 0)) {
  34196. 802bf80: b130 cbz r0, 802bf90 <tcp_eff_send_mss+0x1a>
  34197. 802bf82: 8c83 ldrh r3, [r0, #36] ; 0x24
  34198. 802bf84: b123 cbz r3, 802bf90 <tcp_eff_send_mss+0x1a>
  34199. mss_s = outif->mtu - IP_HLEN - TCP_HLEN;
  34200. 802bf86: 3b28 subs r3, #40 ; 0x28
  34201. /* RFC 1122, chap 4.2.2.6:
  34202. * Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize
  34203. * We correct for TCP options in tcp_write(), and don't support IP options.
  34204. */
  34205. sendmss = LWIP_MIN(sendmss, mss_s);
  34206. 802bf88: b29b uxth r3, r3
  34207. 802bf8a: 429c cmp r4, r3
  34208. 802bf8c: bf28 it cs
  34209. 802bf8e: 461c movcs r4, r3
  34210. }
  34211. return sendmss;
  34212. }
  34213. 802bf90: 4620 mov r0, r4
  34214. 802bf92: bd10 pop {r4, pc}
  34215. 0802bf94 <tcp_parseopt>:
  34216. *
  34217. * @param pcb the tcp_pcb for which a segment arrived
  34218. */
  34219. static void
  34220. tcp_parseopt(struct tcp_pcb *pcb)
  34221. {
  34222. 802bf94: b5f8 push {r3, r4, r5, r6, r7, lr}
  34223. u8_t *opts, opt;
  34224. #if LWIP_TCP_TIMESTAMPS
  34225. u32_t tsval;
  34226. #endif
  34227. opts = (u8_t *)tcphdr + TCP_HLEN;
  34228. 802bf96: 4d1e ldr r5, [pc, #120] ; (802c010 <tcp_parseopt+0x7c>)
  34229. 802bf98: 682c ldr r4, [r5, #0]
  34230. *
  34231. * @param pcb the tcp_pcb for which a segment arrived
  34232. */
  34233. static void
  34234. tcp_parseopt(struct tcp_pcb *pcb)
  34235. {
  34236. 802bf9a: 4606 mov r6, r0
  34237. #endif
  34238. opts = (u8_t *)tcphdr + TCP_HLEN;
  34239. /* Parse the TCP MSS option, if present. */
  34240. if(TCPH_HDRLEN(tcphdr) > 0x5) {
  34241. 802bf9c: 89a0 ldrh r0, [r4, #12]
  34242. 802bf9e: f7fe f81e bl 8029fde <lwip_ntohs>
  34243. 802bfa2: f3c0 300f ubfx r0, r0, #12, #16
  34244. 802bfa6: 2805 cmp r0, #5
  34245. 802bfa8: d931 bls.n 802c00e <tcp_parseopt+0x7a>
  34246. max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2;
  34247. 802bfaa: 682b ldr r3, [r5, #0]
  34248. 802bfac: 8998 ldrh r0, [r3, #12]
  34249. 802bfae: f7fe f816 bl 8029fde <lwip_ntohs>
  34250. 802bfb2: 0b00 lsrs r0, r0, #12
  34251. 802bfb4: 1f41 subs r1, r0, #5
  34252. 802bfb6: 0089 lsls r1, r1, #2
  34253. u8_t *opts, opt;
  34254. #if LWIP_TCP_TIMESTAMPS
  34255. u32_t tsval;
  34256. #endif
  34257. opts = (u8_t *)tcphdr + TCP_HLEN;
  34258. 802bfb8: 3414 adds r4, #20
  34259. /* Parse the TCP MSS option, if present. */
  34260. if(TCPH_HDRLEN(tcphdr) > 0x5) {
  34261. max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2;
  34262. 802bfba: b289 uxth r1, r1
  34263. for (c = 0; c < max_c; ) {
  34264. 802bfbc: 2300 movs r3, #0
  34265. return;
  34266. }
  34267. /* An MSS option with the right option length. */
  34268. mss = (opts[c + 2] << 8) | opts[c + 3];
  34269. /* Limit the mss to the configured TCP_MSS and prevent division by zero */
  34270. pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss;
  34271. 802bfbe: f240 50b3 movw r0, #1459 ; 0x5b3
  34272. 802bfc2: f240 55b4 movw r5, #1460 ; 0x5b4
  34273. opts = (u8_t *)tcphdr + TCP_HLEN;
  34274. /* Parse the TCP MSS option, if present. */
  34275. if(TCPH_HDRLEN(tcphdr) > 0x5) {
  34276. max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2;
  34277. for (c = 0; c < max_c; ) {
  34278. 802bfc6: e020 b.n 802c00a <tcp_parseopt+0x76>
  34279. opt = opts[c];
  34280. switch (opt) {
  34281. 802bfc8: 5ce2 ldrb r2, [r4, r3]
  34282. 802bfca: 2a01 cmp r2, #1
  34283. 802bfcc: d005 beq.n 802bfda <tcp_parseopt+0x46>
  34284. 802bfce: d31e bcc.n 802c00e <tcp_parseopt+0x7a>
  34285. 802bfd0: 2a02 cmp r2, #2
  34286. 802bfd2: eb04 0203 add.w r2, r4, r3
  34287. 802bfd6: d114 bne.n 802c002 <tcp_parseopt+0x6e>
  34288. 802bfd8: e001 b.n 802bfde <tcp_parseopt+0x4a>
  34289. /* End of options. */
  34290. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: EOL\n"));
  34291. return;
  34292. case 0x01:
  34293. /* NOP option. */
  34294. ++c;
  34295. 802bfda: 3301 adds r3, #1
  34296. 802bfdc: e014 b.n 802c008 <tcp_parseopt+0x74>
  34297. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n"));
  34298. break;
  34299. case 0x02:
  34300. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MSS\n"));
  34301. if (opts[c + 1] != 0x04 || c + 0x04 > max_c) {
  34302. 802bfde: 7857 ldrb r7, [r2, #1]
  34303. 802bfe0: 2f04 cmp r7, #4
  34304. 802bfe2: d114 bne.n 802c00e <tcp_parseopt+0x7a>
  34305. 802bfe4: 1cdf adds r7, r3, #3
  34306. 802bfe6: 428f cmp r7, r1
  34307. 802bfe8: da11 bge.n 802c00e <tcp_parseopt+0x7a>
  34308. /* Bad length */
  34309. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
  34310. return;
  34311. }
  34312. /* An MSS option with the right option length. */
  34313. mss = (opts[c + 2] << 8) | opts[c + 3];
  34314. 802bfea: 7897 ldrb r7, [r2, #2]
  34315. 802bfec: 78d2 ldrb r2, [r2, #3]
  34316. 802bfee: ea42 2207 orr.w r2, r2, r7, lsl #8
  34317. /* Limit the mss to the configured TCP_MSS and prevent division by zero */
  34318. pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss;
  34319. 802bff2: 1e57 subs r7, r2, #1
  34320. 802bff4: b2bf uxth r7, r7
  34321. 802bff6: 4287 cmp r7, r0
  34322. 802bff8: bf88 it hi
  34323. 802bffa: 462a movhi r2, r5
  34324. 802bffc: 86f2 strh r2, [r6, #54] ; 0x36
  34325. /* Advance to next option */
  34326. c += 0x04;
  34327. 802bffe: 3304 adds r3, #4
  34328. 802c000: e002 b.n 802c008 <tcp_parseopt+0x74>
  34329. c += 0x0A;
  34330. break;
  34331. #endif
  34332. default:
  34333. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n"));
  34334. if (opts[c + 1] == 0) {
  34335. 802c002: 7852 ldrb r2, [r2, #1]
  34336. 802c004: b11a cbz r2, 802c00e <tcp_parseopt+0x7a>
  34337. and we don't process them further. */
  34338. return;
  34339. }
  34340. /* All other options have a length field, so that we easily
  34341. can skip past them. */
  34342. c += opts[c + 1];
  34343. 802c006: 18d3 adds r3, r2, r3
  34344. 802c008: b29b uxth r3, r3
  34345. opts = (u8_t *)tcphdr + TCP_HLEN;
  34346. /* Parse the TCP MSS option, if present. */
  34347. if(TCPH_HDRLEN(tcphdr) > 0x5) {
  34348. max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2;
  34349. for (c = 0; c < max_c; ) {
  34350. 802c00a: 428b cmp r3, r1
  34351. 802c00c: d3dc bcc.n 802bfc8 <tcp_parseopt+0x34>
  34352. 802c00e: bdf8 pop {r3, r4, r5, r6, r7, pc}
  34353. 802c010: 2000e0a4 .word 0x2000e0a4
  34354. 0802c014 <tcp_receive>:
  34355. *
  34356. * Called from tcp_process().
  34357. */
  34358. static void
  34359. tcp_receive(struct tcp_pcb *pcb)
  34360. {
  34361. 802c014: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  34362. u16_t ooseq_qlen;
  34363. #endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
  34364. LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
  34365. if (flags & TCP_ACK) {
  34366. 802c018: 4ba0 ldr r3, [pc, #640] ; (802c29c <tcp_receive+0x288>)
  34367. 802c01a: 781b ldrb r3, [r3, #0]
  34368. 802c01c: f003 0310 and.w r3, r3, #16
  34369. 802c020: b2db uxtb r3, r3
  34370. *
  34371. * Called from tcp_process().
  34372. */
  34373. static void
  34374. tcp_receive(struct tcp_pcb *pcb)
  34375. {
  34376. 802c022: 4604 mov r4, r0
  34377. u16_t ooseq_qlen;
  34378. #endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
  34379. LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
  34380. if (flags & TCP_ACK) {
  34381. 802c024: 2b00 cmp r3, #0
  34382. 802c026: f000 816b beq.w 802c300 <tcp_receive+0x2ec>
  34383. right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;
  34384. /* Update window. */
  34385. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  34386. 802c02a: 4a9d ldr r2, [pc, #628] ; (802c2a0 <tcp_receive+0x28c>)
  34387. 802c02c: 6d43 ldr r3, [r0, #84] ; 0x54
  34388. 802c02e: 6812 ldr r2, [r2, #0]
  34389. #endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
  34390. LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
  34391. if (flags & TCP_ACK) {
  34392. right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;
  34393. 802c030: f8b0 5060 ldrh.w r5, [r0, #96] ; 0x60
  34394. 802c034: 6d81 ldr r1, [r0, #88] ; 0x58
  34395. /* Update window. */
  34396. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  34397. 802c036: 1a98 subs r0, r3, r2
  34398. 802c038: 2800 cmp r0, #0
  34399. 802c03a: db0e blt.n 802c05a <tcp_receive+0x46>
  34400. 802c03c: 4293 cmp r3, r2
  34401. 802c03e: 4b99 ldr r3, [pc, #612] ; (802c2a4 <tcp_receive+0x290>)
  34402. 802c040: d103 bne.n 802c04a <tcp_receive+0x36>
  34403. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  34404. 802c042: 6818 ldr r0, [r3, #0]
  34405. 802c044: 1a08 subs r0, r1, r0
  34406. 802c046: 2800 cmp r0, #0
  34407. 802c048: db07 blt.n 802c05a <tcp_receive+0x46>
  34408. 802c04a: 681b ldr r3, [r3, #0]
  34409. 802c04c: 4299 cmp r1, r3
  34410. 802c04e: d11f bne.n 802c090 <tcp_receive+0x7c>
  34411. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  34412. 802c050: 4b95 ldr r3, [pc, #596] ; (802c2a8 <tcp_receive+0x294>)
  34413. 802c052: 681b ldr r3, [r3, #0]
  34414. 802c054: 89db ldrh r3, [r3, #14]
  34415. 802c056: 42ab cmp r3, r5
  34416. 802c058: d91a bls.n 802c090 <tcp_receive+0x7c>
  34417. pcb->snd_wnd = tcphdr->wnd;
  34418. 802c05a: 4b93 ldr r3, [pc, #588] ; (802c2a8 <tcp_receive+0x294>)
  34419. /* keep track of the biggest window announced by the remote host to calculate
  34420. the maximum segment size */
  34421. if (pcb->snd_wnd_max < tcphdr->wnd) {
  34422. 802c05c: f8b4 6062 ldrh.w r6, [r4, #98] ; 0x62
  34423. /* Update window. */
  34424. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  34425. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  34426. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  34427. pcb->snd_wnd = tcphdr->wnd;
  34428. 802c060: 681b ldr r3, [r3, #0]
  34429. 802c062: 89d8 ldrh r0, [r3, #14]
  34430. /* keep track of the biggest window announced by the remote host to calculate
  34431. the maximum segment size */
  34432. if (pcb->snd_wnd_max < tcphdr->wnd) {
  34433. pcb->snd_wnd_max = tcphdr->wnd;
  34434. }
  34435. pcb->snd_wl1 = seqno;
  34436. 802c064: 6562 str r2, [r4, #84] ; 0x54
  34437. pcb->snd_wl2 = ackno;
  34438. 802c066: 4a8f ldr r2, [pc, #572] ; (802c2a4 <tcp_receive+0x290>)
  34439. /* Update window. */
  34440. if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
  34441. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  34442. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  34443. pcb->snd_wnd = tcphdr->wnd;
  34444. 802c068: f8a4 0060 strh.w r0, [r4, #96] ; 0x60
  34445. the maximum segment size */
  34446. if (pcb->snd_wnd_max < tcphdr->wnd) {
  34447. pcb->snd_wnd_max = tcphdr->wnd;
  34448. }
  34449. pcb->snd_wl1 = seqno;
  34450. pcb->snd_wl2 = ackno;
  34451. 802c06c: 6812 ldr r2, [r2, #0]
  34452. (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
  34453. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  34454. pcb->snd_wnd = tcphdr->wnd;
  34455. /* keep track of the biggest window announced by the remote host to calculate
  34456. the maximum segment size */
  34457. if (pcb->snd_wnd_max < tcphdr->wnd) {
  34458. 802c06e: 4286 cmp r6, r0
  34459. pcb->snd_wnd_max = tcphdr->wnd;
  34460. }
  34461. pcb->snd_wl1 = seqno;
  34462. pcb->snd_wl2 = ackno;
  34463. 802c070: 65a2 str r2, [r4, #88] ; 0x58
  34464. (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
  34465. pcb->snd_wnd = tcphdr->wnd;
  34466. /* keep track of the biggest window announced by the remote host to calculate
  34467. the maximum segment size */
  34468. if (pcb->snd_wnd_max < tcphdr->wnd) {
  34469. pcb->snd_wnd_max = tcphdr->wnd;
  34470. 802c072: bf38 it cc
  34471. 802c074: f8a4 0062 strhcc.w r0, [r4, #98] ; 0x62
  34472. 802c078: f894 2091 ldrb.w r2, [r4, #145] ; 0x91
  34473. }
  34474. pcb->snd_wl1 = seqno;
  34475. pcb->snd_wl2 = ackno;
  34476. if (pcb->snd_wnd == 0) {
  34477. 802c07c: b920 cbnz r0, 802c088 <tcp_receive+0x74>
  34478. if (pcb->persist_backoff == 0) {
  34479. 802c07e: b93a cbnz r2, 802c090 <tcp_receive+0x7c>
  34480. /* start persist timer */
  34481. pcb->persist_cnt = 0;
  34482. 802c080: f884 0090 strb.w r0, [r4, #144] ; 0x90
  34483. pcb->persist_backoff = 1;
  34484. 802c084: 2301 movs r3, #1
  34485. 802c086: e001 b.n 802c08c <tcp_receive+0x78>
  34486. }
  34487. } else if (pcb->persist_backoff > 0) {
  34488. 802c088: b112 cbz r2, 802c090 <tcp_receive+0x7c>
  34489. /* stop persist timer */
  34490. pcb->persist_backoff = 0;
  34491. 802c08a: 2300 movs r3, #0
  34492. 802c08c: f884 3091 strb.w r3, [r4, #145] ; 0x91
  34493. * If it only passes 1, should reset dupack counter
  34494. *
  34495. */
  34496. /* Clause 1 */
  34497. if (TCP_SEQ_LEQ(ackno, pcb->lastack)) {
  34498. 802c090: 4b84 ldr r3, [pc, #528] ; (802c2a4 <tcp_receive+0x290>)
  34499. 802c092: 6ca2 ldr r2, [r4, #72] ; 0x48
  34500. 802c094: 681b ldr r3, [r3, #0]
  34501. 802c096: 1a98 subs r0, r3, r2
  34502. 802c098: 2800 cmp r0, #0
  34503. 802c09a: dc34 bgt.n 802c106 <tcp_receive+0xf2>
  34504. pcb->acked = 0;
  34505. 802c09c: 2000 movs r0, #0
  34506. 802c09e: f8a4 0064 strh.w r0, [r4, #100] ; 0x64
  34507. /* Clause 2 */
  34508. if (tcplen == 0) {
  34509. 802c0a2: 4882 ldr r0, [pc, #520] ; (802c2ac <tcp_receive+0x298>)
  34510. 802c0a4: 8800 ldrh r0, [r0, #0]
  34511. 802c0a6: 2800 cmp r0, #0
  34512. 802c0a8: f040 81f4 bne.w 802c494 <tcp_receive+0x480>
  34513. /* Clause 3 */
  34514. if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge){
  34515. 802c0ac: f8b4 6060 ldrh.w r6, [r4, #96] ; 0x60
  34516. 802c0b0: 6da0 ldr r0, [r4, #88] ; 0x58
  34517. #endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */
  34518. LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
  34519. if (flags & TCP_ACK) {
  34520. right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;
  34521. 802c0b2: 1869 adds r1, r5, r1
  34522. if (TCP_SEQ_LEQ(ackno, pcb->lastack)) {
  34523. pcb->acked = 0;
  34524. /* Clause 2 */
  34525. if (tcplen == 0) {
  34526. /* Clause 3 */
  34527. if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge){
  34528. 802c0b4: 1830 adds r0, r6, r0
  34529. 802c0b6: 4288 cmp r0, r1
  34530. 802c0b8: f040 81ec bne.w 802c494 <tcp_receive+0x480>
  34531. /* Clause 4 */
  34532. if (pcb->rtime >= 0) {
  34533. 802c0bc: f9b4 1034 ldrsh.w r1, [r4, #52] ; 0x34
  34534. 802c0c0: 2900 cmp r1, #0
  34535. 802c0c2: f2c0 81e7 blt.w 802c494 <tcp_receive+0x480>
  34536. /* Clause 5 */
  34537. if (pcb->lastack == ackno) {
  34538. 802c0c6: 429a cmp r2, r3
  34539. 802c0c8: f040 81e4 bne.w 802c494 <tcp_receive+0x480>
  34540. found_dupack = 1;
  34541. if ((u8_t)(pcb->dupacks + 1) > pcb->dupacks) {
  34542. 802c0cc: f894 2047 ldrb.w r2, [r4, #71] ; 0x47
  34543. 802c0d0: 1c53 adds r3, r2, #1
  34544. 802c0d2: b2db uxtb r3, r3
  34545. 802c0d4: 4293 cmp r3, r2
  34546. ++pcb->dupacks;
  34547. 802c0d6: bf88 it hi
  34548. 802c0d8: f884 3047 strbhi.w r3, [r4, #71] ; 0x47
  34549. }
  34550. if (pcb->dupacks > 3) {
  34551. 802c0dc: f894 3047 ldrb.w r3, [r4, #71] ; 0x47
  34552. 802c0e0: 2b03 cmp r3, #3
  34553. 802c0e2: d90a bls.n 802c0fa <tcp_receive+0xe6>
  34554. /* Inflate the congestion window, but not if it means that
  34555. the value overflows. */
  34556. if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
  34557. 802c0e4: f8b4 204c ldrh.w r2, [r4, #76] ; 0x4c
  34558. 802c0e8: 8ee3 ldrh r3, [r4, #54] ; 0x36
  34559. 802c0ea: 18d3 adds r3, r2, r3
  34560. 802c0ec: b29b uxth r3, r3
  34561. 802c0ee: 4293 cmp r3, r2
  34562. 802c0f0: f240 80b2 bls.w 802c258 <tcp_receive+0x244>
  34563. pcb->cwnd += pcb->mss;
  34564. 802c0f4: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  34565. 802c0f8: e0ae b.n 802c258 <tcp_receive+0x244>
  34566. }
  34567. } else if (pcb->dupacks == 3) {
  34568. 802c0fa: f040 80ad bne.w 802c258 <tcp_receive+0x244>
  34569. /* Do fast retransmit */
  34570. tcp_rexmit_fast(pcb);
  34571. 802c0fe: 4620 mov r0, r4
  34572. 802c100: f001 fa92 bl 802d628 <tcp_rexmit_fast>
  34573. 802c104: e0a8 b.n 802c258 <tcp_receive+0x244>
  34574. /* If Clause (1) or more is true, but not a duplicate ack, reset
  34575. * count of consecutive duplicate acks */
  34576. if (!found_dupack) {
  34577. pcb->dupacks = 0;
  34578. }
  34579. } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)){
  34580. 802c106: 43d1 mvns r1, r2
  34581. 802c108: 42d9 cmn r1, r3
  34582. 802c10a: d47e bmi.n 802c20a <tcp_receive+0x1f6>
  34583. 802c10c: 6d21 ldr r1, [r4, #80] ; 0x50
  34584. 802c10e: 1a59 subs r1, r3, r1
  34585. 802c110: 2900 cmp r1, #0
  34586. 802c112: dc7a bgt.n 802c20a <tcp_receive+0x1f6>
  34587. /* We come here when the ACK acknowledges new data. */
  34588. /* Reset the "IN Fast Retransmit" flag, since we are no longer
  34589. in fast retransmit. Also reset the congestion window to the
  34590. slow start threshold. */
  34591. if (pcb->flags & TF_INFR) {
  34592. 802c114: 7fa1 ldrb r1, [r4, #30]
  34593. 802c116: f001 0004 and.w r0, r1, #4
  34594. 802c11a: b2c0 uxtb r0, r0
  34595. 802c11c: b130 cbz r0, 802c12c <tcp_receive+0x118>
  34596. pcb->flags &= ~TF_INFR;
  34597. 802c11e: f021 0104 bic.w r1, r1, #4
  34598. 802c122: 77a1 strb r1, [r4, #30]
  34599. pcb->cwnd = pcb->ssthresh;
  34600. 802c124: f8b4 104e ldrh.w r1, [r4, #78] ; 0x4e
  34601. 802c128: f8a4 104c strh.w r1, [r4, #76] ; 0x4c
  34602. /* Reset the number of retransmissions. */
  34603. pcb->nrtx = 0;
  34604. /* Reset the retransmission time-out. */
  34605. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  34606. 802c12c: f9b4 5040 ldrsh.w r5, [r4, #64] ; 0x40
  34607. 802c130: f8b4 0042 ldrh.w r0, [r4, #66] ; 0x42
  34608. pcb->snd_buf += pcb->acked;
  34609. /* Reset the fast retransmit variables. */
  34610. pcb->dupacks = 0;
  34611. pcb->lastack = ackno;
  34612. 802c134: 64a3 str r3, [r4, #72] ; 0x48
  34613. /* Reset the number of retransmissions. */
  34614. pcb->nrtx = 0;
  34615. /* Reset the retransmission time-out. */
  34616. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  34617. 802c136: eb00 00e5 add.w r0, r0, r5, asr #3
  34618. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  34619. pcb->acked = (u16_t)(ackno - pcb->lastack);
  34620. 802c13a: 1a9a subs r2, r3, r2
  34621. /* Reset the number of retransmissions. */
  34622. pcb->nrtx = 0;
  34623. /* Reset the retransmission time-out. */
  34624. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  34625. 802c13c: f8a4 0044 strh.w r0, [r4, #68] ; 0x44
  34626. pcb->dupacks = 0;
  34627. pcb->lastack = ackno;
  34628. /* Update the congestion control variables (cwnd and
  34629. ssthresh). */
  34630. if (pcb->state >= ESTABLISHED) {
  34631. 802c140: 7e23 ldrb r3, [r4, #24]
  34632. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  34633. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  34634. pcb->acked = (u16_t)(ackno - pcb->lastack);
  34635. pcb->snd_buf += pcb->acked;
  34636. 802c142: f8b4 0066 ldrh.w r0, [r4, #102] ; 0x66
  34637. /* Reset the retransmission time-out. */
  34638. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  34639. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  34640. pcb->acked = (u16_t)(ackno - pcb->lastack);
  34641. 802c146: f8a4 2064 strh.w r2, [r4, #100] ; 0x64
  34642. pcb->flags &= ~TF_INFR;
  34643. pcb->cwnd = pcb->ssthresh;
  34644. }
  34645. /* Reset the number of retransmissions. */
  34646. pcb->nrtx = 0;
  34647. 802c14a: 2100 movs r1, #0
  34648. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  34649. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  34650. pcb->acked = (u16_t)(ackno - pcb->lastack);
  34651. pcb->snd_buf += pcb->acked;
  34652. 802c14c: 1812 adds r2, r2, r0
  34653. pcb->dupacks = 0;
  34654. pcb->lastack = ackno;
  34655. /* Update the congestion control variables (cwnd and
  34656. ssthresh). */
  34657. if (pcb->state >= ESTABLISHED) {
  34658. 802c14e: 2b03 cmp r3, #3
  34659. pcb->flags &= ~TF_INFR;
  34660. pcb->cwnd = pcb->ssthresh;
  34661. }
  34662. /* Reset the number of retransmissions. */
  34663. pcb->nrtx = 0;
  34664. 802c150: f884 1046 strb.w r1, [r4, #70] ; 0x46
  34665. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  34666. /* Update the send buffer space. Diff between the two can never exceed 64K? */
  34667. pcb->acked = (u16_t)(ackno - pcb->lastack);
  34668. pcb->snd_buf += pcb->acked;
  34669. 802c154: f8a4 2066 strh.w r2, [r4, #102] ; 0x66
  34670. /* Reset the fast retransmit variables. */
  34671. pcb->dupacks = 0;
  34672. 802c158: f884 1047 strb.w r1, [r4, #71] ; 0x47
  34673. pcb->lastack = ackno;
  34674. /* Update the congestion control variables (cwnd and
  34675. ssthresh). */
  34676. if (pcb->state >= ESTABLISHED) {
  34677. 802c15c: d931 bls.n 802c1c2 <tcp_receive+0x1ae>
  34678. if (pcb->cwnd < pcb->ssthresh) {
  34679. 802c15e: f8b4 204e ldrh.w r2, [r4, #78] ; 0x4e
  34680. 802c162: f8b4 304c ldrh.w r3, [r4, #76] ; 0x4c
  34681. 802c166: 429a cmp r2, r3
  34682. if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
  34683. 802c168: 8ee2 ldrh r2, [r4, #54] ; 0x36
  34684. pcb->lastack = ackno;
  34685. /* Update the congestion control variables (cwnd and
  34686. ssthresh). */
  34687. if (pcb->state >= ESTABLISHED) {
  34688. if (pcb->cwnd < pcb->ssthresh) {
  34689. 802c16a: d900 bls.n 802c16e <tcp_receive+0x15a>
  34690. 802c16c: e002 b.n 802c174 <tcp_receive+0x160>
  34691. if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
  34692. pcb->cwnd += pcb->mss;
  34693. }
  34694. LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %"U16_F"\n", pcb->cwnd));
  34695. } else {
  34696. u16_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd);
  34697. 802c16e: 4352 muls r2, r2
  34698. 802c170: fb92 f2f3 sdiv r2, r2, r3
  34699. 802c174: 189a adds r2, r3, r2
  34700. 802c176: b292 uxth r2, r2
  34701. if (new_cwnd > pcb->cwnd) {
  34702. 802c178: 429a cmp r2, r3
  34703. 802c17a: d922 bls.n 802c1c2 <tcp_receive+0x1ae>
  34704. pcb->cwnd = new_cwnd;
  34705. 802c17c: f8a4 204c strh.w r2, [r4, #76] ; 0x4c
  34706. 802c180: e01f b.n 802c1c2 <tcp_receive+0x1ae>
  34707. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unacked\n",
  34708. ntohl(pcb->unacked->tcphdr->seqno),
  34709. ntohl(pcb->unacked->tcphdr->seqno) +
  34710. TCP_TCPLEN(pcb->unacked)));
  34711. next = pcb->unacked;
  34712. 802c182: 6f25 ldr r5, [r4, #112] ; 0x70
  34713. pcb->unacked = pcb->unacked->next;
  34714. 802c184: 682b ldr r3, [r5, #0]
  34715. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen));
  34716. LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p)));
  34717. 802c186: 6868 ldr r0, [r5, #4]
  34718. ntohl(pcb->unacked->tcphdr->seqno),
  34719. ntohl(pcb->unacked->tcphdr->seqno) +
  34720. TCP_TCPLEN(pcb->unacked)));
  34721. next = pcb->unacked;
  34722. pcb->unacked = pcb->unacked->next;
  34723. 802c188: 6723 str r3, [r4, #112] ; 0x70
  34724. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen));
  34725. LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p)));
  34726. 802c18a: f7ff f935 bl 802b3f8 <pbuf_clen>
  34727. /* Prevent ACK for FIN to generate a sent event */
  34728. if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) {
  34729. 802c18e: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  34730. 802c192: b153 cbz r3, 802c1aa <tcp_receive+0x196>
  34731. 802c194: 68eb ldr r3, [r5, #12]
  34732. 802c196: 8998 ldrh r0, [r3, #12]
  34733. 802c198: f7fd ff21 bl 8029fde <lwip_ntohs>
  34734. 802c19c: 07c3 lsls r3, r0, #31
  34735. 802c19e: d504 bpl.n 802c1aa <tcp_receive+0x196>
  34736. pcb->acked--;
  34737. 802c1a0: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  34738. 802c1a4: 3b01 subs r3, #1
  34739. 802c1a6: f8a4 3064 strh.w r3, [r4, #100] ; 0x64
  34740. }
  34741. pcb->snd_queuelen -= pbuf_clen(next->p);
  34742. 802c1aa: 6868 ldr r0, [r5, #4]
  34743. 802c1ac: f8b4 7068 ldrh.w r7, [r4, #104] ; 0x68
  34744. 802c1b0: f7ff f922 bl 802b3f8 <pbuf_clen>
  34745. 802c1b4: 1a38 subs r0, r7, r0
  34746. 802c1b6: f8a4 0068 strh.w r0, [r4, #104] ; 0x68
  34747. tcp_seg_free(next);
  34748. 802c1ba: 4628 mov r0, r5
  34749. 802c1bc: f7ff faf5 bl 802b7aa <tcp_seg_free>
  34750. 802c1c0: e000 b.n 802c1c4 <tcp_receive+0x1b0>
  34751. ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
  34752. /* Remove segment from the unacknowledged list if the incoming
  34753. ACK acknowlegdes them. */
  34754. while (pcb->unacked != NULL &&
  34755. TCP_SEQ_LEQ(ntohl(pcb->unacked->tcphdr->seqno) +
  34756. 802c1c2: 4e38 ldr r6, [pc, #224] ; (802c2a4 <tcp_receive+0x290>)
  34757. pcb->unacked != NULL?
  34758. ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
  34759. /* Remove segment from the unacknowledged list if the incoming
  34760. ACK acknowlegdes them. */
  34761. while (pcb->unacked != NULL &&
  34762. 802c1c4: 6f23 ldr r3, [r4, #112] ; 0x70
  34763. 802c1c6: b91b cbnz r3, 802c1d0 <tcp_receive+0x1bc>
  34764. }
  34765. }
  34766. /* If there's nothing left to acknowledge, stop the retransmit
  34767. timer, otherwise reset it to start again */
  34768. if(pcb->unacked == NULL)
  34769. 802c1c8: 6f22 ldr r2, [r4, #112] ; 0x70
  34770. 802c1ca: 2300 movs r3, #0
  34771. 802c1cc: b9d2 cbnz r2, 802c204 <tcp_receive+0x1f0>
  34772. 802c1ce: e015 b.n 802c1fc <tcp_receive+0x1e8>
  34773. ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
  34774. /* Remove segment from the unacknowledged list if the incoming
  34775. ACK acknowlegdes them. */
  34776. while (pcb->unacked != NULL &&
  34777. TCP_SEQ_LEQ(ntohl(pcb->unacked->tcphdr->seqno) +
  34778. 802c1d0: 68db ldr r3, [r3, #12]
  34779. 802c1d2: 6858 ldr r0, [r3, #4]
  34780. 802c1d4: f7fd ff0a bl 8029fec <lwip_ntohl>
  34781. 802c1d8: 6f23 ldr r3, [r4, #112] ; 0x70
  34782. 802c1da: 891d ldrh r5, [r3, #8]
  34783. 802c1dc: 68db ldr r3, [r3, #12]
  34784. 802c1de: 4607 mov r7, r0
  34785. 802c1e0: 8998 ldrh r0, [r3, #12]
  34786. 802c1e2: f7fd fefc bl 8029fde <lwip_ntohs>
  34787. 802c1e6: 6833 ldr r3, [r6, #0]
  34788. 802c1e8: f010 0003 ands.w r0, r0, #3
  34789. 802c1ec: bf18 it ne
  34790. 802c1ee: 2001 movne r0, #1
  34791. 802c1f0: 1afb subs r3, r7, r3
  34792. 802c1f2: 1828 adds r0, r5, r0
  34793. 802c1f4: 181b adds r3, r3, r0
  34794. pcb->unacked != NULL?
  34795. ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
  34796. /* Remove segment from the unacknowledged list if the incoming
  34797. ACK acknowlegdes them. */
  34798. while (pcb->unacked != NULL &&
  34799. 802c1f6: 2b00 cmp r3, #0
  34800. 802c1f8: ddc3 ble.n 802c182 <tcp_receive+0x16e>
  34801. 802c1fa: e7e5 b.n 802c1c8 <tcp_receive+0x1b4>
  34802. }
  34803. /* If there's nothing left to acknowledge, stop the retransmit
  34804. timer, otherwise reset it to start again */
  34805. if(pcb->unacked == NULL)
  34806. pcb->rtime = -1;
  34807. 802c1fc: f64f 72ff movw r2, #65535 ; 0xffff
  34808. 802c200: 86a2 strh r2, [r4, #52] ; 0x34
  34809. 802c202: e000 b.n 802c206 <tcp_receive+0x1f2>
  34810. else
  34811. pcb->rtime = 0;
  34812. 802c204: 86a3 strh r3, [r4, #52] ; 0x34
  34813. pcb->polltmr = 0;
  34814. 802c206: 77e3 strb r3, [r4, #31]
  34815. 802c208: e026 b.n 802c258 <tcp_receive+0x244>
  34816. } else {
  34817. /* Fix bug bug #21582: out of sequence ACK, didn't really ack anything */
  34818. pcb->acked = 0;
  34819. 802c20a: 2300 movs r3, #0
  34820. 802c20c: f8a4 3064 strh.w r3, [r4, #100] ; 0x64
  34821. 802c210: e022 b.n 802c258 <tcp_receive+0x244>
  34822. TCP_TCPLEN(pcb->unsent), pcb->snd_nxt)) {
  34823. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unsent\n",
  34824. ntohl(pcb->unsent->tcphdr->seqno), ntohl(pcb->unsent->tcphdr->seqno) +
  34825. TCP_TCPLEN(pcb->unsent)));
  34826. next = pcb->unsent;
  34827. 802c212: 6ee5 ldr r5, [r4, #108] ; 0x6c
  34828. pcb->unsent = pcb->unsent->next;
  34829. 802c214: 682b ldr r3, [r5, #0]
  34830. 802c216: 66e3 str r3, [r4, #108] ; 0x6c
  34831. #if TCP_OVERSIZE
  34832. if (pcb->unsent == NULL) {
  34833. 802c218: b90b cbnz r3, 802c21e <tcp_receive+0x20a>
  34834. pcb->unsent_oversize = 0;
  34835. 802c21a: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  34836. }
  34837. #endif /* TCP_OVERSIZE */
  34838. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen));
  34839. LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p)));
  34840. 802c21e: 6868 ldr r0, [r5, #4]
  34841. 802c220: f7ff f8ea bl 802b3f8 <pbuf_clen>
  34842. /* Prevent ACK for FIN to generate a sent event */
  34843. if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) {
  34844. 802c224: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  34845. 802c228: b153 cbz r3, 802c240 <tcp_receive+0x22c>
  34846. 802c22a: 68eb ldr r3, [r5, #12]
  34847. 802c22c: 8998 ldrh r0, [r3, #12]
  34848. 802c22e: f7fd fed6 bl 8029fde <lwip_ntohs>
  34849. 802c232: 07c7 lsls r7, r0, #31
  34850. 802c234: d504 bpl.n 802c240 <tcp_receive+0x22c>
  34851. pcb->acked--;
  34852. 802c236: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  34853. 802c23a: 3b01 subs r3, #1
  34854. 802c23c: f8a4 3064 strh.w r3, [r4, #100] ; 0x64
  34855. }
  34856. pcb->snd_queuelen -= pbuf_clen(next->p);
  34857. 802c240: 6868 ldr r0, [r5, #4]
  34858. 802c242: f8b4 7068 ldrh.w r7, [r4, #104] ; 0x68
  34859. 802c246: f7ff f8d7 bl 802b3f8 <pbuf_clen>
  34860. 802c24a: 1a38 subs r0, r7, r0
  34861. 802c24c: f8a4 0068 strh.w r0, [r4, #104] ; 0x68
  34862. tcp_seg_free(next);
  34863. 802c250: 4628 mov r0, r5
  34864. 802c252: f7ff faaa bl 802b7aa <tcp_seg_free>
  34865. 802c256: e000 b.n 802c25a <tcp_receive+0x246>
  34866. strange since an "unsent" segment shouldn't be acked. The
  34867. rationale is that lwIP puts all outstanding segments on the
  34868. ->unsent list after a retransmission, so these segments may
  34869. in fact have been sent once. */
  34870. while (pcb->unsent != NULL &&
  34871. TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) +
  34872. 802c258: 4e12 ldr r6, [pc, #72] ; (802c2a4 <tcp_receive+0x290>)
  34873. on the list are acknowledged by the ACK. This may seem
  34874. strange since an "unsent" segment shouldn't be acked. The
  34875. rationale is that lwIP puts all outstanding segments on the
  34876. ->unsent list after a retransmission, so these segments may
  34877. in fact have been sent once. */
  34878. while (pcb->unsent != NULL &&
  34879. 802c25a: 6ee3 ldr r3, [r4, #108] ; 0x6c
  34880. 802c25c: b913 cbnz r3, 802c264 <tcp_receive+0x250>
  34881. pcb->rttest, pcb->rtseq, ackno));
  34882. /* RTT estimation calculations. This is done by checking if the
  34883. incoming segment acknowledges the segment we use to take a
  34884. round-trip time measurement. */
  34885. if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
  34886. 802c25e: 6ba3 ldr r3, [r4, #56] ; 0x38
  34887. 802c260: bb33 cbnz r3, 802c2b0 <tcp_receive+0x29c>
  34888. 802c262: e04d b.n 802c300 <tcp_receive+0x2ec>
  34889. strange since an "unsent" segment shouldn't be acked. The
  34890. rationale is that lwIP puts all outstanding segments on the
  34891. ->unsent list after a retransmission, so these segments may
  34892. in fact have been sent once. */
  34893. while (pcb->unsent != NULL &&
  34894. TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) +
  34895. 802c264: 68db ldr r3, [r3, #12]
  34896. 802c266: 6835 ldr r5, [r6, #0]
  34897. 802c268: 6858 ldr r0, [r3, #4]
  34898. 802c26a: f7fd febf bl 8029fec <lwip_ntohl>
  34899. 802c26e: 6ee3 ldr r3, [r4, #108] ; 0x6c
  34900. 802c270: 891f ldrh r7, [r3, #8]
  34901. 802c272: 68db ldr r3, [r3, #12]
  34902. 802c274: 4680 mov r8, r0
  34903. 802c276: 8998 ldrh r0, [r3, #12]
  34904. 802c278: f7fd feb1 bl 8029fde <lwip_ntohs>
  34905. 802c27c: f010 0003 ands.w r0, r0, #3
  34906. 802c280: bf18 it ne
  34907. 802c282: 2001 movne r0, #1
  34908. 802c284: ebc8 0505 rsb r5, r8, r5
  34909. 802c288: 1838 adds r0, r7, r0
  34910. 802c28a: 1a2d subs r5, r5, r0
  34911. on the list are acknowledged by the ACK. This may seem
  34912. strange since an "unsent" segment shouldn't be acked. The
  34913. rationale is that lwIP puts all outstanding segments on the
  34914. ->unsent list after a retransmission, so these segments may
  34915. in fact have been sent once. */
  34916. while (pcb->unsent != NULL &&
  34917. 802c28c: 2d00 cmp r5, #0
  34918. 802c28e: dbe6 blt.n 802c25e <tcp_receive+0x24a>
  34919. TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) +
  34920. 802c290: 6832 ldr r2, [r6, #0]
  34921. 802c292: 6d23 ldr r3, [r4, #80] ; 0x50
  34922. 802c294: 1ad3 subs r3, r2, r3
  34923. 802c296: 2b00 cmp r3, #0
  34924. 802c298: ddbb ble.n 802c212 <tcp_receive+0x1fe>
  34925. 802c29a: e7e0 b.n 802c25e <tcp_receive+0x24a>
  34926. 802c29c: 2000e0b4 .word 0x2000e0b4
  34927. 802c2a0: 2000e0a8 .word 0x2000e0a8
  34928. 802c2a4: 2000e0b0 .word 0x2000e0b0
  34929. 802c2a8: 2000e0a4 .word 0x2000e0a4
  34930. 802c2ac: 2000e0ac .word 0x2000e0ac
  34931. pcb->rttest, pcb->rtseq, ackno));
  34932. /* RTT estimation calculations. This is done by checking if the
  34933. incoming segment acknowledges the segment we use to take a
  34934. round-trip time measurement. */
  34935. if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
  34936. 802c2b0: 497b ldr r1, [pc, #492] ; (802c4a0 <tcp_receive+0x48c>)
  34937. 802c2b2: 6be2 ldr r2, [r4, #60] ; 0x3c
  34938. 802c2b4: 6809 ldr r1, [r1, #0]
  34939. 802c2b6: 1a52 subs r2, r2, r1
  34940. 802c2b8: 2a00 cmp r2, #0
  34941. 802c2ba: da21 bge.n 802c300 <tcp_receive+0x2ec>
  34942. /* diff between this shouldn't exceed 32K since this are tcp timer ticks
  34943. and a round-trip shouldn't be that long... */
  34944. m = (s16_t)(tcp_ticks - pcb->rttest);
  34945. 802c2bc: 4a79 ldr r2, [pc, #484] ; (802c4a4 <tcp_receive+0x490>)
  34946. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
  34947. m, m * TCP_SLOW_INTERVAL));
  34948. /* This is taken directly from VJs original code in his paper */
  34949. m = m - (pcb->sa >> 3);
  34950. 802c2be: f8b4 1040 ldrh.w r1, [r4, #64] ; 0x40
  34951. incoming segment acknowledges the segment we use to take a
  34952. round-trip time measurement. */
  34953. if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
  34954. /* diff between this shouldn't exceed 32K since this are tcp timer ticks
  34955. and a round-trip shouldn't be that long... */
  34956. m = (s16_t)(tcp_ticks - pcb->rttest);
  34957. 802c2c2: 6812 ldr r2, [r2, #0]
  34958. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
  34959. m, m * TCP_SLOW_INTERVAL));
  34960. /* This is taken directly from VJs original code in his paper */
  34961. m = m - (pcb->sa >> 3);
  34962. 802c2c4: f341 00cc sbfx r0, r1, #3, #13
  34963. incoming segment acknowledges the segment we use to take a
  34964. round-trip time measurement. */
  34965. if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
  34966. /* diff between this shouldn't exceed 32K since this are tcp timer ticks
  34967. and a round-trip shouldn't be that long... */
  34968. m = (s16_t)(tcp_ticks - pcb->rttest);
  34969. 802c2c8: 1ad2 subs r2, r2, r3
  34970. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
  34971. m, m * TCP_SLOW_INTERVAL));
  34972. /* This is taken directly from VJs original code in his paper */
  34973. m = m - (pcb->sa >> 3);
  34974. 802c2ca: 1a12 subs r2, r2, r0
  34975. 802c2cc: b292 uxth r2, r2
  34976. 802c2ce: b293 uxth r3, r2
  34977. pcb->sa += m;
  34978. 802c2d0: 1851 adds r1, r2, r1
  34979. 802c2d2: b289 uxth r1, r1
  34980. if (m < 0) {
  34981. 802c2d4: 0418 lsls r0, r3, #16
  34982. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
  34983. m, m * TCP_SLOW_INTERVAL));
  34984. /* This is taken directly from VJs original code in his paper */
  34985. m = m - (pcb->sa >> 3);
  34986. pcb->sa += m;
  34987. 802c2d6: f8a4 1040 strh.w r1, [r4, #64] ; 0x40
  34988. if (m < 0) {
  34989. 802c2da: d501 bpl.n 802c2e0 <tcp_receive+0x2cc>
  34990. m = -m;
  34991. 802c2dc: 4253 negs r3, r2
  34992. 802c2de: b29b uxth r3, r3
  34993. }
  34994. m = m - (pcb->sv >> 2);
  34995. 802c2e0: f8b4 2042 ldrh.w r2, [r4, #66] ; 0x42
  34996. 802c2e4: f342 008d sbfx r0, r2, #2, #14
  34997. 802c2e8: 1a12 subs r2, r2, r0
  34998. pcb->sv += m;
  34999. 802c2ea: 18d3 adds r3, r2, r3
  35000. 802c2ec: b29b uxth r3, r3
  35001. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  35002. 802c2ee: f341 01cc sbfx r1, r1, #3, #13
  35003. pcb->sa += m;
  35004. if (m < 0) {
  35005. m = -m;
  35006. }
  35007. m = m - (pcb->sv >> 2);
  35008. pcb->sv += m;
  35009. 802c2f2: f8a4 3042 strh.w r3, [r4, #66] ; 0x42
  35010. pcb->rto = (pcb->sa >> 3) + pcb->sv;
  35011. 802c2f6: 185b adds r3, r3, r1
  35012. 802c2f8: f8a4 3044 strh.w r3, [r4, #68] ; 0x44
  35013. LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %"U16_F" (%"U16_F" milliseconds)\n",
  35014. pcb->rto, pcb->rto * TCP_SLOW_INTERVAL));
  35015. pcb->rttest = 0;
  35016. 802c2fc: 2300 movs r3, #0
  35017. 802c2fe: 63a3 str r3, [r4, #56] ; 0x38
  35018. /* If the incoming segment contains data, we must process it
  35019. further unless the pcb already received a FIN.
  35020. (RFC 793, chapeter 3.9, "SEGMENT ARRIVES" in states CLOSE-WAIT, CLOSING,
  35021. LAST-ACK and TIME-WAIT: "Ignore the segment text.") */
  35022. if ((tcplen > 0) && (pcb->state < CLOSE_WAIT)) {
  35023. 802c300: 4b69 ldr r3, [pc, #420] ; (802c4a8 <tcp_receive+0x494>)
  35024. 802c302: 4a6a ldr r2, [pc, #424] ; (802c4ac <tcp_receive+0x498>)
  35025. 802c304: 8818 ldrh r0, [r3, #0]
  35026. 802c306: 2800 cmp r0, #0
  35027. 802c308: f000 80b3 beq.w 802c472 <tcp_receive+0x45e>
  35028. 802c30c: 7e23 ldrb r3, [r4, #24]
  35029. 802c30e: 2b06 cmp r3, #6
  35030. 802c310: f200 80af bhi.w 802c472 <tcp_receive+0x45e>
  35031. this if the sequence number of the incoming segment is less
  35032. than rcv_nxt, and the sequence number plus the length of the
  35033. segment is larger than rcv_nxt. */
  35034. /* if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){
  35035. if (TCP_SEQ_LT(pcb->rcv_nxt, seqno + tcplen)) {*/
  35036. if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)){
  35037. 802c314: 6811 ldr r1, [r2, #0]
  35038. 802c316: 6aa3 ldr r3, [r4, #40] ; 0x28
  35039. 802c318: 43ca mvns r2, r1
  35040. 802c31a: 42da cmn r2, r3
  35041. 802c31c: d425 bmi.n 802c36a <tcp_receive+0x356>
  35042. 802c31e: 1c5a adds r2, r3, #1
  35043. 802c320: 1a52 subs r2, r2, r1
  35044. 802c322: 1a10 subs r0, r2, r0
  35045. 802c324: 2800 cmp r0, #0
  35046. 802c326: dc20 bgt.n 802c36a <tcp_receive+0x356>
  35047. After we are done with adjusting the pbuf pointers we must
  35048. adjust the ->data pointer in the seg and the segment
  35049. length.*/
  35050. off = pcb->rcv_nxt - seqno;
  35051. 802c328: 1a59 subs r1, r3, r1
  35052. p = inseg.p;
  35053. 802c32a: 4b61 ldr r3, [pc, #388] ; (802c4b0 <tcp_receive+0x49c>)
  35054. 802c32c: 6858 ldr r0, [r3, #4]
  35055. LWIP_ASSERT("inseg.p != NULL", inseg.p);
  35056. LWIP_ASSERT("insane offset!", (off < 0x7fff));
  35057. if (inseg.p->len < off) {
  35058. 802c32e: 8943 ldrh r3, [r0, #10]
  35059. 802c330: 428b cmp r3, r1
  35060. 802c332: da0a bge.n 802c34a <tcp_receive+0x336>
  35061. LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
  35062. new_tot_len = (u16_t)(inseg.p->tot_len - off);
  35063. 802c334: 8902 ldrh r2, [r0, #8]
  35064. off -= p->len;
  35065. /* KJM following line changed (with addition of new_tot_len var)
  35066. to fix bug #9076
  35067. inseg.p->tot_len -= p->len; */
  35068. p->tot_len = new_tot_len;
  35069. p->len = 0;
  35070. 802c336: 2500 movs r5, #0
  35071. p = inseg.p;
  35072. LWIP_ASSERT("inseg.p != NULL", inseg.p);
  35073. LWIP_ASSERT("insane offset!", (off < 0x7fff));
  35074. if (inseg.p->len < off) {
  35075. LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
  35076. new_tot_len = (u16_t)(inseg.p->tot_len - off);
  35077. 802c338: 1a52 subs r2, r2, r1
  35078. while (p->len < off) {
  35079. 802c33a: e003 b.n 802c344 <tcp_receive+0x330>
  35080. off -= p->len;
  35081. /* KJM following line changed (with addition of new_tot_len var)
  35082. to fix bug #9076
  35083. inseg.p->tot_len -= p->len; */
  35084. p->tot_len = new_tot_len;
  35085. 802c33c: 8102 strh r2, [r0, #8]
  35086. p->len = 0;
  35087. 802c33e: 8145 strh r5, [r0, #10]
  35088. p = p->next;
  35089. 802c340: 6800 ldr r0, [r0, #0]
  35090. LWIP_ASSERT("insane offset!", (off < 0x7fff));
  35091. if (inseg.p->len < off) {
  35092. LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
  35093. new_tot_len = (u16_t)(inseg.p->tot_len - off);
  35094. while (p->len < off) {
  35095. off -= p->len;
  35096. 802c342: 1ac9 subs r1, r1, r3
  35097. LWIP_ASSERT("inseg.p != NULL", inseg.p);
  35098. LWIP_ASSERT("insane offset!", (off < 0x7fff));
  35099. if (inseg.p->len < off) {
  35100. LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off));
  35101. new_tot_len = (u16_t)(inseg.p->tot_len - off);
  35102. while (p->len < off) {
  35103. 802c344: 8943 ldrh r3, [r0, #10]
  35104. 802c346: 428b cmp r3, r1
  35105. 802c348: dbf8 blt.n 802c33c <tcp_receive+0x328>
  35106. if(pbuf_header(p, (s16_t)-off)) {
  35107. /* Do we need to cope with this failing? Assert for now */
  35108. LWIP_ASSERT("pbuf_header failed", 0);
  35109. }
  35110. } else {
  35111. if(pbuf_header(inseg.p, (s16_t)-off)) {
  35112. 802c34a: 4249 negs r1, r1
  35113. 802c34c: b209 sxth r1, r1
  35114. 802c34e: f7fe ff54 bl 802b1fa <pbuf_header>
  35115. /* Do we need to cope with this failing? Assert for now */
  35116. LWIP_ASSERT("pbuf_header failed", 0);
  35117. }
  35118. }
  35119. inseg.len -= (u16_t)(pcb->rcv_nxt - seqno);
  35120. 802c352: 4a57 ldr r2, [pc, #348] ; (802c4b0 <tcp_receive+0x49c>)
  35121. 802c354: 4955 ldr r1, [pc, #340] ; (802c4ac <tcp_receive+0x498>)
  35122. 802c356: 8915 ldrh r5, [r2, #8]
  35123. 802c358: 6808 ldr r0, [r1, #0]
  35124. 802c35a: 6aa3 ldr r3, [r4, #40] ; 0x28
  35125. 802c35c: 1940 adds r0, r0, r5
  35126. 802c35e: 1ac0 subs r0, r0, r3
  35127. 802c360: 8110 strh r0, [r2, #8]
  35128. inseg.tcphdr->seqno = seqno = pcb->rcv_nxt;
  35129. 802c362: 68d2 ldr r2, [r2, #12]
  35130. 802c364: 600b str r3, [r1, #0]
  35131. 802c366: 6053 str r3, [r2, #4]
  35132. 802c368: e006 b.n 802c378 <tcp_receive+0x364>
  35133. }
  35134. else {
  35135. if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){
  35136. 802c36a: 1ac9 subs r1, r1, r3
  35137. 802c36c: 2900 cmp r1, #0
  35138. 802c36e: da03 bge.n 802c378 <tcp_receive+0x364>
  35139. /* the whole segment is < rcv_nxt */
  35140. /* must be a duplicate of a packet that has already been correctly handled */
  35141. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: duplicate seqno %"U32_F"\n", seqno));
  35142. tcp_ack_now(pcb);
  35143. 802c370: 7fa3 ldrb r3, [r4, #30]
  35144. 802c372: f043 0302 orr.w r3, r3, #2
  35145. 802c376: 77a3 strb r3, [r4, #30]
  35146. }
  35147. /* The sequence number must be within the window (above rcv_nxt
  35148. and below rcv_nxt + rcv_wnd) in order to be further
  35149. processed. */
  35150. if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
  35151. 802c378: 4b4c ldr r3, [pc, #304] ; (802c4ac <tcp_receive+0x498>)
  35152. 802c37a: 6aa2 ldr r2, [r4, #40] ; 0x28
  35153. 802c37c: 681b ldr r3, [r3, #0]
  35154. 802c37e: 1a99 subs r1, r3, r2
  35155. 802c380: 2900 cmp r1, #0
  35156. 802c382: db71 blt.n 802c468 <tcp_receive+0x454>
  35157. 802c384: 1c59 adds r1, r3, #1
  35158. 802c386: 8da0 ldrh r0, [r4, #44] ; 0x2c
  35159. 802c388: 1a89 subs r1, r1, r2
  35160. 802c38a: 1a09 subs r1, r1, r0
  35161. 802c38c: 2900 cmp r1, #0
  35162. 802c38e: dc6b bgt.n 802c468 <tcp_receive+0x454>
  35163. pcb->rcv_nxt + pcb->rcv_wnd - 1)){
  35164. if (pcb->rcv_nxt == seqno) {
  35165. 802c390: 429a cmp r2, r3
  35166. 802c392: d169 bne.n 802c468 <tcp_receive+0x454>
  35167. /* The incoming segment is the next in sequence. We check if
  35168. we have to trim the end of the segment and update rcv_nxt
  35169. and pass the data to the application. */
  35170. tcplen = TCP_TCPLEN(&inseg);
  35171. 802c394: 4d46 ldr r5, [pc, #280] ; (802c4b0 <tcp_receive+0x49c>)
  35172. 802c396: 68eb ldr r3, [r5, #12]
  35173. 802c398: 892e ldrh r6, [r5, #8]
  35174. 802c39a: 8998 ldrh r0, [r3, #12]
  35175. 802c39c: f7fd fe1f bl 8029fde <lwip_ntohs>
  35176. 802c3a0: f010 0003 ands.w r0, r0, #3
  35177. 802c3a4: bf18 it ne
  35178. 802c3a6: 2001 movne r0, #1
  35179. 802c3a8: 4b3f ldr r3, [pc, #252] ; (802c4a8 <tcp_receive+0x494>)
  35180. 802c3aa: 1830 adds r0, r6, r0
  35181. 802c3ac: b280 uxth r0, r0
  35182. 802c3ae: 8018 strh r0, [r3, #0]
  35183. if (tcplen > pcb->rcv_wnd) {
  35184. 802c3b0: 8da3 ldrh r3, [r4, #44] ; 0x2c
  35185. 802c3b2: 4283 cmp r3, r0
  35186. 802c3b4: d230 bcs.n 802c418 <tcp_receive+0x404>
  35187. LWIP_DEBUGF(TCP_INPUT_DEBUG,
  35188. ("tcp_receive: other end overran receive window"
  35189. "seqno %"U32_F" len %"U16_F" right edge %"U32_F"\n",
  35190. seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd));
  35191. if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
  35192. 802c3b6: 68eb ldr r3, [r5, #12]
  35193. 802c3b8: 8998 ldrh r0, [r3, #12]
  35194. 802c3ba: f7fd fe10 bl 8029fde <lwip_ntohs>
  35195. 802c3be: 07c0 lsls r0, r0, #31
  35196. 802c3c0: d50c bpl.n 802c3dc <tcp_receive+0x3c8>
  35197. /* Must remove the FIN from the header as we're trimming
  35198. * that byte of sequence-space from the packet */
  35199. TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) &~ TCP_FIN);
  35200. 802c3c2: 68ed ldr r5, [r5, #12]
  35201. 802c3c4: 89ae ldrh r6, [r5, #12]
  35202. 802c3c6: 4630 mov r0, r6
  35203. 802c3c8: f7fd fe09 bl 8029fde <lwip_ntohs>
  35204. 802c3cc: f000 003e and.w r0, r0, #62 ; 0x3e
  35205. 802c3d0: f7fd fe00 bl 8029fd4 <lwip_htons>
  35206. 802c3d4: f426 567c bic.w r6, r6, #16128 ; 0x3f00
  35207. 802c3d8: 4330 orrs r0, r6
  35208. 802c3da: 81a8 strh r0, [r5, #12]
  35209. }
  35210. /* Adjust length of segment to fit in the window. */
  35211. inseg.len = pcb->rcv_wnd;
  35212. 802c3dc: 8da3 ldrh r3, [r4, #44] ; 0x2c
  35213. 802c3de: 4d34 ldr r5, [pc, #208] ; (802c4b0 <tcp_receive+0x49c>)
  35214. 802c3e0: 812b strh r3, [r5, #8]
  35215. if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) {
  35216. 802c3e2: 68eb ldr r3, [r5, #12]
  35217. 802c3e4: 8998 ldrh r0, [r3, #12]
  35218. 802c3e6: f7fd fdfa bl 8029fde <lwip_ntohs>
  35219. 802c3ea: f000 0002 and.w r0, r0, #2
  35220. 802c3ee: b280 uxth r0, r0
  35221. 802c3f0: b110 cbz r0, 802c3f8 <tcp_receive+0x3e4>
  35222. inseg.len -= 1;
  35223. 802c3f2: 892b ldrh r3, [r5, #8]
  35224. 802c3f4: 3b01 subs r3, #1
  35225. 802c3f6: 812b strh r3, [r5, #8]
  35226. }
  35227. pbuf_realloc(inseg.p, inseg.len);
  35228. 802c3f8: 6868 ldr r0, [r5, #4]
  35229. 802c3fa: 8929 ldrh r1, [r5, #8]
  35230. 802c3fc: f7fe ff4f bl 802b29e <pbuf_realloc>
  35231. tcplen = TCP_TCPLEN(&inseg);
  35232. 802c400: 68eb ldr r3, [r5, #12]
  35233. 802c402: 892e ldrh r6, [r5, #8]
  35234. 802c404: 8998 ldrh r0, [r3, #12]
  35235. 802c406: f7fd fdea bl 8029fde <lwip_ntohs>
  35236. 802c40a: f010 0003 ands.w r0, r0, #3
  35237. 802c40e: bf18 it ne
  35238. 802c410: 2001 movne r0, #1
  35239. 802c412: 4b25 ldr r3, [pc, #148] ; (802c4a8 <tcp_receive+0x494>)
  35240. 802c414: 1830 adds r0, r6, r0
  35241. 802c416: 8018 strh r0, [r3, #0]
  35242. pcb->ooseq = next;
  35243. }
  35244. }
  35245. #endif /* TCP_QUEUE_OOSEQ */
  35246. pcb->rcv_nxt = seqno + tcplen;
  35247. 802c418: 4b23 ldr r3, [pc, #140] ; (802c4a8 <tcp_receive+0x494>)
  35248. 802c41a: 4a24 ldr r2, [pc, #144] ; (802c4ac <tcp_receive+0x498>)
  35249. 802c41c: 881b ldrh r3, [r3, #0]
  35250. 802c41e: 6812 ldr r2, [r2, #0]
  35251. 802c420: 189a adds r2, r3, r2
  35252. 802c422: 62a2 str r2, [r4, #40] ; 0x28
  35253. /* Update the receiver's (our) window. */
  35254. LWIP_ASSERT("tcp_receive: tcplen > rcv_wnd\n", pcb->rcv_wnd >= tcplen);
  35255. pcb->rcv_wnd -= tcplen;
  35256. 802c424: 8da2 ldrh r2, [r4, #44] ; 0x2c
  35257. 802c426: 1ad3 subs r3, r2, r3
  35258. 802c428: 85a3 strh r3, [r4, #44] ; 0x2c
  35259. tcp_update_rcv_ann_wnd(pcb);
  35260. 802c42a: 4620 mov r0, r4
  35261. 802c42c: f7ff f986 bl 802b73c <tcp_update_rcv_ann_wnd>
  35262. chains its data on this pbuf as well.
  35263. If the segment was a FIN, we set the TF_GOT_FIN flag that will
  35264. be used to indicate to the application that the remote side has
  35265. closed its end of the connection. */
  35266. if (inseg.p->tot_len > 0) {
  35267. 802c430: 4b1f ldr r3, [pc, #124] ; (802c4b0 <tcp_receive+0x49c>)
  35268. 802c432: 685a ldr r2, [r3, #4]
  35269. 802c434: 8911 ldrh r1, [r2, #8]
  35270. 802c436: b119 cbz r1, 802c440 <tcp_receive+0x42c>
  35271. recv_data = inseg.p;
  35272. 802c438: 491e ldr r1, [pc, #120] ; (802c4b4 <tcp_receive+0x4a0>)
  35273. 802c43a: 600a str r2, [r1, #0]
  35274. /* Since this pbuf now is the responsibility of the
  35275. application, we delete our reference to it so that we won't
  35276. (mistakingly) deallocate it. */
  35277. inseg.p = NULL;
  35278. 802c43c: 2200 movs r2, #0
  35279. 802c43e: 605a str r2, [r3, #4]
  35280. }
  35281. if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
  35282. 802c440: 68db ldr r3, [r3, #12]
  35283. 802c442: 8998 ldrh r0, [r3, #12]
  35284. 802c444: f7fd fdcb bl 8029fde <lwip_ntohs>
  35285. 802c448: 07c1 lsls r1, r0, #31
  35286. 802c44a: d504 bpl.n 802c456 <tcp_receive+0x442>
  35287. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: received FIN.\n"));
  35288. recv_flags |= TF_GOT_FIN;
  35289. 802c44c: 4b1a ldr r3, [pc, #104] ; (802c4b8 <tcp_receive+0x4a4>)
  35290. 802c44e: 781a ldrb r2, [r3, #0]
  35291. 802c450: f042 0220 orr.w r2, r2, #32
  35292. 802c454: 701a strb r2, [r3, #0]
  35293. }
  35294. #endif /* TCP_QUEUE_OOSEQ */
  35295. /* Acknowledge the segment(s). */
  35296. tcp_ack(pcb);
  35297. 802c456: 7fa3 ldrb r3, [r4, #30]
  35298. 802c458: 07da lsls r2, r3, #31
  35299. 802c45a: d502 bpl.n 802c462 <tcp_receive+0x44e>
  35300. 802c45c: f023 0301 bic.w r3, r3, #1
  35301. 802c460: e013 b.n 802c48a <tcp_receive+0x476>
  35302. 802c462: f043 0301 orr.w r3, r3, #1
  35303. 802c466: e012 b.n 802c48e <tcp_receive+0x47a>
  35304. } else {
  35305. /* We get here if the incoming segment is out-of-sequence. */
  35306. tcp_send_empty_ack(pcb);
  35307. 802c468: 4620 mov r0, r4
  35308. TCP_SEQ_GEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {*/
  35309. if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd-1)){
  35310. tcp_ack_now(pcb);
  35311. }
  35312. }
  35313. }
  35314. 802c46a: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  35315. /* Acknowledge the segment(s). */
  35316. tcp_ack(pcb);
  35317. } else {
  35318. /* We get here if the incoming segment is out-of-sequence. */
  35319. tcp_send_empty_ack(pcb);
  35320. 802c46e: f000 bf09 b.w 802d284 <tcp_send_empty_ack>
  35321. } else {
  35322. /* Segments with length 0 is taken care of here. Segments that
  35323. fall out of the window are ACKed. */
  35324. /*if (TCP_SEQ_GT(pcb->rcv_nxt, seqno) ||
  35325. TCP_SEQ_GEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {*/
  35326. if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd-1)){
  35327. 802c472: 6812 ldr r2, [r2, #0]
  35328. 802c474: 6aa3 ldr r3, [r4, #40] ; 0x28
  35329. 802c476: 1ad1 subs r1, r2, r3
  35330. 802c478: 2900 cmp r1, #0
  35331. 802c47a: db05 blt.n 802c488 <tcp_receive+0x474>
  35332. 802c47c: 3201 adds r2, #1
  35333. 802c47e: 8da1 ldrh r1, [r4, #44] ; 0x2c
  35334. 802c480: 1ad3 subs r3, r2, r3
  35335. 802c482: 1a5b subs r3, r3, r1
  35336. 802c484: 2b00 cmp r3, #0
  35337. 802c486: dd09 ble.n 802c49c <tcp_receive+0x488>
  35338. tcp_ack_now(pcb);
  35339. 802c488: 7fa3 ldrb r3, [r4, #30]
  35340. 802c48a: f043 0302 orr.w r3, r3, #2
  35341. 802c48e: 77a3 strb r3, [r4, #30]
  35342. 802c490: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  35343. }
  35344. }
  35345. /* If Clause (1) or more is true, but not a duplicate ack, reset
  35346. * count of consecutive duplicate acks */
  35347. if (!found_dupack) {
  35348. pcb->dupacks = 0;
  35349. 802c494: 2300 movs r3, #0
  35350. 802c496: f884 3047 strb.w r3, [r4, #71] ; 0x47
  35351. 802c49a: e6dd b.n 802c258 <tcp_receive+0x244>
  35352. 802c49c: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  35353. 802c4a0: 2000e0b0 .word 0x2000e0b0
  35354. 802c4a4: 20010d7c .word 0x20010d7c
  35355. 802c4a8: 2000e0ac .word 0x2000e0ac
  35356. 802c4ac: 2000e0a8 .word 0x2000e0a8
  35357. 802c4b0: 2000e0c0 .word 0x2000e0c0
  35358. 802c4b4: 2000e0b8 .word 0x2000e0b8
  35359. 802c4b8: 2000e0b5 .word 0x2000e0b5
  35360. 0802c4bc <tcp_input>:
  35361. * @param p received TCP segment to process (p->payload pointing to the IP header)
  35362. * @param inp network interface on which this segment was received
  35363. */
  35364. void
  35365. tcp_input(struct pbuf *p, struct netif *inp)
  35366. {
  35367. 802c4bc: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  35368. 802c4c0: 4606 mov r6, r0
  35369. 802c4c2: 460f mov r7, r1
  35370. err_t err;
  35371. PERF_START;
  35372. TCP_STATS_INC(tcp.recv);
  35373. snmp_inc_tcpinsegs();
  35374. 802c4c4: f003 fc9c bl 802fe00 <snmp_inc_tcpinsegs>
  35375. iphdr = (struct ip_hdr *)p->payload;
  35376. 802c4c8: 6873 ldr r3, [r6, #4]
  35377. 802c4ca: 4aa7 ldr r2, [pc, #668] ; (802c768 <tcp_input+0x2ac>)
  35378. tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
  35379. 802c4cc: 4ca7 ldr r4, [pc, #668] ; (802c76c <tcp_input+0x2b0>)
  35380. PERF_START;
  35381. TCP_STATS_INC(tcp.recv);
  35382. snmp_inc_tcpinsegs();
  35383. iphdr = (struct ip_hdr *)p->payload;
  35384. 802c4ce: 6013 str r3, [r2, #0]
  35385. tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
  35386. 802c4d0: 781a ldrb r2, [r3, #0]
  35387. 802c4d2: f002 020f and.w r2, r2, #15
  35388. #if TCP_INPUT_DEBUG
  35389. tcp_debug_print(tcphdr);
  35390. #endif
  35391. /* remove header from payload */
  35392. if (pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4))) || (p->tot_len < sizeof(struct tcp_hdr))) {
  35393. 802c4d6: 0091 lsls r1, r2, #2
  35394. TCP_STATS_INC(tcp.recv);
  35395. snmp_inc_tcpinsegs();
  35396. iphdr = (struct ip_hdr *)p->payload;
  35397. tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
  35398. 802c4d8: eb03 0382 add.w r3, r3, r2, lsl #2
  35399. #if TCP_INPUT_DEBUG
  35400. tcp_debug_print(tcphdr);
  35401. #endif
  35402. /* remove header from payload */
  35403. if (pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4))) || (p->tot_len < sizeof(struct tcp_hdr))) {
  35404. 802c4dc: 4630 mov r0, r6
  35405. 802c4de: 4249 negs r1, r1
  35406. TCP_STATS_INC(tcp.recv);
  35407. snmp_inc_tcpinsegs();
  35408. iphdr = (struct ip_hdr *)p->payload;
  35409. tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
  35410. 802c4e0: 6023 str r3, [r4, #0]
  35411. #if TCP_INPUT_DEBUG
  35412. tcp_debug_print(tcphdr);
  35413. #endif
  35414. /* remove header from payload */
  35415. if (pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4))) || (p->tot_len < sizeof(struct tcp_hdr))) {
  35416. 802c4e2: f7fe fe8a bl 802b1fa <pbuf_header>
  35417. 802c4e6: 2800 cmp r0, #0
  35418. 802c4e8: f040 83ce bne.w 802cc88 <tcp_input+0x7cc>
  35419. 802c4ec: 8933 ldrh r3, [r6, #8]
  35420. 802c4ee: 2b13 cmp r3, #19
  35421. 802c4f0: f240 83ca bls.w 802cc88 <tcp_input+0x7cc>
  35422. TCP_STATS_INC(tcp.lenerr);
  35423. goto dropped;
  35424. }
  35425. /* Don't even process incoming broadcasts/multicasts. */
  35426. if (ip_addr_isbroadcast(&current_iphdr_dest, inp) ||
  35427. 802c4f4: 4d9e ldr r5, [pc, #632] ; (802c770 <tcp_input+0x2b4>)
  35428. 802c4f6: 4639 mov r1, r7
  35429. 802c4f8: 6828 ldr r0, [r5, #0]
  35430. 802c4fa: f001 fd43 bl 802df84 <ip4_addr_isbroadcast>
  35431. 802c4fe: 2800 cmp r0, #0
  35432. 802c500: f040 83c2 bne.w 802cc88 <tcp_input+0x7cc>
  35433. ip_addr_ismulticast(&current_iphdr_dest)) {
  35434. 802c504: 682b ldr r3, [r5, #0]
  35435. 802c506: f003 03f0 and.w r3, r3, #240 ; 0xf0
  35436. TCP_STATS_INC(tcp.lenerr);
  35437. goto dropped;
  35438. }
  35439. /* Don't even process incoming broadcasts/multicasts. */
  35440. if (ip_addr_isbroadcast(&current_iphdr_dest, inp) ||
  35441. 802c50a: 2be0 cmp r3, #224 ; 0xe0
  35442. 802c50c: f000 83bc beq.w 802cc88 <tcp_input+0x7cc>
  35443. }
  35444. #endif
  35445. /* Move the payload pointer in the pbuf so that it points to the
  35446. TCP data instead of the TCP header. */
  35447. hdrlen = TCPH_HDRLEN(tcphdr);
  35448. 802c510: 6823 ldr r3, [r4, #0]
  35449. 802c512: 8998 ldrh r0, [r3, #12]
  35450. 802c514: f7fd fd63 bl 8029fde <lwip_ntohs>
  35451. if(pbuf_header(p, -(hdrlen * 4))){
  35452. 802c518: f06f 0103 mvn.w r1, #3
  35453. 802c51c: f3c0 3307 ubfx r3, r0, #12, #8
  35454. 802c520: 4359 muls r1, r3
  35455. 802c522: 4630 mov r0, r6
  35456. 802c524: f7fe fe69 bl 802b1fa <pbuf_header>
  35457. 802c528: 4683 mov fp, r0
  35458. 802c52a: 2800 cmp r0, #0
  35459. 802c52c: f040 83ac bne.w 802cc88 <tcp_input+0x7cc>
  35460. TCP_STATS_INC(tcp.lenerr);
  35461. goto dropped;
  35462. }
  35463. /* Convert fields in TCP header to host byte order. */
  35464. tcphdr->src = ntohs(tcphdr->src);
  35465. 802c530: 6827 ldr r7, [r4, #0]
  35466. 802c532: 8838 ldrh r0, [r7, #0]
  35467. 802c534: f7fd fd53 bl 8029fde <lwip_ntohs>
  35468. 802c538: 8038 strh r0, [r7, #0]
  35469. tcphdr->dest = ntohs(tcphdr->dest);
  35470. 802c53a: 6827 ldr r7, [r4, #0]
  35471. 802c53c: 8878 ldrh r0, [r7, #2]
  35472. 802c53e: f7fd fd4e bl 8029fde <lwip_ntohs>
  35473. 802c542: 8078 strh r0, [r7, #2]
  35474. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  35475. 802c544: 6827 ldr r7, [r4, #0]
  35476. 802c546: 6878 ldr r0, [r7, #4]
  35477. 802c548: f7fd fd50 bl 8029fec <lwip_ntohl>
  35478. 802c54c: 4b89 ldr r3, [pc, #548] ; (802c774 <tcp_input+0x2b8>)
  35479. 802c54e: 6078 str r0, [r7, #4]
  35480. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  35481. 802c550: 6827 ldr r7, [r4, #0]
  35482. }
  35483. /* Convert fields in TCP header to host byte order. */
  35484. tcphdr->src = ntohs(tcphdr->src);
  35485. tcphdr->dest = ntohs(tcphdr->dest);
  35486. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  35487. 802c552: 6018 str r0, [r3, #0]
  35488. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  35489. 802c554: 68b8 ldr r0, [r7, #8]
  35490. 802c556: f7fd fd49 bl 8029fec <lwip_ntohl>
  35491. 802c55a: 4b87 ldr r3, [pc, #540] ; (802c778 <tcp_input+0x2bc>)
  35492. 802c55c: 60b8 str r0, [r7, #8]
  35493. tcphdr->wnd = ntohs(tcphdr->wnd);
  35494. 802c55e: 6827 ldr r7, [r4, #0]
  35495. /* Convert fields in TCP header to host byte order. */
  35496. tcphdr->src = ntohs(tcphdr->src);
  35497. tcphdr->dest = ntohs(tcphdr->dest);
  35498. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  35499. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  35500. 802c560: 6018 str r0, [r3, #0]
  35501. tcphdr->wnd = ntohs(tcphdr->wnd);
  35502. 802c562: 89f8 ldrh r0, [r7, #14]
  35503. 802c564: f7fd fd3b bl 8029fde <lwip_ntohs>
  35504. 802c568: 81f8 strh r0, [r7, #14]
  35505. flags = TCPH_FLAGS(tcphdr);
  35506. 802c56a: 6823 ldr r3, [r4, #0]
  35507. 802c56c: 8998 ldrh r0, [r3, #12]
  35508. 802c56e: f7fd fd36 bl 8029fde <lwip_ntohs>
  35509. 802c572: 4b82 ldr r3, [pc, #520] ; (802c77c <tcp_input+0x2c0>)
  35510. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  35511. 802c574: f8b6 8008 ldrh.w r8, [r6, #8]
  35512. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  35513. LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
  35514. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  35515. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  35516. if (pcb->remote_port == tcphdr->src &&
  35517. 802c578: 6827 ldr r7, [r4, #0]
  35518. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  35519. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  35520. tcphdr->wnd = ntohs(tcphdr->wnd);
  35521. flags = TCPH_FLAGS(tcphdr);
  35522. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  35523. 802c57a: f010 0c03 ands.w ip, r0, #3
  35524. tcphdr->dest = ntohs(tcphdr->dest);
  35525. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  35526. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  35527. tcphdr->wnd = ntohs(tcphdr->wnd);
  35528. flags = TCPH_FLAGS(tcphdr);
  35529. 802c57e: f000 013f and.w r1, r0, #63 ; 0x3f
  35530. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  35531. 802c582: bf18 it ne
  35532. 802c584: f04f 0c01 movne.w ip, #1
  35533. tcphdr->dest = ntohs(tcphdr->dest);
  35534. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  35535. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  35536. tcphdr->wnd = ntohs(tcphdr->wnd);
  35537. flags = TCPH_FLAGS(tcphdr);
  35538. 802c588: 7019 strb r1, [r3, #0]
  35539. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  35540. 802c58a: 44c4 add ip, r8
  35541. 802c58c: 4b7c ldr r3, [pc, #496] ; (802c780 <tcp_input+0x2c4>)
  35542. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  35543. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  35544. if (pcb->remote_port == tcphdr->src &&
  35545. pcb->local_port == tcphdr->dest &&
  35546. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  35547. ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest)) {
  35548. 802c58e: 6829 ldr r1, [r5, #0]
  35549. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  35550. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  35551. tcphdr->wnd = ntohs(tcphdr->wnd);
  35552. flags = TCPH_FLAGS(tcphdr);
  35553. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  35554. 802c590: fa1f fc8c uxth.w ip, ip
  35555. 802c594: f8a3 c000 strh.w ip, [r3]
  35556. /* Demultiplex an incoming segment. First, we check if it is destined
  35557. for an active connection. */
  35558. prev = NULL;
  35559. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  35560. 802c598: 4b7a ldr r3, [pc, #488] ; (802c784 <tcp_input+0x2c8>)
  35561. 802c59a: f8d3 a000 ldr.w sl, [r3]
  35562. LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
  35563. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  35564. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  35565. if (pcb->remote_port == tcphdr->src &&
  35566. pcb->local_port == tcphdr->dest &&
  35567. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  35568. 802c59e: 4b7a ldr r3, [pc, #488] ; (802c788 <tcp_input+0x2cc>)
  35569. tcphdr->dest = ntohs(tcphdr->dest);
  35570. seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
  35571. ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
  35572. tcphdr->wnd = ntohs(tcphdr->wnd);
  35573. flags = TCPH_FLAGS(tcphdr);
  35574. 802c5a0: 4602 mov r2, r0
  35575. LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
  35576. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  35577. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  35578. if (pcb->remote_port == tcphdr->src &&
  35579. pcb->local_port == tcphdr->dest &&
  35580. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  35581. 802c5a2: f8d3 9000 ldr.w r9, [r3]
  35582. /* Demultiplex an incoming segment. First, we check if it is destined
  35583. for an active connection. */
  35584. prev = NULL;
  35585. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  35586. 802c5a6: 4654 mov r4, sl
  35587. flags = TCPH_FLAGS(tcphdr);
  35588. tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
  35589. /* Demultiplex an incoming segment. First, we check if it is destined
  35590. for an active connection. */
  35591. prev = NULL;
  35592. 802c5a8: 4658 mov r0, fp
  35593. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  35594. 802c5aa: e019 b.n 802c5e0 <tcp_input+0x124>
  35595. LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
  35596. LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  35597. LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
  35598. if (pcb->remote_port == tcphdr->src &&
  35599. 802c5ac: 8ba5 ldrh r5, [r4, #28]
  35600. 802c5ae: 883b ldrh r3, [r7, #0]
  35601. 802c5b0: 429d cmp r5, r3
  35602. 802c5b2: d113 bne.n 802c5dc <tcp_input+0x120>
  35603. 802c5b4: 8b65 ldrh r5, [r4, #26]
  35604. 802c5b6: 887b ldrh r3, [r7, #2]
  35605. 802c5b8: 429d cmp r5, r3
  35606. 802c5ba: d10f bne.n 802c5dc <tcp_input+0x120>
  35607. pcb->local_port == tcphdr->dest &&
  35608. 802c5bc: 6863 ldr r3, [r4, #4]
  35609. 802c5be: 454b cmp r3, r9
  35610. 802c5c0: d10c bne.n 802c5dc <tcp_input+0x120>
  35611. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  35612. 802c5c2: 6823 ldr r3, [r4, #0]
  35613. 802c5c4: 428b cmp r3, r1
  35614. 802c5c6: d109 bne.n 802c5dc <tcp_input+0x120>
  35615. /* Move this PCB to the front of the list so that subsequent
  35616. lookups will be faster (we exploit locality in TCP segment
  35617. arrivals). */
  35618. LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb);
  35619. if (prev != NULL) {
  35620. 802c5c8: 2800 cmp r0, #0
  35621. 802c5ca: f000 8382 beq.w 802ccd2 <tcp_input+0x816>
  35622. prev->next = pcb->next;
  35623. 802c5ce: 68e3 ldr r3, [r4, #12]
  35624. 802c5d0: 60c3 str r3, [r0, #12]
  35625. pcb->next = tcp_active_pcbs;
  35626. tcp_active_pcbs = pcb;
  35627. 802c5d2: 4b6c ldr r3, [pc, #432] ; (802c784 <tcp_input+0x2c8>)
  35628. lookups will be faster (we exploit locality in TCP segment
  35629. arrivals). */
  35630. LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb);
  35631. if (prev != NULL) {
  35632. prev->next = pcb->next;
  35633. pcb->next = tcp_active_pcbs;
  35634. 802c5d4: f8c4 a00c str.w sl, [r4, #12]
  35635. tcp_active_pcbs = pcb;
  35636. 802c5d8: 601c str r4, [r3, #0]
  35637. 802c5da: e37a b.n 802ccd2 <tcp_input+0x816>
  35638. 802c5dc: 4620 mov r0, r4
  35639. /* Demultiplex an incoming segment. First, we check if it is destined
  35640. for an active connection. */
  35641. prev = NULL;
  35642. for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  35643. 802c5de: 68e4 ldr r4, [r4, #12]
  35644. 802c5e0: 2c00 cmp r4, #0
  35645. 802c5e2: d1e3 bne.n 802c5ac <tcp_input+0xf0>
  35646. 802c5e4: e372 b.n 802cccc <tcp_input+0x810>
  35647. if (pcb == NULL) {
  35648. /* If it did not go to an active connection, we check the connections
  35649. in the TIME-WAIT state. */
  35650. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  35651. LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  35652. if (pcb->remote_port == tcphdr->src &&
  35653. 802c5e6: 8b98 ldrh r0, [r3, #28]
  35654. 802c5e8: 883c ldrh r4, [r7, #0]
  35655. 802c5ea: 4284 cmp r4, r0
  35656. 802c5ec: d130 bne.n 802c650 <tcp_input+0x194>
  35657. pcb->local_port == tcphdr->dest &&
  35658. 802c5ee: 8b58 ldrh r0, [r3, #26]
  35659. if (pcb == NULL) {
  35660. /* If it did not go to an active connection, we check the connections
  35661. in the TIME-WAIT state. */
  35662. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  35663. LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  35664. if (pcb->remote_port == tcphdr->src &&
  35665. 802c5f0: 887d ldrh r5, [r7, #2]
  35666. 802c5f2: 4285 cmp r5, r0
  35667. 802c5f4: d12c bne.n 802c650 <tcp_input+0x194>
  35668. pcb->local_port == tcphdr->dest &&
  35669. 802c5f6: 6858 ldr r0, [r3, #4]
  35670. 802c5f8: 4548 cmp r0, r9
  35671. 802c5fa: d129 bne.n 802c650 <tcp_input+0x194>
  35672. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
  35673. 802c5fc: 6818 ldr r0, [r3, #0]
  35674. 802c5fe: 4288 cmp r0, r1
  35675. 802c600: d126 bne.n 802c650 <tcp_input+0x194>
  35676. /* RFC 1337: in TIME_WAIT, ignore RST and ACK FINs + any 'acceptable' segments */
  35677. /* RFC 793 3.9 Event Processing - Segment Arrives:
  35678. * - first check sequence number - we skip that one in TIME_WAIT (always
  35679. * acceptable since we only send ACKs)
  35680. * - second check the RST bit (... return) */
  35681. if (flags & TCP_RST) {
  35682. 802c602: f002 0104 and.w r1, r2, #4
  35683. 802c606: b2c9 uxtb r1, r1
  35684. 802c608: 2900 cmp r1, #0
  35685. 802c60a: f040 833f bne.w 802cc8c <tcp_input+0x7d0>
  35686. return ERR_OK;
  35687. }
  35688. /* - fourth, check the SYN bit, */
  35689. if (flags & TCP_SYN) {
  35690. 802c60e: f002 0102 and.w r1, r2, #2
  35691. 802c612: b2c9 uxtb r1, r1
  35692. 802c614: b159 cbz r1, 802c62e <tcp_input+0x172>
  35693. /* If an incoming segment is not acceptable, an acknowledgment
  35694. should be sent in reply */
  35695. if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt+pcb->rcv_wnd)) {
  35696. 802c616: 4a57 ldr r2, [pc, #348] ; (802c774 <tcp_input+0x2b8>)
  35697. 802c618: 6811 ldr r1, [r2, #0]
  35698. 802c61a: 6a9a ldr r2, [r3, #40] ; 0x28
  35699. 802c61c: 1a8a subs r2, r1, r2
  35700. 802c61e: d40b bmi.n 802c638 <tcp_input+0x17c>
  35701. 802c620: 8d98 ldrh r0, [r3, #44] ; 0x2c
  35702. 802c622: 1a12 subs r2, r2, r0
  35703. 802c624: 2a00 cmp r2, #0
  35704. 802c626: dc07 bgt.n 802c638 <tcp_input+0x17c>
  35705. /* If the SYN is in the window it is an error, send a reset */
  35706. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  35707. 802c628: 9500 str r5, [sp, #0]
  35708. 802c62a: 9401 str r4, [sp, #4]
  35709. 802c62c: e041 b.n 802c6b2 <tcp_input+0x1f6>
  35710. tcphdr->dest, tcphdr->src);
  35711. return ERR_OK;
  35712. }
  35713. } else if (flags & TCP_FIN) {
  35714. 802c62e: 07d2 lsls r2, r2, #31
  35715. 802c630: d502 bpl.n 802c638 <tcp_input+0x17c>
  35716. /* - eighth, check the FIN bit: Remain in the TIME-WAIT state.
  35717. Restart the 2 MSL time-wait timeout.*/
  35718. pcb->tmr = tcp_ticks;
  35719. 802c632: 4a56 ldr r2, [pc, #344] ; (802c78c <tcp_input+0x2d0>)
  35720. 802c634: 6812 ldr r2, [r2, #0]
  35721. 802c636: 625a str r2, [r3, #36] ; 0x24
  35722. }
  35723. if ((tcplen > 0)) {
  35724. 802c638: f1bc 0f00 cmp.w ip, #0
  35725. 802c63c: f000 8326 beq.w 802cc8c <tcp_input+0x7d0>
  35726. /* Acknowledge data, FIN or out-of-window SYN */
  35727. pcb->flags |= TF_ACK_NOW;
  35728. 802c640: 7f9a ldrb r2, [r3, #30]
  35729. 802c642: f042 0202 orr.w r2, r2, #2
  35730. 802c646: 779a strb r2, [r3, #30]
  35731. return tcp_output(pcb);
  35732. 802c648: 4618 mov r0, r3
  35733. 802c64a: f000 fe3d bl 802d2c8 <tcp_output>
  35734. 802c64e: e31d b.n 802cc8c <tcp_input+0x7d0>
  35735. }
  35736. if (pcb == NULL) {
  35737. /* If it did not go to an active connection, we check the connections
  35738. in the TIME-WAIT state. */
  35739. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  35740. 802c650: 68db ldr r3, [r3, #12]
  35741. 802c652: 2b00 cmp r3, #0
  35742. 802c654: d1c7 bne.n 802c5e6 <tcp_input+0x12a>
  35743. }
  35744. /* Finally, if we still did not get a match, we check all PCBs that
  35745. are LISTENing for incoming connections. */
  35746. prev = NULL;
  35747. for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  35748. 802c656: 484e ldr r0, [pc, #312] ; (802c790 <tcp_input+0x2d4>)
  35749. 802c658: 6804 ldr r4, [r0, #0]
  35750. 802c65a: 4625 mov r5, r4
  35751. 802c65c: e00f b.n 802c67e <tcp_input+0x1c2>
  35752. if (lpcb->local_port == tcphdr->dest) {
  35753. 802c65e: 8b68 ldrh r0, [r5, #26]
  35754. 802c660: f8b7 8002 ldrh.w r8, [r7, #2]
  35755. 802c664: 4580 cmp r8, r0
  35756. 802c666: d108 bne.n 802c67a <tcp_input+0x1be>
  35757. /* found an ANY-match */
  35758. lpcb_any = lpcb;
  35759. lpcb_prev = prev;
  35760. }
  35761. #else /* SO_REUSE */
  35762. if (ip_addr_cmp(&(lpcb->local_ip), &current_iphdr_dest) ||
  35763. 802c668: f8d5 8000 ldr.w r8, [r5]
  35764. 802c66c: 4588 cmp r8, r1
  35765. 802c66e: f000 8342 beq.w 802ccf6 <tcp_input+0x83a>
  35766. ip_addr_isany(&(lpcb->local_ip))) {
  35767. 802c672: f1b8 0f00 cmp.w r8, #0
  35768. 802c676: f000 833e beq.w 802ccf6 <tcp_input+0x83a>
  35769. 802c67a: 462b mov r3, r5
  35770. }
  35771. /* Finally, if we still did not get a match, we check all PCBs that
  35772. are LISTENing for incoming connections. */
  35773. prev = NULL;
  35774. for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
  35775. 802c67c: 68ed ldr r5, [r5, #12]
  35776. 802c67e: 2d00 cmp r5, #0
  35777. 802c680: d1ed bne.n 802c65e <tcp_input+0x1a2>
  35778. 802c682: e33c b.n 802ccfe <tcp_input+0x842>
  35779. if (lpcb != NULL) {
  35780. /* Move this PCB to the front of the list so that subsequent
  35781. lookups will be faster (we exploit locality in TCP segment
  35782. arrivals). */
  35783. if (prev != NULL) {
  35784. ((struct tcp_pcb_listen *)prev)->next = lpcb->next;
  35785. 802c684: 68e9 ldr r1, [r5, #12]
  35786. 802c686: 60d9 str r1, [r3, #12]
  35787. /* our successor is the remainder of the listening list */
  35788. lpcb->next = tcp_listen_pcbs.listen_pcbs;
  35789. /* put this listening pcb at the head of the listening list */
  35790. tcp_listen_pcbs.listen_pcbs = lpcb;
  35791. 802c688: 4b41 ldr r3, [pc, #260] ; (802c790 <tcp_input+0x2d4>)
  35792. lookups will be faster (we exploit locality in TCP segment
  35793. arrivals). */
  35794. if (prev != NULL) {
  35795. ((struct tcp_pcb_listen *)prev)->next = lpcb->next;
  35796. /* our successor is the remainder of the listening list */
  35797. lpcb->next = tcp_listen_pcbs.listen_pcbs;
  35798. 802c68a: 60ec str r4, [r5, #12]
  35799. /* put this listening pcb at the head of the listening list */
  35800. tcp_listen_pcbs.listen_pcbs = lpcb;
  35801. 802c68c: 601d str r5, [r3, #0]
  35802. tcp_listen_input(struct tcp_pcb_listen *pcb)
  35803. {
  35804. struct tcp_pcb *npcb;
  35805. err_t rc;
  35806. if (flags & TCP_RST) {
  35807. 802c68e: f002 0304 and.w r3, r2, #4
  35808. 802c692: b2db uxtb r3, r3
  35809. 802c694: 2b00 cmp r3, #0
  35810. 802c696: f040 82f9 bne.w 802cc8c <tcp_input+0x7d0>
  35811. return ERR_OK;
  35812. }
  35813. /* In the LISTEN state, we check for incoming SYN segments,
  35814. creates a new PCB, and responds with a SYN|ACK. */
  35815. if (flags & TCP_ACK) {
  35816. 802c69a: f002 0810 and.w r8, r2, #16
  35817. 802c69e: fa5f f888 uxtb.w r8, r8
  35818. 802c6a2: f1b8 0f00 cmp.w r8, #0
  35819. 802c6a6: d00c beq.n 802c6c2 <tcp_input+0x206>
  35820. /* For incoming segments with the ACK flag set, respond with a
  35821. RST. */
  35822. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n"));
  35823. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(),
  35824. 802c6a8: 4b32 ldr r3, [pc, #200] ; (802c774 <tcp_input+0x2b8>)
  35825. 802c6aa: 6819 ldr r1, [r3, #0]
  35826. 802c6ac: 9000 str r0, [sp, #0]
  35827. 802c6ae: 883b ldrh r3, [r7, #0]
  35828. 802c6b0: 9301 str r3, [sp, #4]
  35829. 802c6b2: 4b31 ldr r3, [pc, #196] ; (802c778 <tcp_input+0x2bc>)
  35830. 802c6b4: 6818 ldr r0, [r3, #0]
  35831. 802c6b6: 4461 add r1, ip
  35832. 802c6b8: 4a2d ldr r2, [pc, #180] ; (802c770 <tcp_input+0x2b4>)
  35833. 802c6ba: 4b33 ldr r3, [pc, #204] ; (802c788 <tcp_input+0x2cc>)
  35834. 802c6bc: f000 ff28 bl 802d510 <tcp_rst>
  35835. 802c6c0: e2e4 b.n 802cc8c <tcp_input+0x7d0>
  35836. ip_current_src_addr(), tcphdr->dest, tcphdr->src);
  35837. } else if (flags & TCP_SYN) {
  35838. 802c6c2: f002 0202 and.w r2, r2, #2
  35839. 802c6c6: b2d2 uxtb r2, r2
  35840. 802c6c8: 2a00 cmp r2, #0
  35841. 802c6ca: f000 82df beq.w 802cc8c <tcp_input+0x7d0>
  35842. if (pcb->accepts_pending >= pcb->backlog) {
  35843. LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: listen backlog exceeded for port %"U16_F"\n", tcphdr->dest));
  35844. return ERR_ABRT;
  35845. }
  35846. #endif /* TCP_LISTEN_BACKLOG */
  35847. npcb = tcp_alloc(pcb->prio);
  35848. 802c6ce: 7e68 ldrb r0, [r5, #25]
  35849. 802c6d0: f7ff fbc6 bl 802be60 <tcp_alloc>
  35850. /* If a new PCB could not be created (probably due to lack of memory),
  35851. we don't do anything, but rely on the sender will retransmit the
  35852. SYN at a time when we have more memory available. */
  35853. if (npcb == NULL) {
  35854. 802c6d4: 4604 mov r4, r0
  35855. 802c6d6: 2800 cmp r0, #0
  35856. 802c6d8: f000 82d8 beq.w 802cc8c <tcp_input+0x7d0>
  35857. }
  35858. #if TCP_LISTEN_BACKLOG
  35859. pcb->accepts_pending++;
  35860. #endif /* TCP_LISTEN_BACKLOG */
  35861. /* Set up the new PCB. */
  35862. ip_addr_copy(npcb->local_ip, current_iphdr_dest);
  35863. 802c6dc: 4b24 ldr r3, [pc, #144] ; (802c770 <tcp_input+0x2b4>)
  35864. 802c6de: 681b ldr r3, [r3, #0]
  35865. 802c6e0: 6003 str r3, [r0, #0]
  35866. npcb->local_port = pcb->local_port;
  35867. 802c6e2: 8b6b ldrh r3, [r5, #26]
  35868. 802c6e4: 8343 strh r3, [r0, #26]
  35869. ip_addr_copy(npcb->remote_ip, current_iphdr_src);
  35870. 802c6e6: 4b28 ldr r3, [pc, #160] ; (802c788 <tcp_input+0x2cc>)
  35871. 802c6e8: 681b ldr r3, [r3, #0]
  35872. 802c6ea: 6043 str r3, [r0, #4]
  35873. npcb->remote_port = tcphdr->src;
  35874. 802c6ec: 4b1f ldr r3, [pc, #124] ; (802c76c <tcp_input+0x2b0>)
  35875. 802c6ee: 681b ldr r3, [r3, #0]
  35876. 802c6f0: 7859 ldrb r1, [r3, #1]
  35877. 802c6f2: 781a ldrb r2, [r3, #0]
  35878. 802c6f4: ea42 2201 orr.w r2, r2, r1, lsl #8
  35879. 802c6f8: 8382 strh r2, [r0, #28]
  35880. npcb->state = SYN_RCVD;
  35881. 802c6fa: 2203 movs r2, #3
  35882. 802c6fc: 7602 strb r2, [r0, #24]
  35883. npcb->rcv_nxt = seqno + 1;
  35884. 802c6fe: 4a1d ldr r2, [pc, #116] ; (802c774 <tcp_input+0x2b8>)
  35885. 802c700: 6812 ldr r2, [r2, #0]
  35886. 802c702: 1c51 adds r1, r2, #1
  35887. 802c704: 6281 str r1, [r0, #40] ; 0x28
  35888. npcb->rcv_ann_right_edge = npcb->rcv_nxt;
  35889. 802c706: 6301 str r1, [r0, #48] ; 0x30
  35890. npcb->snd_wnd = tcphdr->wnd;
  35891. 802c708: 89db ldrh r3, [r3, #14]
  35892. 802c70a: f8a0 3060 strh.w r3, [r0, #96] ; 0x60
  35893. npcb->snd_wnd_max = tcphdr->wnd;
  35894. 802c70e: f8a0 3062 strh.w r3, [r0, #98] ; 0x62
  35895. npcb->ssthresh = npcb->snd_wnd;
  35896. 802c712: f8a0 304e strh.w r3, [r0, #78] ; 0x4e
  35897. npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */
  35898. npcb->callback_arg = pcb->callback_arg;
  35899. 802c716: 692b ldr r3, [r5, #16]
  35900. 802c718: 6103 str r3, [r0, #16]
  35901. #if LWIP_CALLBACK_API
  35902. npcb->accept = pcb->accept;
  35903. 802c71a: 696b ldr r3, [r5, #20]
  35904. npcb->rcv_nxt = seqno + 1;
  35905. npcb->rcv_ann_right_edge = npcb->rcv_nxt;
  35906. npcb->snd_wnd = tcphdr->wnd;
  35907. npcb->snd_wnd_max = tcphdr->wnd;
  35908. npcb->ssthresh = npcb->snd_wnd;
  35909. npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */
  35910. 802c71c: 3a01 subs r2, #1
  35911. 802c71e: 6542 str r2, [r0, #84] ; 0x54
  35912. npcb->callback_arg = pcb->callback_arg;
  35913. #if LWIP_CALLBACK_API
  35914. npcb->accept = pcb->accept;
  35915. 802c720: 6143 str r3, [r0, #20]
  35916. #endif /* LWIP_CALLBACK_API */
  35917. /* inherit socket options */
  35918. npcb->so_options = pcb->so_options & SOF_INHERITED;
  35919. 802c722: 7a2b ldrb r3, [r5, #8]
  35920. 802c724: f023 0373 bic.w r3, r3, #115 ; 0x73
  35921. 802c728: 7203 strb r3, [r0, #8]
  35922. /* Register the new PCB so that we can begin receiving segments
  35923. for it. */
  35924. TCP_REG_ACTIVE(npcb);
  35925. 802c72a: 4b16 ldr r3, [pc, #88] ; (802c784 <tcp_input+0x2c8>)
  35926. 802c72c: 681a ldr r2, [r3, #0]
  35927. 802c72e: 6018 str r0, [r3, #0]
  35928. 802c730: 60c2 str r2, [r0, #12]
  35929. 802c732: f001 f887 bl 802d844 <tcp_timer_needed>
  35930. 802c736: 4b17 ldr r3, [pc, #92] ; (802c794 <tcp_input+0x2d8>)
  35931. 802c738: 2201 movs r2, #1
  35932. /* Parse any options in the SYN. */
  35933. tcp_parseopt(npcb);
  35934. 802c73a: 4620 mov r0, r4
  35935. #endif /* LWIP_CALLBACK_API */
  35936. /* inherit socket options */
  35937. npcb->so_options = pcb->so_options & SOF_INHERITED;
  35938. /* Register the new PCB so that we can begin receiving segments
  35939. for it. */
  35940. TCP_REG_ACTIVE(npcb);
  35941. 802c73c: 701a strb r2, [r3, #0]
  35942. /* Parse any options in the SYN. */
  35943. tcp_parseopt(npcb);
  35944. 802c73e: f7ff fc29 bl 802bf94 <tcp_parseopt>
  35945. #if TCP_CALCULATE_EFF_SEND_MSS
  35946. npcb->mss = tcp_eff_send_mss(npcb->mss, &(npcb->remote_ip));
  35947. 802c742: 1d21 adds r1, r4, #4
  35948. 802c744: 8ee0 ldrh r0, [r4, #54] ; 0x36
  35949. 802c746: f7ff fc16 bl 802bf76 <tcp_eff_send_mss>
  35950. 802c74a: 86e0 strh r0, [r4, #54] ; 0x36
  35951. #endif /* TCP_CALCULATE_EFF_SEND_MSS */
  35952. snmp_inc_tcppassiveopens();
  35953. 802c74c: f003 fb40 bl 802fdd0 <snmp_inc_tcppassiveopens>
  35954. /* Send a SYN|ACK together with the MSS option. */
  35955. rc = tcp_enqueue_flags(npcb, TCP_SYN | TCP_ACK);
  35956. 802c750: 4620 mov r0, r4
  35957. 802c752: 2112 movs r1, #18
  35958. 802c754: f000 fd28 bl 802d1a8 <tcp_enqueue_flags>
  35959. if (rc != ERR_OK) {
  35960. 802c758: b120 cbz r0, 802c764 <tcp_input+0x2a8>
  35961. tcp_abandon(npcb, 0);
  35962. 802c75a: 4620 mov r0, r4
  35963. 802c75c: 4641 mov r1, r8
  35964. 802c75e: f7ff f9e1 bl 802bb24 <tcp_abandon>
  35965. 802c762: e293 b.n 802cc8c <tcp_input+0x7d0>
  35966. return rc;
  35967. }
  35968. return tcp_output(npcb);
  35969. 802c764: 4620 mov r0, r4
  35970. 802c766: e770 b.n 802c64a <tcp_input+0x18e>
  35971. 802c768: 2000e0bc .word 0x2000e0bc
  35972. 802c76c: 2000e0a4 .word 0x2000e0a4
  35973. 802c770: 20010da0 .word 0x20010da0
  35974. 802c774: 2000e0a8 .word 0x2000e0a8
  35975. 802c778: 2000e0b0 .word 0x2000e0b0
  35976. 802c77c: 2000e0b4 .word 0x2000e0b4
  35977. 802c780: 2000e0ac .word 0x2000e0ac
  35978. 802c784: 20010d78 .word 0x20010d78
  35979. 802c788: 20010d98 .word 0x20010d98
  35980. 802c78c: 20010d7c .word 0x20010d7c
  35981. 802c790: 20010d80 .word 0x20010d80
  35982. 802c794: 20010d74 .word 0x20010d74
  35983. recv_data = NULL;
  35984. recv_flags = 0;
  35985. if (flags & TCP_PSH) {
  35986. p->flags |= PBUF_FLAG_PUSH;
  35987. 802c798: 7b73 ldrb r3, [r6, #13]
  35988. 802c79a: f043 0301 orr.w r3, r3, #1
  35989. 802c79e: 7373 strb r3, [r6, #13]
  35990. }
  35991. /* If there is data which was previously "refused" by upper layer */
  35992. if (pcb->refused_data != NULL) {
  35993. 802c7a0: 6f63 ldr r3, [r4, #116] ; 0x74
  35994. 802c7a2: b163 cbz r3, 802c7be <tcp_input+0x302>
  35995. if ((tcp_process_refused_data(pcb) == ERR_ABRT) ||
  35996. 802c7a4: 4620 mov r0, r4
  35997. 802c7a6: f7ff fad1 bl 802bd4c <tcp_process_refused_data>
  35998. 802c7aa: 300a adds r0, #10
  35999. 802c7ac: d004 beq.n 802c7b8 <tcp_input+0x2fc>
  36000. 802c7ae: 6f63 ldr r3, [r4, #116] ; 0x74
  36001. 802c7b0: b12b cbz r3, 802c7be <tcp_input+0x302>
  36002. ((pcb->refused_data != NULL) && (tcplen > 0))) {
  36003. 802c7b2: 4b9f ldr r3, [pc, #636] ; (802ca30 <tcp_input+0x574>)
  36004. 802c7b4: 881b ldrh r3, [r3, #0]
  36005. 802c7b6: b113 cbz r3, 802c7be <tcp_input+0x302>
  36006. /* pcb has been aborted or refused data is still refused and the new
  36007. segment contains data */
  36008. TCP_STATS_INC(tcp.drop);
  36009. snmp_inc_tcpinerrs();
  36010. 802c7b8: f003 fb3a bl 802fe30 <snmp_inc_tcpinerrs>
  36011. goto aborted;
  36012. 802c7bc: e249 b.n 802cc52 <tcp_input+0x796>
  36013. }
  36014. }
  36015. tcp_input_pcb = pcb;
  36016. 802c7be: 4b9d ldr r3, [pc, #628] ; (802ca34 <tcp_input+0x578>)
  36017. 802c7c0: 601c str r4, [r3, #0]
  36018. err_t err;
  36019. err = ERR_OK;
  36020. /* Process incoming RST segments. */
  36021. if (flags & TCP_RST) {
  36022. 802c7c2: 4b9d ldr r3, [pc, #628] ; (802ca38 <tcp_input+0x57c>)
  36023. 802c7c4: 781b ldrb r3, [r3, #0]
  36024. 802c7c6: f003 0204 and.w r2, r3, #4
  36025. 802c7ca: b2d2 uxtb r2, r2
  36026. 802c7cc: b1aa cbz r2, 802c7fa <tcp_input+0x33e>
  36027. /* First, determine if the reset is acceptable. */
  36028. if (pcb->state == SYN_SENT) {
  36029. 802c7ce: 7e23 ldrb r3, [r4, #24]
  36030. 802c7d0: 2b02 cmp r3, #2
  36031. 802c7d2: d106 bne.n 802c7e2 <tcp_input+0x326>
  36032. if (ackno == pcb->snd_nxt) {
  36033. 802c7d4: 4b99 ldr r3, [pc, #612] ; (802ca3c <tcp_input+0x580>)
  36034. 802c7d6: 681a ldr r2, [r3, #0]
  36035. 802c7d8: 6d23 ldr r3, [r4, #80] ; 0x50
  36036. 802c7da: 429a cmp r2, r3
  36037. 802c7dc: f040 82a1 bne.w 802cd22 <tcp_input+0x866>
  36038. 802c7e0: e296 b.n 802cd10 <tcp_input+0x854>
  36039. acceptable = 1;
  36040. }
  36041. } else {
  36042. if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
  36043. 802c7e2: 4b97 ldr r3, [pc, #604] ; (802ca40 <tcp_input+0x584>)
  36044. 802c7e4: 681a ldr r2, [r3, #0]
  36045. 802c7e6: 6aa3 ldr r3, [r4, #40] ; 0x28
  36046. 802c7e8: 1ad3 subs r3, r2, r3
  36047. 802c7ea: f100 829a bmi.w 802cd22 <tcp_input+0x866>
  36048. 802c7ee: 8da1 ldrh r1, [r4, #44] ; 0x2c
  36049. 802c7f0: 1a5b subs r3, r3, r1
  36050. 802c7f2: 2b00 cmp r3, #0
  36051. 802c7f4: f300 8295 bgt.w 802cd22 <tcp_input+0x866>
  36052. 802c7f8: e28a b.n 802cd10 <tcp_input+0x854>
  36053. seqno, pcb->rcv_nxt));
  36054. return ERR_OK;
  36055. }
  36056. }
  36057. if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) {
  36058. 802c7fa: f003 0302 and.w r3, r3, #2
  36059. 802c7fe: b2db uxtb r3, r3
  36060. 802c800: b123 cbz r3, 802c80c <tcp_input+0x350>
  36061. 802c802: 7e23 ldrb r3, [r4, #24]
  36062. 802c804: 3b02 subs r3, #2
  36063. 802c806: 2b01 cmp r3, #1
  36064. 802c808: d900 bls.n 802c80c <tcp_input+0x350>
  36065. 802c80a: e06b b.n 802c8e4 <tcp_input+0x428>
  36066. /* Cope with new connection attempt after remote end crashed */
  36067. tcp_ack_now(pcb);
  36068. return ERR_OK;
  36069. }
  36070. if ((pcb->flags & TF_RXCLOSED) == 0) {
  36071. 802c80c: 7fa3 ldrb r3, [r4, #30]
  36072. 802c80e: f003 0310 and.w r3, r3, #16
  36073. 802c812: b2db uxtb r3, r3
  36074. 802c814: b913 cbnz r3, 802c81c <tcp_input+0x360>
  36075. /* Update the PCB (in)activity timer unless rx is closed (see tcp_shutdown) */
  36076. pcb->tmr = tcp_ticks;
  36077. 802c816: 4b8b ldr r3, [pc, #556] ; (802ca44 <tcp_input+0x588>)
  36078. 802c818: 681b ldr r3, [r3, #0]
  36079. 802c81a: 6263 str r3, [r4, #36] ; 0x24
  36080. }
  36081. pcb->keep_cnt_sent = 0;
  36082. 802c81c: 2300 movs r3, #0
  36083. 802c81e: f884 3092 strb.w r3, [r4, #146] ; 0x92
  36084. tcp_parseopt(pcb);
  36085. 802c822: 4620 mov r0, r4
  36086. 802c824: f7ff fbb6 bl 802bf94 <tcp_parseopt>
  36087. /* Do different things depending on the TCP state. */
  36088. switch (pcb->state) {
  36089. 802c828: 7e23 ldrb r3, [r4, #24]
  36090. 802c82a: 3b02 subs r3, #2
  36091. 802c82c: 2b07 cmp r3, #7
  36092. 802c82e: f200 8278 bhi.w 802cd22 <tcp_input+0x866>
  36093. 802c832: e8df f013 tbh [pc, r3, lsl #1]
  36094. 802c836: 0008 .short 0x0008
  36095. 802c838: 00c90077 .word 0x00c90077
  36096. 802c83c: 013000da .word 0x013000da
  36097. 802c840: 015200c9 .word 0x015200c9
  36098. 802c844: 0186 .short 0x0186
  36099. case SYN_SENT:
  36100. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno,
  36101. pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno)));
  36102. /* received SYN ACK with expected sequence number? */
  36103. if ((flags & TCP_ACK) && (flags & TCP_SYN)
  36104. 802c846: 4b7c ldr r3, [pc, #496] ; (802ca38 <tcp_input+0x57c>)
  36105. 802c848: 781b ldrb r3, [r3, #0]
  36106. 802c84a: f003 0312 and.w r3, r3, #18
  36107. 802c84e: 2b12 cmp r3, #18
  36108. 802c850: d153 bne.n 802c8fa <tcp_input+0x43e>
  36109. && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
  36110. 802c852: 6f23 ldr r3, [r4, #112] ; 0x70
  36111. 802c854: 4d79 ldr r5, [pc, #484] ; (802ca3c <tcp_input+0x580>)
  36112. 802c856: 68db ldr r3, [r3, #12]
  36113. 802c858: 682e ldr r6, [r5, #0]
  36114. 802c85a: 6858 ldr r0, [r3, #4]
  36115. 802c85c: f7fd fbc6 bl 8029fec <lwip_ntohl>
  36116. 802c860: 3001 adds r0, #1
  36117. 802c862: 4286 cmp r6, r0
  36118. 802c864: d149 bne.n 802c8fa <tcp_input+0x43e>
  36119. pcb->snd_buf++;
  36120. 802c866: f8b4 3066 ldrh.w r3, [r4, #102] ; 0x66
  36121. pcb->snd_wnd_max = tcphdr->wnd;
  36122. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  36123. pcb->state = ESTABLISHED;
  36124. #if TCP_CALCULATE_EFF_SEND_MSS
  36125. pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip));
  36126. 802c86a: 8ee0 ldrh r0, [r4, #54] ; 0x36
  36127. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno,
  36128. pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno)));
  36129. /* received SYN ACK with expected sequence number? */
  36130. if ((flags & TCP_ACK) && (flags & TCP_SYN)
  36131. && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
  36132. pcb->snd_buf++;
  36133. 802c86c: 3301 adds r3, #1
  36134. 802c86e: f8a4 3066 strh.w r3, [r4, #102] ; 0x66
  36135. pcb->rcv_nxt = seqno + 1;
  36136. 802c872: 4b73 ldr r3, [pc, #460] ; (802ca40 <tcp_input+0x584>)
  36137. 802c874: 681b ldr r3, [r3, #0]
  36138. 802c876: 1c5a adds r2, r3, #1
  36139. 802c878: 62a2 str r2, [r4, #40] ; 0x28
  36140. pcb->rcv_ann_right_edge = pcb->rcv_nxt;
  36141. 802c87a: 6322 str r2, [r4, #48] ; 0x30
  36142. pcb->lastack = ackno;
  36143. 802c87c: 682a ldr r2, [r5, #0]
  36144. 802c87e: 64a2 str r2, [r4, #72] ; 0x48
  36145. pcb->snd_wnd = tcphdr->wnd;
  36146. 802c880: 4a71 ldr r2, [pc, #452] ; (802ca48 <tcp_input+0x58c>)
  36147. 802c882: 6812 ldr r2, [r2, #0]
  36148. pcb->snd_wnd_max = tcphdr->wnd;
  36149. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  36150. 802c884: 3b01 subs r3, #1
  36151. && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
  36152. pcb->snd_buf++;
  36153. pcb->rcv_nxt = seqno + 1;
  36154. pcb->rcv_ann_right_edge = pcb->rcv_nxt;
  36155. pcb->lastack = ackno;
  36156. pcb->snd_wnd = tcphdr->wnd;
  36157. 802c886: 89d2 ldrh r2, [r2, #14]
  36158. pcb->snd_wnd_max = tcphdr->wnd;
  36159. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  36160. 802c888: 6563 str r3, [r4, #84] ; 0x54
  36161. pcb->state = ESTABLISHED;
  36162. 802c88a: 2304 movs r3, #4
  36163. 802c88c: 7623 strb r3, [r4, #24]
  36164. #if TCP_CALCULATE_EFF_SEND_MSS
  36165. pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip));
  36166. 802c88e: 18e1 adds r1, r4, r3
  36167. && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
  36168. pcb->snd_buf++;
  36169. pcb->rcv_nxt = seqno + 1;
  36170. pcb->rcv_ann_right_edge = pcb->rcv_nxt;
  36171. pcb->lastack = ackno;
  36172. pcb->snd_wnd = tcphdr->wnd;
  36173. 802c890: f8a4 2060 strh.w r2, [r4, #96] ; 0x60
  36174. pcb->snd_wnd_max = tcphdr->wnd;
  36175. 802c894: f8a4 2062 strh.w r2, [r4, #98] ; 0x62
  36176. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  36177. pcb->state = ESTABLISHED;
  36178. #if TCP_CALCULATE_EFF_SEND_MSS
  36179. pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip));
  36180. 802c898: f7ff fb6d bl 802bf76 <tcp_eff_send_mss>
  36181. #endif /* TCP_CALCULATE_EFF_SEND_MSS */
  36182. /* Set ssthresh again after changing pcb->mss (already set in tcp_connect
  36183. * but for the default value of pcb->mss) */
  36184. pcb->ssthresh = pcb->mss * 10;
  36185. 802c89c: 230a movs r3, #10
  36186. 802c89e: 4343 muls r3, r0
  36187. 802c8a0: f8a4 304e strh.w r3, [r4, #78] ; 0x4e
  36188. pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  36189. 802c8a4: f8b4 304c ldrh.w r3, [r4, #76] ; 0x4c
  36190. pcb->snd_wnd_max = tcphdr->wnd;
  36191. pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
  36192. pcb->state = ESTABLISHED;
  36193. #if TCP_CALCULATE_EFF_SEND_MSS
  36194. pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip));
  36195. 802c8a8: 86e0 strh r0, [r4, #54] ; 0x36
  36196. /* Set ssthresh again after changing pcb->mss (already set in tcp_connect
  36197. * but for the default value of pcb->mss) */
  36198. pcb->ssthresh = pcb->mss * 10;
  36199. pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  36200. 802c8aa: 2b01 cmp r3, #1
  36201. 802c8ac: d101 bne.n 802c8b2 <tcp_input+0x3f6>
  36202. 802c8ae: 0040 lsls r0, r0, #1
  36203. 802c8b0: b280 uxth r0, r0
  36204. LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
  36205. --pcb->snd_queuelen;
  36206. 802c8b2: f8b4 3068 ldrh.w r3, [r4, #104] ; 0x68
  36207. /* Set ssthresh again after changing pcb->mss (already set in tcp_connect
  36208. * but for the default value of pcb->mss) */
  36209. pcb->ssthresh = pcb->mss * 10;
  36210. pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  36211. 802c8b6: f8a4 004c strh.w r0, [r4, #76] ; 0x4c
  36212. LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
  36213. --pcb->snd_queuelen;
  36214. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"U16_F"\n", (u16_t)pcb->snd_queuelen));
  36215. rseg = pcb->unacked;
  36216. 802c8ba: 6f20 ldr r0, [r4, #112] ; 0x70
  36217. * but for the default value of pcb->mss) */
  36218. pcb->ssthresh = pcb->mss * 10;
  36219. pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  36220. LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
  36221. --pcb->snd_queuelen;
  36222. 802c8bc: 3b01 subs r3, #1
  36223. 802c8be: f8a4 3068 strh.w r3, [r4, #104] ; 0x68
  36224. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"U16_F"\n", (u16_t)pcb->snd_queuelen));
  36225. rseg = pcb->unacked;
  36226. pcb->unacked = rseg->next;
  36227. 802c8c2: 6803 ldr r3, [r0, #0]
  36228. 802c8c4: 6723 str r3, [r4, #112] ; 0x70
  36229. tcp_seg_free(rseg);
  36230. 802c8c6: f7fe ff70 bl 802b7aa <tcp_seg_free>
  36231. /* If there's nothing left to acknowledge, stop the retransmit
  36232. timer, otherwise reset it to start again */
  36233. if(pcb->unacked == NULL)
  36234. 802c8ca: 6f23 ldr r3, [r4, #112] ; 0x70
  36235. 802c8cc: b91b cbnz r3, 802c8d6 <tcp_input+0x41a>
  36236. pcb->rtime = -1;
  36237. 802c8ce: f64f 73ff movw r3, #65535 ; 0xffff
  36238. 802c8d2: 86a3 strh r3, [r4, #52] ; 0x34
  36239. 802c8d4: e003 b.n 802c8de <tcp_input+0x422>
  36240. else {
  36241. pcb->rtime = 0;
  36242. 802c8d6: 2300 movs r3, #0
  36243. 802c8d8: 86a3 strh r3, [r4, #52] ; 0x34
  36244. pcb->nrtx = 0;
  36245. 802c8da: f884 3046 strb.w r3, [r4, #70] ; 0x46
  36246. }
  36247. /* Call the user specified function to call when sucessfully
  36248. * connected. */
  36249. TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
  36250. 802c8de: f8d4 3080 ldr.w r3, [r4, #128] ; 0x80
  36251. 802c8e2: b91b cbnz r3, 802c8ec <tcp_input+0x430>
  36252. if (err == ERR_ABRT) {
  36253. return ERR_ABRT;
  36254. }
  36255. tcp_ack_now(pcb);
  36256. 802c8e4: 7fa3 ldrb r3, [r4, #30]
  36257. 802c8e6: f043 0302 orr.w r3, r3, #2
  36258. 802c8ea: e219 b.n 802cd20 <tcp_input+0x864>
  36259. pcb->nrtx = 0;
  36260. }
  36261. /* Call the user specified function to call when sucessfully
  36262. * connected. */
  36263. TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
  36264. 802c8ec: 2200 movs r2, #0
  36265. 802c8ee: 6920 ldr r0, [r4, #16]
  36266. 802c8f0: 4621 mov r1, r4
  36267. 802c8f2: 4798 blx r3
  36268. if (err == ERR_ABRT) {
  36269. 802c8f4: 300a adds r0, #10
  36270. 802c8f6: d1f5 bne.n 802c8e4 <tcp_input+0x428>
  36271. 802c8f8: e1ab b.n 802cc52 <tcp_input+0x796>
  36272. return ERR_ABRT;
  36273. }
  36274. tcp_ack_now(pcb);
  36275. }
  36276. /* received ACK? possibly a half-open connection */
  36277. else if (flags & TCP_ACK) {
  36278. 802c8fa: 4b4f ldr r3, [pc, #316] ; (802ca38 <tcp_input+0x57c>)
  36279. 802c8fc: 781b ldrb r3, [r3, #0]
  36280. 802c8fe: f003 0310 and.w r3, r3, #16
  36281. 802c902: b2db uxtb r3, r3
  36282. 802c904: 2b00 cmp r3, #0
  36283. 802c906: f000 820c beq.w 802cd22 <tcp_input+0x866>
  36284. /* send a RST to bring the other side in a non-synchronized state. */
  36285. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  36286. tcphdr->dest, tcphdr->src);
  36287. 802c90a: 4b4f ldr r3, [pc, #316] ; (802ca48 <tcp_input+0x58c>)
  36288. tcp_ack_now(pcb);
  36289. }
  36290. /* received ACK? possibly a half-open connection */
  36291. else if (flags & TCP_ACK) {
  36292. /* send a RST to bring the other side in a non-synchronized state. */
  36293. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  36294. 802c90c: 4a48 ldr r2, [pc, #288] ; (802ca30 <tcp_input+0x574>)
  36295. tcphdr->dest, tcphdr->src);
  36296. 802c90e: 681b ldr r3, [r3, #0]
  36297. tcp_ack_now(pcb);
  36298. }
  36299. /* received ACK? possibly a half-open connection */
  36300. else if (flags & TCP_ACK) {
  36301. /* send a RST to bring the other side in a non-synchronized state. */
  36302. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  36303. 802c910: 8811 ldrh r1, [r2, #0]
  36304. 802c912: 8858 ldrh r0, [r3, #2]
  36305. 802c914: 4a4a ldr r2, [pc, #296] ; (802ca40 <tcp_input+0x584>)
  36306. 802c916: 6812 ldr r2, [r2, #0]
  36307. 802c918: 9000 str r0, [sp, #0]
  36308. 802c91a: 881b ldrh r3, [r3, #0]
  36309. 802c91c: 9301 str r3, [sp, #4]
  36310. 802c91e: 4b47 ldr r3, [pc, #284] ; (802ca3c <tcp_input+0x580>)
  36311. 802c920: 6818 ldr r0, [r3, #0]
  36312. 802c922: e03a b.n 802c99a <tcp_input+0x4de>
  36313. tcphdr->dest, tcphdr->src);
  36314. }
  36315. break;
  36316. case SYN_RCVD:
  36317. if (flags & TCP_ACK) {
  36318. 802c924: 4b44 ldr r3, [pc, #272] ; (802ca38 <tcp_input+0x57c>)
  36319. 802c926: 781b ldrb r3, [r3, #0]
  36320. 802c928: f003 0210 and.w r2, r3, #16
  36321. 802c92c: b2d2 uxtb r2, r2
  36322. 802c92e: 2a00 cmp r2, #0
  36323. 802c930: d039 beq.n 802c9a6 <tcp_input+0x4ea>
  36324. /* expected ACK number? */
  36325. if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) {
  36326. 802c932: 4b42 ldr r3, [pc, #264] ; (802ca3c <tcp_input+0x580>)
  36327. 802c934: 6818 ldr r0, [r3, #0]
  36328. 802c936: 6ca3 ldr r3, [r4, #72] ; 0x48
  36329. 802c938: 43db mvns r3, r3
  36330. 802c93a: 42c3 cmn r3, r0
  36331. 802c93c: d423 bmi.n 802c986 <tcp_input+0x4ca>
  36332. 802c93e: 6d23 ldr r3, [r4, #80] ; 0x50
  36333. 802c940: 1ac3 subs r3, r0, r3
  36334. 802c942: 2b00 cmp r3, #0
  36335. 802c944: dc1f bgt.n 802c986 <tcp_input+0x4ca>
  36336. u16_t old_cwnd;
  36337. pcb->state = ESTABLISHED;
  36338. 802c946: 2304 movs r3, #4
  36339. 802c948: 7623 strb r3, [r4, #24]
  36340. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  36341. #if LWIP_CALLBACK_API
  36342. LWIP_ASSERT("pcb->accept != NULL", pcb->accept != NULL);
  36343. #endif
  36344. /* Call the accept function. */
  36345. TCP_EVENT_ACCEPT(pcb, ERR_OK, err);
  36346. 802c94a: 6963 ldr r3, [r4, #20]
  36347. 802c94c: b903 cbnz r3, 802c950 <tcp_input+0x494>
  36348. 802c94e: e147 b.n 802cbe0 <tcp_input+0x724>
  36349. 802c950: 6920 ldr r0, [r4, #16]
  36350. 802c952: 4621 mov r1, r4
  36351. 802c954: 2200 movs r2, #0
  36352. 802c956: 4798 blx r3
  36353. if (err != ERR_OK) {
  36354. 802c958: b118 cbz r0, 802c962 <tcp_input+0x4a6>
  36355. /* If the accept function returns with an error, we abort
  36356. * the connection. */
  36357. /* Already aborted? */
  36358. if (err != ERR_ABRT) {
  36359. 802c95a: 300a adds r0, #10
  36360. 802c95c: f040 8140 bne.w 802cbe0 <tcp_input+0x724>
  36361. 802c960: e177 b.n 802cc52 <tcp_input+0x796>
  36362. return ERR_ABRT;
  36363. }
  36364. old_cwnd = pcb->cwnd;
  36365. /* If there was any data contained within this ACK,
  36366. * we'd better pass it on to the application as well. */
  36367. tcp_receive(pcb);
  36368. 802c962: 4620 mov r0, r4
  36369. if (err != ERR_ABRT) {
  36370. tcp_abort(pcb);
  36371. }
  36372. return ERR_ABRT;
  36373. }
  36374. old_cwnd = pcb->cwnd;
  36375. 802c964: f8b4 504c ldrh.w r5, [r4, #76] ; 0x4c
  36376. /* If there was any data contained within this ACK,
  36377. * we'd better pass it on to the application as well. */
  36378. tcp_receive(pcb);
  36379. 802c968: f7ff fb54 bl 802c014 <tcp_receive>
  36380. /* Prevent ACK for SYN to generate a sent event */
  36381. if (pcb->acked != 0) {
  36382. 802c96c: f8b4 3064 ldrh.w r3, [r4, #100] ; 0x64
  36383. 802c970: b113 cbz r3, 802c978 <tcp_input+0x4bc>
  36384. pcb->acked--;
  36385. 802c972: 3b01 subs r3, #1
  36386. 802c974: f8a4 3064 strh.w r3, [r4, #100] ; 0x64
  36387. }
  36388. pcb->cwnd = ((old_cwnd == 1) ? (pcb->mss * 2) : pcb->mss);
  36389. 802c978: 8ee3 ldrh r3, [r4, #54] ; 0x36
  36390. 802c97a: 2d01 cmp r5, #1
  36391. 802c97c: bf08 it eq
  36392. 802c97e: 005b lsleq r3, r3, #1
  36393. 802c980: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  36394. 802c984: e023 b.n 802c9ce <tcp_input+0x512>
  36395. pcb->state = CLOSE_WAIT;
  36396. }
  36397. } else {
  36398. /* incorrect ACK number, send RST */
  36399. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  36400. tcphdr->dest, tcphdr->src);
  36401. 802c986: 4b30 ldr r3, [pc, #192] ; (802ca48 <tcp_input+0x58c>)
  36402. tcp_ack_now(pcb);
  36403. pcb->state = CLOSE_WAIT;
  36404. }
  36405. } else {
  36406. /* incorrect ACK number, send RST */
  36407. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  36408. 802c988: 4a29 ldr r2, [pc, #164] ; (802ca30 <tcp_input+0x574>)
  36409. tcphdr->dest, tcphdr->src);
  36410. 802c98a: 681b ldr r3, [r3, #0]
  36411. tcp_ack_now(pcb);
  36412. pcb->state = CLOSE_WAIT;
  36413. }
  36414. } else {
  36415. /* incorrect ACK number, send RST */
  36416. tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(),
  36417. 802c98c: 8811 ldrh r1, [r2, #0]
  36418. 802c98e: 885d ldrh r5, [r3, #2]
  36419. 802c990: 4a2b ldr r2, [pc, #172] ; (802ca40 <tcp_input+0x584>)
  36420. 802c992: 6812 ldr r2, [r2, #0]
  36421. 802c994: 9500 str r5, [sp, #0]
  36422. 802c996: 881b ldrh r3, [r3, #0]
  36423. 802c998: 9301 str r3, [sp, #4]
  36424. 802c99a: 1889 adds r1, r1, r2
  36425. 802c99c: 4b2b ldr r3, [pc, #172] ; (802ca4c <tcp_input+0x590>)
  36426. 802c99e: 4a2c ldr r2, [pc, #176] ; (802ca50 <tcp_input+0x594>)
  36427. 802c9a0: f000 fdb6 bl 802d510 <tcp_rst>
  36428. 802c9a4: e1bd b.n 802cd22 <tcp_input+0x866>
  36429. tcphdr->dest, tcphdr->src);
  36430. }
  36431. } else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) {
  36432. 802c9a6: f003 0302 and.w r3, r3, #2
  36433. 802c9aa: b2db uxtb r3, r3
  36434. 802c9ac: 2b00 cmp r3, #0
  36435. 802c9ae: f000 81b8 beq.w 802cd22 <tcp_input+0x866>
  36436. 802c9b2: 4a23 ldr r2, [pc, #140] ; (802ca40 <tcp_input+0x584>)
  36437. 802c9b4: 6aa3 ldr r3, [r4, #40] ; 0x28
  36438. 802c9b6: 6812 ldr r2, [r2, #0]
  36439. 802c9b8: 3b01 subs r3, #1
  36440. 802c9ba: 429a cmp r2, r3
  36441. 802c9bc: f040 81b1 bne.w 802cd22 <tcp_input+0x866>
  36442. /* Looks like another copy of the SYN - retransmit our SYN-ACK */
  36443. tcp_rexmit(pcb);
  36444. 802c9c0: 4620 mov r0, r4
  36445. 802c9c2: f000 fe03 bl 802d5cc <tcp_rexmit>
  36446. 802c9c6: e1ac b.n 802cd22 <tcp_input+0x866>
  36447. }
  36448. break;
  36449. case CLOSE_WAIT:
  36450. /* FALLTHROUGH */
  36451. case ESTABLISHED:
  36452. tcp_receive(pcb);
  36453. 802c9c8: 4620 mov r0, r4
  36454. 802c9ca: f7ff fb23 bl 802c014 <tcp_receive>
  36455. if (recv_flags & TF_GOT_FIN) { /* passive close */
  36456. 802c9ce: 4b21 ldr r3, [pc, #132] ; (802ca54 <tcp_input+0x598>)
  36457. 802c9d0: 781b ldrb r3, [r3, #0]
  36458. 802c9d2: f003 0320 and.w r3, r3, #32
  36459. 802c9d6: b2db uxtb r3, r3
  36460. 802c9d8: 2b00 cmp r3, #0
  36461. 802c9da: f000 81a2 beq.w 802cd22 <tcp_input+0x866>
  36462. tcp_ack_now(pcb);
  36463. 802c9de: 7fa3 ldrb r3, [r4, #30]
  36464. 802c9e0: f043 0302 orr.w r3, r3, #2
  36465. 802c9e4: 77a3 strb r3, [r4, #30]
  36466. pcb->state = CLOSE_WAIT;
  36467. 802c9e6: 2307 movs r3, #7
  36468. 802c9e8: e053 b.n 802ca92 <tcp_input+0x5d6>
  36469. }
  36470. break;
  36471. case FIN_WAIT_1:
  36472. tcp_receive(pcb);
  36473. 802c9ea: 4620 mov r0, r4
  36474. 802c9ec: f7ff fb12 bl 802c014 <tcp_receive>
  36475. if (recv_flags & TF_GOT_FIN) {
  36476. 802c9f0: 4b18 ldr r3, [pc, #96] ; (802ca54 <tcp_input+0x598>)
  36477. 802c9f2: 781a ldrb r2, [r3, #0]
  36478. 802c9f4: 4b10 ldr r3, [pc, #64] ; (802ca38 <tcp_input+0x57c>)
  36479. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  36480. 802c9f6: 781b ldrb r3, [r3, #0]
  36481. pcb->state = CLOSE_WAIT;
  36482. }
  36483. break;
  36484. case FIN_WAIT_1:
  36485. tcp_receive(pcb);
  36486. if (recv_flags & TF_GOT_FIN) {
  36487. 802c9f8: f002 0220 and.w r2, r2, #32
  36488. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  36489. 802c9fc: f003 0310 and.w r3, r3, #16
  36490. pcb->state = CLOSE_WAIT;
  36491. }
  36492. break;
  36493. case FIN_WAIT_1:
  36494. tcp_receive(pcb);
  36495. if (recv_flags & TF_GOT_FIN) {
  36496. 802ca00: b2d2 uxtb r2, r2
  36497. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  36498. 802ca02: b2db uxtb r3, r3
  36499. pcb->state = CLOSE_WAIT;
  36500. }
  36501. break;
  36502. case FIN_WAIT_1:
  36503. tcp_receive(pcb);
  36504. if (recv_flags & TF_GOT_FIN) {
  36505. 802ca04: 2a00 cmp r2, #0
  36506. 802ca06: d03a beq.n 802ca7e <tcp_input+0x5c2>
  36507. if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  36508. 802ca08: 2b00 cmp r3, #0
  36509. 802ca0a: d032 beq.n 802ca72 <tcp_input+0x5b6>
  36510. 802ca0c: 4b0b ldr r3, [pc, #44] ; (802ca3c <tcp_input+0x580>)
  36511. 802ca0e: 681a ldr r2, [r3, #0]
  36512. 802ca10: 6d23 ldr r3, [r4, #80] ; 0x50
  36513. 802ca12: 429a cmp r2, r3
  36514. 802ca14: d12d bne.n 802ca72 <tcp_input+0x5b6>
  36515. LWIP_DEBUGF(TCP_DEBUG,
  36516. ("TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  36517. tcp_ack_now(pcb);
  36518. 802ca16: 7fa3 ldrb r3, [r4, #30]
  36519. 802ca18: f043 0302 orr.w r3, r3, #2
  36520. 802ca1c: 77a3 strb r3, [r4, #30]
  36521. tcp_pcb_purge(pcb);
  36522. 802ca1e: 4620 mov r0, r4
  36523. 802ca20: f7fe feea bl 802b7f8 <tcp_pcb_purge>
  36524. TCP_RMV_ACTIVE(pcb);
  36525. 802ca24: 4a0c ldr r2, [pc, #48] ; (802ca58 <tcp_input+0x59c>)
  36526. 802ca26: 6813 ldr r3, [r2, #0]
  36527. 802ca28: 42a3 cmp r3, r4
  36528. 802ca2a: d117 bne.n 802ca5c <tcp_input+0x5a0>
  36529. 802ca2c: e06d b.n 802cb0a <tcp_input+0x64e>
  36530. 802ca2e: bf00 nop
  36531. 802ca30: 2000e0ac .word 0x2000e0ac
  36532. 802ca34: 20010d90 .word 0x20010d90
  36533. 802ca38: 2000e0b4 .word 0x2000e0b4
  36534. 802ca3c: 2000e0b0 .word 0x2000e0b0
  36535. 802ca40: 2000e0a8 .word 0x2000e0a8
  36536. 802ca44: 20010d7c .word 0x20010d7c
  36537. 802ca48: 2000e0a4 .word 0x2000e0a4
  36538. 802ca4c: 20010d98 .word 0x20010d98
  36539. 802ca50: 20010da0 .word 0x20010da0
  36540. 802ca54: 2000e0b5 .word 0x2000e0b5
  36541. 802ca58: 20010d78 .word 0x20010d78
  36542. 802ca5c: 4a8e ldr r2, [pc, #568] ; (802cc98 <tcp_input+0x7dc>)
  36543. 802ca5e: 6013 str r3, [r2, #0]
  36544. 802ca60: e004 b.n 802ca6c <tcp_input+0x5b0>
  36545. 802ca62: 68d9 ldr r1, [r3, #12]
  36546. 802ca64: 42a1 cmp r1, r4
  36547. 802ca66: d100 bne.n 802ca6a <tcp_input+0x5ae>
  36548. 802ca68: e057 b.n 802cb1a <tcp_input+0x65e>
  36549. 802ca6a: 460b mov r3, r1
  36550. 802ca6c: 2b00 cmp r3, #0
  36551. 802ca6e: d1f8 bne.n 802ca62 <tcp_input+0x5a6>
  36552. 802ca70: e05a b.n 802cb28 <tcp_input+0x66c>
  36553. pcb->state = TIME_WAIT;
  36554. TCP_REG(&tcp_tw_pcbs, pcb);
  36555. } else {
  36556. tcp_ack_now(pcb);
  36557. 802ca72: 7fa3 ldrb r3, [r4, #30]
  36558. 802ca74: f043 0302 orr.w r3, r3, #2
  36559. 802ca78: 77a3 strb r3, [r4, #30]
  36560. pcb->state = CLOSING;
  36561. 802ca7a: 2308 movs r3, #8
  36562. 802ca7c: e009 b.n 802ca92 <tcp_input+0x5d6>
  36563. }
  36564. } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
  36565. 802ca7e: 2b00 cmp r3, #0
  36566. 802ca80: f000 814f beq.w 802cd22 <tcp_input+0x866>
  36567. 802ca84: 4b85 ldr r3, [pc, #532] ; (802cc9c <tcp_input+0x7e0>)
  36568. 802ca86: 681a ldr r2, [r3, #0]
  36569. 802ca88: 6d23 ldr r3, [r4, #80] ; 0x50
  36570. 802ca8a: 429a cmp r2, r3
  36571. 802ca8c: f040 8149 bne.w 802cd22 <tcp_input+0x866>
  36572. pcb->state = FIN_WAIT_2;
  36573. 802ca90: 2306 movs r3, #6
  36574. 802ca92: 7623 strb r3, [r4, #24]
  36575. 802ca94: e145 b.n 802cd22 <tcp_input+0x866>
  36576. }
  36577. break;
  36578. case FIN_WAIT_2:
  36579. tcp_receive(pcb);
  36580. 802ca96: 4620 mov r0, r4
  36581. 802ca98: f7ff fabc bl 802c014 <tcp_receive>
  36582. if (recv_flags & TF_GOT_FIN) {
  36583. 802ca9c: 4b80 ldr r3, [pc, #512] ; (802cca0 <tcp_input+0x7e4>)
  36584. 802ca9e: 781b ldrb r3, [r3, #0]
  36585. 802caa0: f003 0320 and.w r3, r3, #32
  36586. 802caa4: b2db uxtb r3, r3
  36587. 802caa6: 2b00 cmp r3, #0
  36588. 802caa8: f000 813b beq.w 802cd22 <tcp_input+0x866>
  36589. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_2 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  36590. tcp_ack_now(pcb);
  36591. 802caac: 7fa3 ldrb r3, [r4, #30]
  36592. 802caae: f043 0302 orr.w r3, r3, #2
  36593. 802cab2: 77a3 strb r3, [r4, #30]
  36594. tcp_pcb_purge(pcb);
  36595. 802cab4: 4620 mov r0, r4
  36596. 802cab6: f7fe fe9f bl 802b7f8 <tcp_pcb_purge>
  36597. TCP_RMV_ACTIVE(pcb);
  36598. 802caba: 4a7a ldr r2, [pc, #488] ; (802cca4 <tcp_input+0x7e8>)
  36599. 802cabc: 6813 ldr r3, [r2, #0]
  36600. 802cabe: 42a3 cmp r3, r4
  36601. 802cac0: d100 bne.n 802cac4 <tcp_input+0x608>
  36602. 802cac2: e022 b.n 802cb0a <tcp_input+0x64e>
  36603. 802cac4: 4a74 ldr r2, [pc, #464] ; (802cc98 <tcp_input+0x7dc>)
  36604. 802cac6: 6013 str r3, [r2, #0]
  36605. 802cac8: e004 b.n 802cad4 <tcp_input+0x618>
  36606. 802caca: 68d9 ldr r1, [r3, #12]
  36607. 802cacc: 42a1 cmp r1, r4
  36608. 802cace: d100 bne.n 802cad2 <tcp_input+0x616>
  36609. 802cad0: e023 b.n 802cb1a <tcp_input+0x65e>
  36610. 802cad2: 460b mov r3, r1
  36611. 802cad4: 2b00 cmp r3, #0
  36612. 802cad6: d1f8 bne.n 802caca <tcp_input+0x60e>
  36613. 802cad8: e026 b.n 802cb28 <tcp_input+0x66c>
  36614. pcb->state = TIME_WAIT;
  36615. TCP_REG(&tcp_tw_pcbs, pcb);
  36616. }
  36617. break;
  36618. case CLOSING:
  36619. tcp_receive(pcb);
  36620. 802cada: 4620 mov r0, r4
  36621. 802cadc: f7ff fa9a bl 802c014 <tcp_receive>
  36622. if (flags & TCP_ACK && ackno == pcb->snd_nxt) {
  36623. 802cae0: 4b71 ldr r3, [pc, #452] ; (802cca8 <tcp_input+0x7ec>)
  36624. 802cae2: 781b ldrb r3, [r3, #0]
  36625. 802cae4: f003 0310 and.w r3, r3, #16
  36626. 802cae8: b2db uxtb r3, r3
  36627. 802caea: 2b00 cmp r3, #0
  36628. 802caec: f000 8119 beq.w 802cd22 <tcp_input+0x866>
  36629. 802caf0: 4b6a ldr r3, [pc, #424] ; (802cc9c <tcp_input+0x7e0>)
  36630. 802caf2: 681a ldr r2, [r3, #0]
  36631. 802caf4: 6d23 ldr r3, [r4, #80] ; 0x50
  36632. 802caf6: 429a cmp r2, r3
  36633. 802caf8: f040 8113 bne.w 802cd22 <tcp_input+0x866>
  36634. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: CLOSING %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  36635. tcp_pcb_purge(pcb);
  36636. 802cafc: 4620 mov r0, r4
  36637. 802cafe: f7fe fe7b bl 802b7f8 <tcp_pcb_purge>
  36638. TCP_RMV_ACTIVE(pcb);
  36639. 802cb02: 4a68 ldr r2, [pc, #416] ; (802cca4 <tcp_input+0x7e8>)
  36640. 802cb04: 6813 ldr r3, [r2, #0]
  36641. 802cb06: 42a3 cmp r3, r4
  36642. 802cb08: d101 bne.n 802cb0e <tcp_input+0x652>
  36643. 802cb0a: 68e3 ldr r3, [r4, #12]
  36644. 802cb0c: e00c b.n 802cb28 <tcp_input+0x66c>
  36645. 802cb0e: 4a62 ldr r2, [pc, #392] ; (802cc98 <tcp_input+0x7dc>)
  36646. 802cb10: 6013 str r3, [r2, #0]
  36647. 802cb12: e007 b.n 802cb24 <tcp_input+0x668>
  36648. 802cb14: 68d9 ldr r1, [r3, #12]
  36649. 802cb16: 42a1 cmp r1, r4
  36650. 802cb18: d103 bne.n 802cb22 <tcp_input+0x666>
  36651. 802cb1a: 6013 str r3, [r2, #0]
  36652. 802cb1c: 68e2 ldr r2, [r4, #12]
  36653. 802cb1e: 60da str r2, [r3, #12]
  36654. 802cb20: e003 b.n 802cb2a <tcp_input+0x66e>
  36655. 802cb22: 460b mov r3, r1
  36656. 802cb24: 2b00 cmp r3, #0
  36657. 802cb26: d1f5 bne.n 802cb14 <tcp_input+0x658>
  36658. 802cb28: 6013 str r3, [r2, #0]
  36659. 802cb2a: 4b60 ldr r3, [pc, #384] ; (802ccac <tcp_input+0x7f0>)
  36660. 802cb2c: 2201 movs r2, #1
  36661. 802cb2e: 701a strb r2, [r3, #0]
  36662. pcb->state = TIME_WAIT;
  36663. 802cb30: 230a movs r3, #10
  36664. 802cb32: 7623 strb r3, [r4, #24]
  36665. TCP_REG(&tcp_tw_pcbs, pcb);
  36666. 802cb34: 4b5e ldr r3, [pc, #376] ; (802ccb0 <tcp_input+0x7f4>)
  36667. 802cb36: 681a ldr r2, [r3, #0]
  36668. 802cb38: 601c str r4, [r3, #0]
  36669. 802cb3a: 60e2 str r2, [r4, #12]
  36670. 802cb3c: f000 fe82 bl 802d844 <tcp_timer_needed>
  36671. 802cb40: e0ef b.n 802cd22 <tcp_input+0x866>
  36672. }
  36673. break;
  36674. case LAST_ACK:
  36675. tcp_receive(pcb);
  36676. 802cb42: 4620 mov r0, r4
  36677. 802cb44: f7ff fa66 bl 802c014 <tcp_receive>
  36678. if (flags & TCP_ACK && ackno == pcb->snd_nxt) {
  36679. 802cb48: 4b57 ldr r3, [pc, #348] ; (802cca8 <tcp_input+0x7ec>)
  36680. 802cb4a: 781b ldrb r3, [r3, #0]
  36681. 802cb4c: f003 0310 and.w r3, r3, #16
  36682. 802cb50: b2db uxtb r3, r3
  36683. 802cb52: 2b00 cmp r3, #0
  36684. 802cb54: f000 80e5 beq.w 802cd22 <tcp_input+0x866>
  36685. 802cb58: 4b50 ldr r3, [pc, #320] ; (802cc9c <tcp_input+0x7e0>)
  36686. 802cb5a: 681a ldr r2, [r3, #0]
  36687. 802cb5c: 6d23 ldr r3, [r4, #80] ; 0x50
  36688. 802cb5e: 429a cmp r2, r3
  36689. 802cb60: f040 80df bne.w 802cd22 <tcp_input+0x866>
  36690. LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: LAST_ACK %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
  36691. /* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */
  36692. recv_flags |= TF_CLOSED;
  36693. 802cb64: 4b4e ldr r3, [pc, #312] ; (802cca0 <tcp_input+0x7e4>)
  36694. 802cb66: 781a ldrb r2, [r3, #0]
  36695. 802cb68: f042 0210 orr.w r2, r2, #16
  36696. 802cb6c: 701a strb r2, [r3, #0]
  36697. 802cb6e: e0d8 b.n 802cd22 <tcp_input+0x866>
  36698. if (recv_flags & TF_RESET) {
  36699. /* TF_RESET means that the connection was reset by the other
  36700. end. We then call the error callback to inform the
  36701. application that the connection is dead before we
  36702. deallocate the PCB. */
  36703. TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_RST);
  36704. 802cb70: f8d4 3088 ldr.w r3, [r4, #136] ; 0x88
  36705. 802cb74: b19b cbz r3, 802cb9e <tcp_input+0x6e2>
  36706. 802cb76: 6920 ldr r0, [r4, #16]
  36707. 802cb78: f06f 010a mvn.w r1, #10
  36708. 802cb7c: e00e b.n 802cb9c <tcp_input+0x6e0>
  36709. tcp_pcb_remove(&tcp_active_pcbs, pcb);
  36710. memp_free(MEMP_TCP_PCB, pcb);
  36711. } else if (recv_flags & TF_CLOSED) {
  36712. 802cb7e: f003 0310 and.w r3, r3, #16
  36713. 802cb82: b2db uxtb r3, r3
  36714. 802cb84: b1a3 cbz r3, 802cbb0 <tcp_input+0x6f4>
  36715. /* The connection has been closed and we will deallocate the
  36716. PCB. */
  36717. if (!(pcb->flags & TF_RXCLOSED)) {
  36718. 802cb86: 7fa3 ldrb r3, [r4, #30]
  36719. 802cb88: f003 0310 and.w r3, r3, #16
  36720. 802cb8c: b2db uxtb r3, r3
  36721. 802cb8e: b933 cbnz r3, 802cb9e <tcp_input+0x6e2>
  36722. /* Connection closed although the application has only shut down the
  36723. tx side: call the PCB's err callback and indicate the closure to
  36724. ensure the application doesn't continue using the PCB. */
  36725. TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_CLSD);
  36726. 802cb90: f8d4 3088 ldr.w r3, [r4, #136] ; 0x88
  36727. 802cb94: b11b cbz r3, 802cb9e <tcp_input+0x6e2>
  36728. 802cb96: 6920 ldr r0, [r4, #16]
  36729. 802cb98: f06f 010b mvn.w r1, #11
  36730. 802cb9c: 4798 blx r3
  36731. }
  36732. tcp_pcb_remove(&tcp_active_pcbs, pcb);
  36733. 802cb9e: 4621 mov r1, r4
  36734. 802cba0: 4840 ldr r0, [pc, #256] ; (802cca4 <tcp_input+0x7e8>)
  36735. 802cba2: f7fe ff91 bl 802bac8 <tcp_pcb_remove>
  36736. memp_free(MEMP_TCP_PCB, pcb);
  36737. 802cba6: 2002 movs r0, #2
  36738. 802cba8: 4621 mov r1, r4
  36739. 802cbaa: f7fe fa47 bl 802b03c <memp_free>
  36740. 802cbae: e050 b.n 802cc52 <tcp_input+0x796>
  36741. } else {
  36742. err = ERR_OK;
  36743. /* If the application has registered a "sent" function to be
  36744. called when new send buffer space is available, we call it
  36745. now. */
  36746. if (pcb->acked > 0) {
  36747. 802cbb0: f8b4 2064 ldrh.w r2, [r4, #100] ; 0x64
  36748. 802cbb4: b91a cbnz r2, 802cbbe <tcp_input+0x702>
  36749. if (err == ERR_ABRT) {
  36750. goto aborted;
  36751. }
  36752. }
  36753. if (recv_data != NULL) {
  36754. 802cbb6: 4b3f ldr r3, [pc, #252] ; (802ccb4 <tcp_input+0x7f8>)
  36755. 802cbb8: 681a ldr r2, [r3, #0]
  36756. 802cbba: b94a cbnz r2, 802cbd0 <tcp_input+0x714>
  36757. 802cbbc: e026 b.n 802cc0c <tcp_input+0x750>
  36758. err = ERR_OK;
  36759. /* If the application has registered a "sent" function to be
  36760. called when new send buffer space is available, we call it
  36761. now. */
  36762. if (pcb->acked > 0) {
  36763. TCP_EVENT_SENT(pcb, pcb->acked, err);
  36764. 802cbbe: 6fa3 ldr r3, [r4, #120] ; 0x78
  36765. 802cbc0: 2b00 cmp r3, #0
  36766. 802cbc2: d0f8 beq.n 802cbb6 <tcp_input+0x6fa>
  36767. 802cbc4: 6920 ldr r0, [r4, #16]
  36768. 802cbc6: 4621 mov r1, r4
  36769. 802cbc8: 4798 blx r3
  36770. if (err == ERR_ABRT) {
  36771. 802cbca: 300a adds r0, #10
  36772. 802cbcc: d1f3 bne.n 802cbb6 <tcp_input+0x6fa>
  36773. 802cbce: e040 b.n 802cc52 <tcp_input+0x796>
  36774. }
  36775. }
  36776. if (recv_data != NULL) {
  36777. LWIP_ASSERT("pcb->refused_data == NULL", pcb->refused_data == NULL);
  36778. if (pcb->flags & TF_RXCLOSED) {
  36779. 802cbd0: 7fa3 ldrb r3, [r4, #30]
  36780. 802cbd2: f003 0310 and.w r3, r3, #16
  36781. 802cbd6: b2db uxtb r3, r3
  36782. 802cbd8: b133 cbz r3, 802cbe8 <tcp_input+0x72c>
  36783. /* received data although already closed -> abort (send RST) to
  36784. notify the remote host that not all data has been processed */
  36785. pbuf_free(recv_data);
  36786. 802cbda: 4610 mov r0, r2
  36787. 802cbdc: f7fe fb38 bl 802b250 <pbuf_free>
  36788. tcp_abort(pcb);
  36789. 802cbe0: 4620 mov r0, r4
  36790. 802cbe2: f7fe ffe5 bl 802bbb0 <tcp_abort>
  36791. goto aborted;
  36792. 802cbe6: e034 b.n 802cc52 <tcp_input+0x796>
  36793. }
  36794. /* Notify application that data has been received. */
  36795. TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err);
  36796. 802cbe8: 6fe5 ldr r5, [r4, #124] ; 0x7c
  36797. 802cbea: b11d cbz r5, 802cbf4 <tcp_input+0x738>
  36798. 802cbec: 6920 ldr r0, [r4, #16]
  36799. 802cbee: 4621 mov r1, r4
  36800. 802cbf0: 47a8 blx r5
  36801. 802cbf2: e004 b.n 802cbfe <tcp_input+0x742>
  36802. 802cbf4: 4628 mov r0, r5
  36803. 802cbf6: 4621 mov r1, r4
  36804. 802cbf8: 462b mov r3, r5
  36805. 802cbfa: f7ff f895 bl 802bd28 <tcp_recv_null>
  36806. if (err == ERR_ABRT) {
  36807. 802cbfe: b243 sxtb r3, r0
  36808. 802cc00: 330a adds r3, #10
  36809. 802cc02: d026 beq.n 802cc52 <tcp_input+0x796>
  36810. goto aborted;
  36811. }
  36812. /* If the upper layer can't receive this data, store it */
  36813. if (err != ERR_OK) {
  36814. 802cc04: b110 cbz r0, 802cc0c <tcp_input+0x750>
  36815. pcb->refused_data = recv_data;
  36816. 802cc06: 4b2b ldr r3, [pc, #172] ; (802ccb4 <tcp_input+0x7f8>)
  36817. 802cc08: 681b ldr r3, [r3, #0]
  36818. 802cc0a: 6763 str r3, [r4, #116] ; 0x74
  36819. }
  36820. }
  36821. /* If a FIN segment was received, we call the callback
  36822. function with a NULL buffer to indicate EOF. */
  36823. if (recv_flags & TF_GOT_FIN) {
  36824. 802cc0c: 4b24 ldr r3, [pc, #144] ; (802cca0 <tcp_input+0x7e4>)
  36825. 802cc0e: 781b ldrb r3, [r3, #0]
  36826. 802cc10: f003 0320 and.w r3, r3, #32
  36827. 802cc14: b2db uxtb r3, r3
  36828. 802cc16: b1b3 cbz r3, 802cc46 <tcp_input+0x78a>
  36829. if (pcb->refused_data != NULL) {
  36830. 802cc18: 6f63 ldr r3, [r4, #116] ; 0x74
  36831. 802cc1a: b123 cbz r3, 802cc26 <tcp_input+0x76a>
  36832. /* Delay this if we have refused data. */
  36833. pcb->refused_data->flags |= PBUF_FLAG_TCP_FIN;
  36834. 802cc1c: 7b5a ldrb r2, [r3, #13]
  36835. 802cc1e: f042 0220 orr.w r2, r2, #32
  36836. 802cc22: 735a strb r2, [r3, #13]
  36837. 802cc24: e00f b.n 802cc46 <tcp_input+0x78a>
  36838. } else {
  36839. /* correct rcv_wnd as the application won't call tcp_recved()
  36840. for the FIN's seqno */
  36841. if (pcb->rcv_wnd != TCP_WND) {
  36842. 802cc26: 8da3 ldrh r3, [r4, #44] ; 0x2c
  36843. 802cc28: f241 62d0 movw r2, #5840 ; 0x16d0
  36844. 802cc2c: 4293 cmp r3, r2
  36845. 802cc2e: d001 beq.n 802cc34 <tcp_input+0x778>
  36846. pcb->rcv_wnd++;
  36847. 802cc30: 3301 adds r3, #1
  36848. 802cc32: 85a3 strh r3, [r4, #44] ; 0x2c
  36849. }
  36850. TCP_EVENT_CLOSED(pcb, err);
  36851. 802cc34: 6fe5 ldr r5, [r4, #124] ; 0x7c
  36852. 802cc36: b135 cbz r5, 802cc46 <tcp_input+0x78a>
  36853. 802cc38: 2200 movs r2, #0
  36854. 802cc3a: 6920 ldr r0, [r4, #16]
  36855. 802cc3c: 4621 mov r1, r4
  36856. 802cc3e: 4613 mov r3, r2
  36857. 802cc40: 47a8 blx r5
  36858. if (err == ERR_ABRT) {
  36859. 802cc42: 300a adds r0, #10
  36860. 802cc44: d005 beq.n 802cc52 <tcp_input+0x796>
  36861. goto aborted;
  36862. }
  36863. }
  36864. }
  36865. tcp_input_pcb = NULL;
  36866. 802cc46: 4b1c ldr r3, [pc, #112] ; (802ccb8 <tcp_input+0x7fc>)
  36867. 802cc48: 2200 movs r2, #0
  36868. /* Try to send something out. */
  36869. tcp_output(pcb);
  36870. 802cc4a: 4620 mov r0, r4
  36871. goto aborted;
  36872. }
  36873. }
  36874. }
  36875. tcp_input_pcb = NULL;
  36876. 802cc4c: 601a str r2, [r3, #0]
  36877. /* Try to send something out. */
  36878. tcp_output(pcb);
  36879. 802cc4e: f000 fb3b bl 802d2c8 <tcp_output>
  36880. }
  36881. }
  36882. /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()).
  36883. Below this line, 'pcb' may not be dereferenced! */
  36884. aborted:
  36885. tcp_input_pcb = NULL;
  36886. 802cc52: 4b19 ldr r3, [pc, #100] ; (802ccb8 <tcp_input+0x7fc>)
  36887. recv_data = NULL;
  36888. /* give up our reference to inseg.p */
  36889. if (inseg.p != NULL)
  36890. 802cc54: 4d19 ldr r5, [pc, #100] ; (802ccbc <tcp_input+0x800>)
  36891. }
  36892. }
  36893. /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()).
  36894. Below this line, 'pcb' may not be dereferenced! */
  36895. aborted:
  36896. tcp_input_pcb = NULL;
  36897. 802cc56: 2400 movs r4, #0
  36898. 802cc58: 601c str r4, [r3, #0]
  36899. recv_data = NULL;
  36900. /* give up our reference to inseg.p */
  36901. if (inseg.p != NULL)
  36902. 802cc5a: 6868 ldr r0, [r5, #4]
  36903. }
  36904. /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()).
  36905. Below this line, 'pcb' may not be dereferenced! */
  36906. aborted:
  36907. tcp_input_pcb = NULL;
  36908. recv_data = NULL;
  36909. 802cc5c: 4b15 ldr r3, [pc, #84] ; (802ccb4 <tcp_input+0x7f8>)
  36910. 802cc5e: 601c str r4, [r3, #0]
  36911. /* give up our reference to inseg.p */
  36912. if (inseg.p != NULL)
  36913. 802cc60: 2800 cmp r0, #0
  36914. 802cc62: d067 beq.n 802cd34 <tcp_input+0x878>
  36915. {
  36916. pbuf_free(inseg.p);
  36917. 802cc64: f7fe faf4 bl 802b250 <pbuf_free>
  36918. inseg.p = NULL;
  36919. 802cc68: 606c str r4, [r5, #4]
  36920. 802cc6a: e063 b.n 802cd34 <tcp_input+0x878>
  36921. if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
  36922. TCP_STATS_INC(tcp.proterr);
  36923. TCP_STATS_INC(tcp.drop);
  36924. tcp_rst(ackno, seqno + tcplen,
  36925. ip_current_dest_addr(), ip_current_src_addr(),
  36926. tcphdr->dest, tcphdr->src);
  36927. 802cc6c: 4b14 ldr r3, [pc, #80] ; (802ccc0 <tcp_input+0x804>)
  36928. sender. */
  36929. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n"));
  36930. if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
  36931. TCP_STATS_INC(tcp.proterr);
  36932. TCP_STATS_INC(tcp.drop);
  36933. tcp_rst(ackno, seqno + tcplen,
  36934. 802cc6e: 4a15 ldr r2, [pc, #84] ; (802ccc4 <tcp_input+0x808>)
  36935. ip_current_dest_addr(), ip_current_src_addr(),
  36936. tcphdr->dest, tcphdr->src);
  36937. 802cc70: 681b ldr r3, [r3, #0]
  36938. sender. */
  36939. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n"));
  36940. if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
  36941. TCP_STATS_INC(tcp.proterr);
  36942. TCP_STATS_INC(tcp.drop);
  36943. tcp_rst(ackno, seqno + tcplen,
  36944. 802cc72: 8811 ldrh r1, [r2, #0]
  36945. 802cc74: 8858 ldrh r0, [r3, #2]
  36946. 802cc76: 4a14 ldr r2, [pc, #80] ; (802ccc8 <tcp_input+0x80c>)
  36947. 802cc78: 6812 ldr r2, [r2, #0]
  36948. 802cc7a: 9000 str r0, [sp, #0]
  36949. 802cc7c: 881b ldrh r3, [r3, #0]
  36950. 802cc7e: 9301 str r3, [sp, #4]
  36951. 802cc80: 4b06 ldr r3, [pc, #24] ; (802cc9c <tcp_input+0x7e0>)
  36952. 802cc82: 1889 adds r1, r1, r2
  36953. 802cc84: 6818 ldr r0, [r3, #0]
  36954. 802cc86: e517 b.n 802c6b8 <tcp_input+0x1fc>
  36955. LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane());
  36956. PERF_STOP("tcp_input");
  36957. return;
  36958. dropped:
  36959. TCP_STATS_INC(tcp.drop);
  36960. snmp_inc_tcpinerrs();
  36961. 802cc88: f003 f8d2 bl 802fe30 <snmp_inc_tcpinerrs>
  36962. pbuf_free(p);
  36963. 802cc8c: 4630 mov r0, r6
  36964. }
  36965. 802cc8e: b003 add sp, #12
  36966. 802cc90: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  36967. PERF_STOP("tcp_input");
  36968. return;
  36969. dropped:
  36970. TCP_STATS_INC(tcp.drop);
  36971. snmp_inc_tcpinerrs();
  36972. pbuf_free(p);
  36973. 802cc94: f7fe badc b.w 802b250 <pbuf_free>
  36974. 802cc98: 20010d84 .word 0x20010d84
  36975. 802cc9c: 2000e0b0 .word 0x2000e0b0
  36976. 802cca0: 2000e0b5 .word 0x2000e0b5
  36977. 802cca4: 20010d78 .word 0x20010d78
  36978. 802cca8: 2000e0b4 .word 0x2000e0b4
  36979. 802ccac: 20010d74 .word 0x20010d74
  36980. 802ccb0: 20010d8c .word 0x20010d8c
  36981. 802ccb4: 2000e0b8 .word 0x2000e0b8
  36982. 802ccb8: 20010d90 .word 0x20010d90
  36983. 802ccbc: 2000e0c0 .word 0x2000e0c0
  36984. 802ccc0: 2000e0a4 .word 0x2000e0a4
  36985. 802ccc4: 2000e0ac .word 0x2000e0ac
  36986. 802ccc8: 2000e0a8 .word 0x2000e0a8
  36987. }
  36988. if (pcb == NULL) {
  36989. /* If it did not go to an active connection, we check the connections
  36990. in the TIME-WAIT state. */
  36991. for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  36992. 802cccc: 4b1b ldr r3, [pc, #108] ; (802cd3c <tcp_input+0x880>)
  36993. 802ccce: 681b ldr r3, [r3, #0]
  36994. 802ccd0: e4bf b.n 802c652 <tcp_input+0x196>
  36995. tcp_debug_print_state(pcb->state);
  36996. #endif /* TCP_DEBUG */
  36997. #endif /* TCP_INPUT_DEBUG */
  36998. /* Set up a tcp_seg structure. */
  36999. inseg.next = NULL;
  37000. 802ccd2: 4b1b ldr r3, [pc, #108] ; (802cd40 <tcp_input+0x884>)
  37001. 802ccd4: 2100 movs r1, #0
  37002. 802ccd6: 6019 str r1, [r3, #0]
  37003. inseg.len = p->tot_len;
  37004. 802ccd8: f8a3 8008 strh.w r8, [r3, #8]
  37005. inseg.p = p;
  37006. 802ccdc: 605e str r6, [r3, #4]
  37007. inseg.tcphdr = tcphdr;
  37008. 802ccde: 60df str r7, [r3, #12]
  37009. recv_data = NULL;
  37010. 802cce0: 4b18 ldr r3, [pc, #96] ; (802cd44 <tcp_input+0x888>)
  37011. recv_flags = 0;
  37012. if (flags & TCP_PSH) {
  37013. 802cce2: f002 0208 and.w r2, r2, #8
  37014. inseg.next = NULL;
  37015. inseg.len = p->tot_len;
  37016. inseg.p = p;
  37017. inseg.tcphdr = tcphdr;
  37018. recv_data = NULL;
  37019. 802cce6: 6019 str r1, [r3, #0]
  37020. recv_flags = 0;
  37021. 802cce8: 4b17 ldr r3, [pc, #92] ; (802cd48 <tcp_input+0x88c>)
  37022. if (flags & TCP_PSH) {
  37023. 802ccea: b2d2 uxtb r2, r2
  37024. inseg.len = p->tot_len;
  37025. inseg.p = p;
  37026. inseg.tcphdr = tcphdr;
  37027. recv_data = NULL;
  37028. recv_flags = 0;
  37029. 802ccec: 7019 strb r1, [r3, #0]
  37030. if (flags & TCP_PSH) {
  37031. 802ccee: 2a00 cmp r2, #0
  37032. 802ccf0: f47f ad52 bne.w 802c798 <tcp_input+0x2dc>
  37033. 802ccf4: e554 b.n 802c7a0 <tcp_input+0x2e4>
  37034. #endif /* SO_REUSE */
  37035. if (lpcb != NULL) {
  37036. /* Move this PCB to the front of the list so that subsequent
  37037. lookups will be faster (we exploit locality in TCP segment
  37038. arrivals). */
  37039. if (prev != NULL) {
  37040. 802ccf6: 2b00 cmp r3, #0
  37041. 802ccf8: f47f acc4 bne.w 802c684 <tcp_input+0x1c8>
  37042. 802ccfc: e4c7 b.n 802c68e <tcp_input+0x1d2>
  37043. } else {
  37044. /* If no matching PCB was found, send a TCP RST (reset) to the
  37045. sender. */
  37046. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n"));
  37047. if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
  37048. 802ccfe: 89b8 ldrh r0, [r7, #12]
  37049. 802cd00: f7fd f96d bl 8029fde <lwip_ntohs>
  37050. 802cd04: f000 0004 and.w r0, r0, #4
  37051. 802cd08: b280 uxth r0, r0
  37052. 802cd0a: 2800 cmp r0, #0
  37053. 802cd0c: d1be bne.n 802cc8c <tcp_input+0x7d0>
  37054. 802cd0e: e7ad b.n 802cc6c <tcp_input+0x7b0>
  37055. }
  37056. if (acceptable) {
  37057. LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n"));
  37058. LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED);
  37059. recv_flags |= TF_RESET;
  37060. 802cd10: 4b0d ldr r3, [pc, #52] ; (802cd48 <tcp_input+0x88c>)
  37061. 802cd12: 781a ldrb r2, [r3, #0]
  37062. 802cd14: f042 0208 orr.w r2, r2, #8
  37063. 802cd18: 701a strb r2, [r3, #0]
  37064. pcb->flags &= ~TF_ACK_DELAY;
  37065. 802cd1a: 7fa3 ldrb r3, [r4, #30]
  37066. 802cd1c: f023 0301 bic.w r3, r3, #1
  37067. 802cd20: 77a3 strb r3, [r4, #30]
  37068. tcp_input_pcb = pcb;
  37069. err = tcp_process(pcb);
  37070. /* A return value of ERR_ABRT means that tcp_abort() was called
  37071. and that the pcb has been freed. If so, we don't do anything. */
  37072. if (err != ERR_ABRT) {
  37073. if (recv_flags & TF_RESET) {
  37074. 802cd22: 4b09 ldr r3, [pc, #36] ; (802cd48 <tcp_input+0x88c>)
  37075. 802cd24: 781b ldrb r3, [r3, #0]
  37076. 802cd26: f003 0208 and.w r2, r3, #8
  37077. 802cd2a: b2d2 uxtb r2, r2
  37078. 802cd2c: 2a00 cmp r2, #0
  37079. 802cd2e: f47f af1f bne.w 802cb70 <tcp_input+0x6b4>
  37080. 802cd32: e724 b.n 802cb7e <tcp_input+0x6c2>
  37081. return;
  37082. dropped:
  37083. TCP_STATS_INC(tcp.drop);
  37084. snmp_inc_tcpinerrs();
  37085. pbuf_free(p);
  37086. }
  37087. 802cd34: b003 add sp, #12
  37088. 802cd36: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  37089. 802cd3a: bf00 nop
  37090. 802cd3c: 20010d8c .word 0x20010d8c
  37091. 802cd40: 2000e0c0 .word 0x2000e0c0
  37092. 802cd44: 2000e0b8 .word 0x2000e0b8
  37093. 802cd48: 2000e0b5 .word 0x2000e0b5
  37094. 0802cd4c <tcp_pbuf_prealloc>:
  37095. #if TCP_OVERSIZE
  37096. static struct pbuf *
  37097. tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length,
  37098. u16_t *oversize, struct tcp_pcb *pcb, u8_t apiflags,
  37099. u8_t first_seg)
  37100. {
  37101. 802cd4c: b570 push {r4, r5, r6, lr}
  37102. LWIP_UNUSED_ARG(apiflags);
  37103. LWIP_UNUSED_ARG(first_seg);
  37104. /* always create MSS-sized pbufs */
  37105. alloc = max_length;
  37106. #else /* LWIP_NETIF_TX_SINGLE_PBUF */
  37107. if (length < max_length) {
  37108. 802cd4e: 4291 cmp r1, r2
  37109. #if TCP_OVERSIZE
  37110. static struct pbuf *
  37111. tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length,
  37112. u16_t *oversize, struct tcp_pcb *pcb, u8_t apiflags,
  37113. u8_t first_seg)
  37114. {
  37115. 802cd50: 460c mov r4, r1
  37116. 802cd52: 461e mov r6, r3
  37117. 802cd54: 9d04 ldr r5, [sp, #16]
  37118. LWIP_UNUSED_ARG(apiflags);
  37119. LWIP_UNUSED_ARG(first_seg);
  37120. /* always create MSS-sized pbufs */
  37121. alloc = max_length;
  37122. #else /* LWIP_NETIF_TX_SINGLE_PBUF */
  37123. if (length < max_length) {
  37124. 802cd56: d21a bcs.n 802cd8e <tcp_pbuf_prealloc+0x42>
  37125. *
  37126. * Did the user set TCP_WRITE_FLAG_MORE?
  37127. *
  37128. * Will the Nagle algorithm defer transmission of this segment?
  37129. */
  37130. if ((apiflags & TCP_WRITE_FLAG_MORE) ||
  37131. 802cd58: f89d 3014 ldrb.w r3, [sp, #20]
  37132. 802cd5c: f003 0302 and.w r3, r3, #2
  37133. 802cd60: b2db uxtb r3, r3
  37134. 802cd62: b95b cbnz r3, 802cd7c <tcp_pbuf_prealloc+0x30>
  37135. (!(pcb->flags & TF_NODELAY) &&
  37136. 802cd64: 7fab ldrb r3, [r5, #30]
  37137. *
  37138. * Did the user set TCP_WRITE_FLAG_MORE?
  37139. *
  37140. * Will the Nagle algorithm defer transmission of this segment?
  37141. */
  37142. if ((apiflags & TCP_WRITE_FLAG_MORE) ||
  37143. 802cd66: f003 0340 and.w r3, r3, #64 ; 0x40
  37144. 802cd6a: b2db uxtb r3, r3
  37145. 802cd6c: b97b cbnz r3, 802cd8e <tcp_pbuf_prealloc+0x42>
  37146. (!(pcb->flags & TF_NODELAY) &&
  37147. 802cd6e: f89d 3018 ldrb.w r3, [sp, #24]
  37148. 802cd72: b11b cbz r3, 802cd7c <tcp_pbuf_prealloc+0x30>
  37149. (!first_seg ||
  37150. 802cd74: 6ee9 ldr r1, [r5, #108] ; 0x6c
  37151. 802cd76: b909 cbnz r1, 802cd7c <tcp_pbuf_prealloc+0x30>
  37152. pcb->unsent != NULL ||
  37153. 802cd78: 6f2b ldr r3, [r5, #112] ; 0x70
  37154. 802cd7a: b143 cbz r3, 802cd8e <tcp_pbuf_prealloc+0x42>
  37155. pcb->unacked != NULL))) {
  37156. alloc = LWIP_MIN(max_length, LWIP_MEM_ALIGN_SIZE(length + TCP_OVERSIZE));
  37157. 802cd7c: f204 51b7 addw r1, r4, #1463 ; 0x5b7
  37158. 802cd80: f021 0103 bic.w r1, r1, #3
  37159. 802cd84: 4291 cmp r1, r2
  37160. 802cd86: bfa8 it ge
  37161. 802cd88: 4611 movge r1, r2
  37162. 802cd8a: b289 uxth r1, r1
  37163. 802cd8c: e000 b.n 802cd90 <tcp_pbuf_prealloc+0x44>
  37164. * Will the Nagle algorithm defer transmission of this segment?
  37165. */
  37166. if ((apiflags & TCP_WRITE_FLAG_MORE) ||
  37167. (!(pcb->flags & TF_NODELAY) &&
  37168. (!first_seg ||
  37169. pcb->unsent != NULL ||
  37170. 802cd8e: 4621 mov r1, r4
  37171. pcb->unacked != NULL))) {
  37172. alloc = LWIP_MIN(max_length, LWIP_MEM_ALIGN_SIZE(length + TCP_OVERSIZE));
  37173. }
  37174. }
  37175. #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
  37176. p = pbuf_alloc(layer, alloc, PBUF_RAM);
  37177. 802cd90: 2200 movs r2, #0
  37178. 802cd92: f7fe faaa bl 802b2ea <pbuf_alloc>
  37179. if (p == NULL) {
  37180. 802cd96: b120 cbz r0, 802cda2 <tcp_pbuf_prealloc+0x56>
  37181. return NULL;
  37182. }
  37183. LWIP_ASSERT("need unchained pbuf", p->next == NULL);
  37184. *oversize = p->len - length;
  37185. 802cd98: 8943 ldrh r3, [r0, #10]
  37186. 802cd9a: 1b1b subs r3, r3, r4
  37187. 802cd9c: 8033 strh r3, [r6, #0]
  37188. /* trim p->len to the currently used size */
  37189. p->len = p->tot_len = length;
  37190. 802cd9e: 8104 strh r4, [r0, #8]
  37191. 802cda0: 8144 strh r4, [r0, #10]
  37192. return p;
  37193. }
  37194. 802cda2: bd70 pop {r4, r5, r6, pc}
  37195. 0802cda4 <tcp_create_segment>:
  37196. * The TCP header is filled in except ackno and wnd.
  37197. * p is freed on failure.
  37198. */
  37199. static struct tcp_seg *
  37200. tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags)
  37201. {
  37202. 802cda4: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  37203. 802cda8: f89d 6020 ldrb.w r6, [sp, #32]
  37204. struct tcp_seg *seg;
  37205. u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags);
  37206. 802cdac: f006 0702 and.w r7, r6, #2
  37207. 802cdb0: f016 0f01 tst.w r6, #1
  37208. 802cdb4: b2ff uxtb r7, r7
  37209. * The TCP header is filled in except ackno and wnd.
  37210. * p is freed on failure.
  37211. */
  37212. static struct tcp_seg *
  37213. tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags)
  37214. {
  37215. 802cdb6: 4680 mov r8, r0
  37216. 802cdb8: 469a mov sl, r3
  37217. struct tcp_seg *seg;
  37218. u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags);
  37219. 802cdba: bf0c ite eq
  37220. 802cdbc: 2300 moveq r3, #0
  37221. 802cdbe: 2304 movne r3, #4
  37222. 802cdc0: 2f00 cmp r7, #0
  37223. 802cdc2: bf14 ite ne
  37224. 802cdc4: 270c movne r7, #12
  37225. 802cdc6: 2700 moveq r7, #0
  37226. if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) {
  37227. 802cdc8: 2004 movs r0, #4
  37228. * The TCP header is filled in except ackno and wnd.
  37229. * p is freed on failure.
  37230. */
  37231. static struct tcp_seg *
  37232. tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags)
  37233. {
  37234. 802cdca: 460d mov r5, r1
  37235. 802cdcc: 4691 mov r9, r2
  37236. struct tcp_seg *seg;
  37237. u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags);
  37238. 802cdce: 18ff adds r7, r7, r3
  37239. if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) {
  37240. 802cdd0: f7fe f91e bl 802b010 <memp_malloc>
  37241. 802cdd4: 4604 mov r4, r0
  37242. 802cdd6: b918 cbnz r0, 802cde0 <tcp_create_segment+0x3c>
  37243. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no memory.\n"));
  37244. pbuf_free(p);
  37245. 802cdd8: 4628 mov r0, r5
  37246. 802cdda: f7fe fa39 bl 802b250 <pbuf_free>
  37247. return NULL;
  37248. 802cdde: e030 b.n 802ce42 <tcp_create_segment+0x9e>
  37249. }
  37250. seg->flags = optflags;
  37251. 802cde0: 7286 strb r6, [r0, #10]
  37252. seg->next = NULL;
  37253. seg->p = p;
  37254. seg->len = p->tot_len - optlen;
  37255. 802cde2: 892b ldrh r3, [r5, #8]
  37256. pbuf_free(p);
  37257. return NULL;
  37258. }
  37259. seg->flags = optflags;
  37260. seg->next = NULL;
  37261. seg->p = p;
  37262. 802cde4: 6045 str r5, [r0, #4]
  37263. seg->len = p->tot_len - optlen;
  37264. 802cde6: 1bdb subs r3, r3, r7
  37265. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no memory.\n"));
  37266. pbuf_free(p);
  37267. return NULL;
  37268. }
  37269. seg->flags = optflags;
  37270. seg->next = NULL;
  37271. 802cde8: 2600 movs r6, #0
  37272. 802cdea: 6006 str r6, [r0, #0]
  37273. seg->p = p;
  37274. seg->len = p->tot_len - optlen;
  37275. 802cdec: 8103 strh r3, [r0, #8]
  37276. LWIP_ASSERT("invalid optflags passed: TF_SEG_DATA_CHECKSUMMED",
  37277. (optflags & TF_SEG_DATA_CHECKSUMMED) == 0);
  37278. #endif /* TCP_CHECKSUM_ON_COPY */
  37279. /* build TCP header */
  37280. if (pbuf_header(p, TCP_HLEN)) {
  37281. 802cdee: 2114 movs r1, #20
  37282. 802cdf0: 4628 mov r0, r5
  37283. 802cdf2: f7fe fa02 bl 802b1fa <pbuf_header>
  37284. 802cdf6: 4605 mov r5, r0
  37285. 802cdf8: b120 cbz r0, 802ce04 <tcp_create_segment+0x60>
  37286. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no room for TCP header in pbuf.\n"));
  37287. TCP_STATS_INC(tcp.err);
  37288. tcp_seg_free(seg);
  37289. 802cdfa: 4620 mov r0, r4
  37290. 802cdfc: f7fe fcd5 bl 802b7aa <tcp_seg_free>
  37291. return NULL;
  37292. 802ce00: 4634 mov r4, r6
  37293. 802ce02: e01e b.n 802ce42 <tcp_create_segment+0x9e>
  37294. }
  37295. seg->tcphdr = (struct tcp_hdr *)seg->p->payload;
  37296. 802ce04: 6863 ldr r3, [r4, #4]
  37297. seg->tcphdr->src = htons(pcb->local_port);
  37298. 802ce06: f8b8 001a ldrh.w r0, [r8, #26]
  37299. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no room for TCP header in pbuf.\n"));
  37300. TCP_STATS_INC(tcp.err);
  37301. tcp_seg_free(seg);
  37302. return NULL;
  37303. }
  37304. seg->tcphdr = (struct tcp_hdr *)seg->p->payload;
  37305. 802ce0a: 685e ldr r6, [r3, #4]
  37306. 802ce0c: 60e6 str r6, [r4, #12]
  37307. seg->tcphdr->src = htons(pcb->local_port);
  37308. 802ce0e: f7fd f8e1 bl 8029fd4 <lwip_htons>
  37309. 802ce12: 8030 strh r0, [r6, #0]
  37310. seg->tcphdr->dest = htons(pcb->remote_port);
  37311. 802ce14: f8b8 001c ldrh.w r0, [r8, #28]
  37312. 802ce18: 68e6 ldr r6, [r4, #12]
  37313. 802ce1a: f7fd f8db bl 8029fd4 <lwip_htons>
  37314. 802ce1e: 8070 strh r0, [r6, #2]
  37315. seg->tcphdr->seqno = htonl(seqno);
  37316. 802ce20: 4650 mov r0, sl
  37317. 802ce22: 68e6 ldr r6, [r4, #12]
  37318. 802ce24: f7fd f8e0 bl 8029fe8 <lwip_htonl>
  37319. /* ackno is set in tcp_output */
  37320. TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), flags);
  37321. 802ce28: 02bf lsls r7, r7, #10
  37322. return NULL;
  37323. }
  37324. seg->tcphdr = (struct tcp_hdr *)seg->p->payload;
  37325. seg->tcphdr->src = htons(pcb->local_port);
  37326. seg->tcphdr->dest = htons(pcb->remote_port);
  37327. seg->tcphdr->seqno = htonl(seqno);
  37328. 802ce2a: 6070 str r0, [r6, #4]
  37329. /* ackno is set in tcp_output */
  37330. TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), flags);
  37331. 802ce2c: f507 40a0 add.w r0, r7, #20480 ; 0x5000
  37332. 802ce30: ea40 0009 orr.w r0, r0, r9
  37333. 802ce34: 68e6 ldr r6, [r4, #12]
  37334. 802ce36: f7fd f8cd bl 8029fd4 <lwip_htons>
  37335. 802ce3a: 81b0 strh r0, [r6, #12]
  37336. /* wnd and chksum are set in tcp_output */
  37337. seg->tcphdr->urgp = 0;
  37338. 802ce3c: 68e3 ldr r3, [r4, #12]
  37339. 802ce3e: 749d strb r5, [r3, #18]
  37340. 802ce40: 74dd strb r5, [r3, #19]
  37341. return seg;
  37342. }
  37343. 802ce42: 4620 mov r0, r4
  37344. 802ce44: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  37345. 0802ce48 <tcp_output_alloc_header.constprop.0>:
  37346. static struct pbuf *
  37347. tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,
  37348. u32_t seqno_be /* already in network byte order */)
  37349. {
  37350. struct tcp_hdr *tcphdr;
  37351. struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);
  37352. 802ce48: 3114 adds r1, #20
  37353. * @param datalen length of tcp data to reserve in pbuf
  37354. * @param seqno_be seqno in network byte order (big-endian)
  37355. * @return pbuf with p->payload being the tcp_hdr
  37356. */
  37357. static struct pbuf *
  37358. tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,
  37359. 802ce4a: b5f8 push {r3, r4, r5, r6, r7, lr}
  37360. u32_t seqno_be /* already in network byte order */)
  37361. {
  37362. struct tcp_hdr *tcphdr;
  37363. struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);
  37364. 802ce4c: b289 uxth r1, r1
  37365. * @param datalen length of tcp data to reserve in pbuf
  37366. * @param seqno_be seqno in network byte order (big-endian)
  37367. * @return pbuf with p->payload being the tcp_hdr
  37368. */
  37369. static struct pbuf *
  37370. tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,
  37371. 802ce4e: 4605 mov r5, r0
  37372. 802ce50: 4617 mov r7, r2
  37373. u32_t seqno_be /* already in network byte order */)
  37374. {
  37375. struct tcp_hdr *tcphdr;
  37376. struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);
  37377. 802ce52: 2001 movs r0, #1
  37378. 802ce54: 2200 movs r2, #0
  37379. 802ce56: f7fe fa48 bl 802b2ea <pbuf_alloc>
  37380. if (p != NULL) {
  37381. 802ce5a: 4606 mov r6, r0
  37382. 802ce5c: b1f8 cbz r0, 802ce9e <tcp_output_alloc_header.constprop.0+0x56>
  37383. LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
  37384. (p->len >= TCP_HLEN + optlen));
  37385. tcphdr = (struct tcp_hdr *)p->payload;
  37386. 802ce5e: 6844 ldr r4, [r0, #4]
  37387. tcphdr->src = htons(pcb->local_port);
  37388. 802ce60: 8b68 ldrh r0, [r5, #26]
  37389. 802ce62: f7fd f8b7 bl 8029fd4 <lwip_htons>
  37390. 802ce66: 8020 strh r0, [r4, #0]
  37391. tcphdr->dest = htons(pcb->remote_port);
  37392. 802ce68: 8ba8 ldrh r0, [r5, #28]
  37393. 802ce6a: f7fd f8b3 bl 8029fd4 <lwip_htons>
  37394. tcphdr->seqno = seqno_be;
  37395. 802ce6e: 6067 str r7, [r4, #4]
  37396. if (p != NULL) {
  37397. LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
  37398. (p->len >= TCP_HLEN + optlen));
  37399. tcphdr = (struct tcp_hdr *)p->payload;
  37400. tcphdr->src = htons(pcb->local_port);
  37401. tcphdr->dest = htons(pcb->remote_port);
  37402. 802ce70: 8060 strh r0, [r4, #2]
  37403. tcphdr->seqno = seqno_be;
  37404. tcphdr->ackno = htonl(pcb->rcv_nxt);
  37405. 802ce72: 6aa8 ldr r0, [r5, #40] ; 0x28
  37406. 802ce74: f7fd f8b8 bl 8029fe8 <lwip_htonl>
  37407. 802ce78: 60a0 str r0, [r4, #8]
  37408. TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), TCP_ACK);
  37409. 802ce7a: f245 0010 movw r0, #20496 ; 0x5010
  37410. 802ce7e: f7fd f8a9 bl 8029fd4 <lwip_htons>
  37411. 802ce82: 81a0 strh r0, [r4, #12]
  37412. tcphdr->wnd = htons(pcb->rcv_ann_wnd);
  37413. 802ce84: 8de8 ldrh r0, [r5, #46] ; 0x2e
  37414. 802ce86: f7fd f8a5 bl 8029fd4 <lwip_htons>
  37415. tcphdr->chksum = 0;
  37416. 802ce8a: 2300 movs r3, #0
  37417. tcphdr->src = htons(pcb->local_port);
  37418. tcphdr->dest = htons(pcb->remote_port);
  37419. tcphdr->seqno = seqno_be;
  37420. tcphdr->ackno = htonl(pcb->rcv_nxt);
  37421. TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), TCP_ACK);
  37422. tcphdr->wnd = htons(pcb->rcv_ann_wnd);
  37423. 802ce8c: 81e0 strh r0, [r4, #14]
  37424. tcphdr->chksum = 0;
  37425. 802ce8e: 7423 strb r3, [r4, #16]
  37426. 802ce90: 7463 strb r3, [r4, #17]
  37427. tcphdr->urgp = 0;
  37428. 802ce92: 74a3 strb r3, [r4, #18]
  37429. 802ce94: 74e3 strb r3, [r4, #19]
  37430. /* If we're sending a packet, update the announced right window edge */
  37431. pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
  37432. 802ce96: 8dea ldrh r2, [r5, #46] ; 0x2e
  37433. 802ce98: 6aab ldr r3, [r5, #40] ; 0x28
  37434. 802ce9a: 18d3 adds r3, r2, r3
  37435. 802ce9c: 632b str r3, [r5, #48] ; 0x30
  37436. }
  37437. return p;
  37438. }
  37439. 802ce9e: 4630 mov r0, r6
  37440. 802cea0: bdf8 pop {r3, r4, r5, r6, r7, pc}
  37441. 0802cea2 <tcp_write>:
  37442. * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will be set on last segment sent,
  37443. * @return ERR_OK if enqueued, another err_t on error
  37444. */
  37445. err_t
  37446. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  37447. {
  37448. 802cea2: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  37449. 802cea6: b08f sub sp, #60 ; 0x3c
  37450. 802cea8: 4691 mov r9, r2
  37451. 802ceaa: 9307 str r3, [sp, #28]
  37452. u16_t pos = 0; /* position in 'arg' data */
  37453. u16_t queuelen;
  37454. u8_t optlen = 0;
  37455. u8_t optflags = 0;
  37456. #if TCP_OVERSIZE
  37457. u16_t oversize = 0;
  37458. 802ceac: 2300 movs r3, #0
  37459. 802ceae: f8ad 3036 strh.w r3, [sp, #54] ; 0x36
  37460. * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will be set on last segment sent,
  37461. * @return ERR_OK if enqueued, another err_t on error
  37462. */
  37463. err_t
  37464. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  37465. {
  37466. 802ceb2: 4604 mov r4, r0
  37467. u8_t concat_chksum_swapped = 0;
  37468. u16_t concat_chksummed = 0;
  37469. #endif /* TCP_CHECKSUM_ON_COPY */
  37470. err_t err;
  37471. /* don't allocate segments bigger than half the maximum window we ever received */
  37472. u16_t mss_local = LWIP_MIN(pcb->mss, pcb->snd_wnd_max/2);
  37473. 802ceb4: f8b0 2062 ldrh.w r2, [r0, #98] ; 0x62
  37474. 802ceb8: 8ec3 ldrh r3, [r0, #54] ; 0x36
  37475. apiflags |= TCP_WRITE_FLAG_COPY;
  37476. #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
  37477. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n",
  37478. (void *)pcb, arg, len, (u16_t)apiflags));
  37479. LWIP_ERROR("tcp_write: arg == NULL (programmer violates API)",
  37480. 802ceba: 9106 str r1, [sp, #24]
  37481. 802cebc: 2900 cmp r1, #0
  37482. 802cebe: f000 8168 beq.w 802d192 <tcp_write+0x2f0>
  37483. 802cec2: 7e01 ldrb r1, [r0, #24]
  37484. 802cec4: 2907 cmp r1, #7
  37485. 802cec6: f200 8166 bhi.w 802d196 <tcp_write+0x2f4>
  37486. 802ceca: f990 1018 ldrsb.w r1, [r0, #24]
  37487. 802cece: f04f 5064 mov.w r0, #956301312 ; 0x39000000
  37488. 802ced2: 4088 lsls r0, r1
  37489. 802ced4: f140 815f bpl.w 802d196 <tcp_write+0x2f4>
  37490. (pcb->state != CLOSE_WAIT) &&
  37491. (pcb->state != SYN_SENT) &&
  37492. (pcb->state != SYN_RCVD)) {
  37493. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, ("tcp_write() called in invalid state\n"));
  37494. return ERR_CONN;
  37495. } else if (len == 0) {
  37496. 802ced8: f1b9 0f00 cmp.w r9, #0
  37497. 802cedc: d00d beq.n 802cefa <tcp_write+0x58>
  37498. return ERR_OK;
  37499. }
  37500. /* fail on too much data */
  37501. if (len > pcb->snd_buf) {
  37502. 802cede: f8b4 1066 ldrh.w r1, [r4, #102] ; 0x66
  37503. 802cee2: 4549 cmp r1, r9
  37504. 802cee4: d200 bcs.n 802cee8 <tcp_write+0x46>
  37505. 802cee6: e003 b.n 802cef0 <tcp_write+0x4e>
  37506. LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen));
  37507. /* If total number of pbufs on the unsent/unacked queues exceeds the
  37508. * configured maximum, return an error */
  37509. /* check for configured max queuelen and possible overflow */
  37510. if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
  37511. 802cee8: f8b4 1068 ldrh.w r1, [r4, #104] ; 0x68
  37512. 802ceec: 2947 cmp r1, #71 ; 0x47
  37513. 802ceee: d904 bls.n 802cefa <tcp_write+0x58>
  37514. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_write: too long queue %"U16_F" (max %"U16_F")\n",
  37515. pcb->snd_queuelen, TCP_SND_QUEUELEN));
  37516. TCP_STATS_INC(tcp.memerr);
  37517. pcb->flags |= TF_NAGLEMEMERR;
  37518. 802cef0: 7fa3 ldrb r3, [r4, #30]
  37519. 802cef2: f063 037f orn r3, r3, #127 ; 0x7f
  37520. 802cef6: 77a3 strb r3, [r4, #30]
  37521. 802cef8: e151 b.n 802d19e <tcp_write+0x2fc>
  37522. u8_t concat_chksum_swapped = 0;
  37523. u16_t concat_chksummed = 0;
  37524. #endif /* TCP_CHECKSUM_ON_COPY */
  37525. err_t err;
  37526. /* don't allocate segments bigger than half the maximum window we ever received */
  37527. u16_t mss_local = LWIP_MIN(pcb->mss, pcb->snd_wnd_max/2);
  37528. 802cefa: 0852 lsrs r2, r2, #1
  37529. *
  37530. * pos records progress as data is segmented.
  37531. */
  37532. /* Find the tail of the unsent queue. */
  37533. if (pcb->unsent != NULL) {
  37534. 802cefc: 6ee6 ldr r6, [r4, #108] ; 0x6c
  37535. err = tcp_write_checks(pcb, len);
  37536. if (err != ERR_OK) {
  37537. return err;
  37538. }
  37539. queuelen = pcb->snd_queuelen;
  37540. 802cefe: f8b4 b068 ldrh.w fp, [r4, #104] ; 0x68
  37541. u8_t concat_chksum_swapped = 0;
  37542. u16_t concat_chksummed = 0;
  37543. #endif /* TCP_CHECKSUM_ON_COPY */
  37544. err_t err;
  37545. /* don't allocate segments bigger than half the maximum window we ever received */
  37546. u16_t mss_local = LWIP_MIN(pcb->mss, pcb->snd_wnd_max/2);
  37547. 802cf02: 429a cmp r2, r3
  37548. 802cf04: bf28 it cs
  37549. 802cf06: 461a movcs r2, r3
  37550. 802cf08: 920a str r2, [sp, #40] ; 0x28
  37551. *
  37552. * pos records progress as data is segmented.
  37553. */
  37554. /* Find the tail of the unsent queue. */
  37555. if (pcb->unsent != NULL) {
  37556. 802cf0a: b90e cbnz r6, 802cf10 <tcp_write+0x6e>
  37557. 802cf0c: e066 b.n 802cfdc <tcp_write+0x13a>
  37558. u16_t space;
  37559. u16_t unsent_optlen;
  37560. /* @todo: this could be sped up by keeping last_unsent in the pcb */
  37561. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  37562. last_unsent = last_unsent->next);
  37563. 802cf0e: 461e mov r6, r3
  37564. if (pcb->unsent != NULL) {
  37565. u16_t space;
  37566. u16_t unsent_optlen;
  37567. /* @todo: this could be sped up by keeping last_unsent in the pcb */
  37568. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  37569. 802cf10: 6833 ldr r3, [r6, #0]
  37570. 802cf12: 2b00 cmp r3, #0
  37571. 802cf14: d1fb bne.n 802cf0e <tcp_write+0x6c>
  37572. last_unsent = last_unsent->next);
  37573. /* Usable space at the end of the last unsent segment */
  37574. unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags);
  37575. 802cf16: 7ab3 ldrb r3, [r6, #10]
  37576. space = mss_local - (last_unsent->len + unsent_optlen);
  37577. 802cf18: 8937 ldrh r7, [r6, #8]
  37578. /* @todo: this could be sped up by keeping last_unsent in the pcb */
  37579. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  37580. last_unsent = last_unsent->next);
  37581. /* Usable space at the end of the last unsent segment */
  37582. unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags);
  37583. 802cf1a: 980a ldr r0, [sp, #40] ; 0x28
  37584. #if TCP_OVERSIZE_DBGCHECK
  37585. /* check that pcb->unsent_oversize matches last_unsent->unsent_oversize */
  37586. LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)",
  37587. pcb->unsent_oversize == last_unsent->oversize_left);
  37588. #endif /* TCP_OVERSIZE_DBGCHECK */
  37589. oversize = pcb->unsent_oversize;
  37590. 802cf1c: f8b4 506a ldrh.w r5, [r4, #106] ; 0x6a
  37591. /* @todo: this could be sped up by keeping last_unsent in the pcb */
  37592. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  37593. last_unsent = last_unsent->next);
  37594. /* Usable space at the end of the last unsent segment */
  37595. unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags);
  37596. 802cf20: f013 0f01 tst.w r3, #1
  37597. 802cf24: f003 0302 and.w r3, r3, #2
  37598. 802cf28: bf0c ite eq
  37599. 802cf2a: 2100 moveq r1, #0
  37600. 802cf2c: 2104 movne r1, #4
  37601. 802cf2e: b2db uxtb r3, r3
  37602. 802cf30: 1bc2 subs r2, r0, r7
  37603. 802cf32: 2b00 cmp r3, #0
  37604. 802cf34: bf14 ite ne
  37605. 802cf36: 230c movne r3, #12
  37606. 802cf38: 2300 moveq r3, #0
  37607. space = mss_local - (last_unsent->len + unsent_optlen);
  37608. 802cf3a: 1a52 subs r2, r2, r1
  37609. 802cf3c: 1ad2 subs r2, r2, r3
  37610. 802cf3e: b292 uxth r2, r2
  37611. /* check that pcb->unsent_oversize matches last_unsent->unsent_oversize */
  37612. LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)",
  37613. pcb->unsent_oversize == last_unsent->oversize_left);
  37614. #endif /* TCP_OVERSIZE_DBGCHECK */
  37615. oversize = pcb->unsent_oversize;
  37616. if (oversize > 0) {
  37617. 802cf40: b91d cbnz r5, 802cf4a <tcp_write+0xa8>
  37618. #if TCP_OVERSIZE_DBGCHECK
  37619. /* check that pcb->unsent_oversize matches last_unsent->unsent_oversize */
  37620. LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)",
  37621. pcb->unsent_oversize == last_unsent->oversize_left);
  37622. #endif /* TCP_OVERSIZE_DBGCHECK */
  37623. oversize = pcb->unsent_oversize;
  37624. 802cf42: f8ad 5036 strh.w r5, [sp, #54] ; 0x36
  37625. */
  37626. err_t
  37627. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  37628. {
  37629. struct pbuf *concat_p = NULL;
  37630. struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
  37631. 802cf46: 462b mov r3, r5
  37632. 802cf48: e00a b.n 802cf60 <tcp_write+0xbe>
  37633. #endif /* TCP_OVERSIZE_DBGCHECK */
  37634. oversize = pcb->unsent_oversize;
  37635. if (oversize > 0) {
  37636. LWIP_ASSERT("inconsistent oversize vs. space", oversize_used <= space);
  37637. seg = last_unsent;
  37638. oversize_used = oversize < len ? oversize : len;
  37639. 802cf4a: 45a9 cmp r9, r5
  37640. 802cf4c: bf34 ite cc
  37641. 802cf4e: 464b movcc r3, r9
  37642. 802cf50: 462b movcs r3, r5
  37643. pos += oversize_used;
  37644. oversize -= oversize_used;
  37645. 802cf52: 1aed subs r5, r5, r3
  37646. space -= oversize_used;
  37647. 802cf54: 1ad2 subs r2, r2, r3
  37648. if (oversize > 0) {
  37649. LWIP_ASSERT("inconsistent oversize vs. space", oversize_used <= space);
  37650. seg = last_unsent;
  37651. oversize_used = oversize < len ? oversize : len;
  37652. pos += oversize_used;
  37653. oversize -= oversize_used;
  37654. 802cf56: f8ad 5036 strh.w r5, [sp, #54] ; 0x36
  37655. space -= oversize_used;
  37656. 802cf5a: b292 uxth r2, r2
  37657. oversize = pcb->unsent_oversize;
  37658. if (oversize > 0) {
  37659. LWIP_ASSERT("inconsistent oversize vs. space", oversize_used <= space);
  37660. seg = last_unsent;
  37661. oversize_used = oversize < len ? oversize : len;
  37662. pos += oversize_used;
  37663. 802cf5c: 461d mov r5, r3
  37664. oversize -= oversize_used;
  37665. space -= oversize_used;
  37666. 802cf5e: 4633 mov r3, r6
  37667. *
  37668. * We don't extend segments containing SYN/FIN flags or options
  37669. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  37670. * the end.
  37671. */
  37672. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  37673. 802cf60: 454d cmp r5, r9
  37674. 802cf62: d23f bcs.n 802cfe4 <tcp_write+0x142>
  37675. 802cf64: 2a00 cmp r2, #0
  37676. 802cf66: d03d beq.n 802cfe4 <tcp_write+0x142>
  37677. 802cf68: 2f00 cmp r7, #0
  37678. 802cf6a: d03e beq.n 802cfea <tcp_write+0x148>
  37679. seg = last_unsent;
  37680. /* Create a pbuf with a copy or reference to seglen bytes. We
  37681. * can use PBUF_RAW here since the data appears in the middle of
  37682. * a segment. A header will never be prepended. */
  37683. if (apiflags & TCP_WRITE_FLAG_COPY) {
  37684. 802cf6c: 9907 ldr r1, [sp, #28]
  37685. * We don't extend segments containing SYN/FIN flags or options
  37686. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  37687. * the end.
  37688. */
  37689. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  37690. u16_t seglen = space < len - pos ? space : len - pos;
  37691. 802cf6e: ebc5 0a09 rsb sl, r5, r9
  37692. 802cf72: 4592 cmp sl, r2
  37693. 802cf74: bfa8 it ge
  37694. 802cf76: 4692 movge sl, r2
  37695. seg = last_unsent;
  37696. /* Create a pbuf with a copy or reference to seglen bytes. We
  37697. * can use PBUF_RAW here since the data appears in the middle of
  37698. * a segment. A header will never be prepended. */
  37699. if (apiflags & TCP_WRITE_FLAG_COPY) {
  37700. 802cf78: 07cb lsls r3, r1, #31
  37701. * We don't extend segments containing SYN/FIN flags or options
  37702. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  37703. * the end.
  37704. */
  37705. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  37706. u16_t seglen = space < len - pos ? space : len - pos;
  37707. 802cf7a: fa1f f88a uxth.w r8, sl
  37708. seg = last_unsent;
  37709. /* Create a pbuf with a copy or reference to seglen bytes. We
  37710. * can use PBUF_RAW here since the data appears in the middle of
  37711. * a segment. A header will never be prepended. */
  37712. if (apiflags & TCP_WRITE_FLAG_COPY) {
  37713. 802cf7e: d514 bpl.n 802cfaa <tcp_write+0x108>
  37714. /* Data is copied */
  37715. if ((concat_p = tcp_pbuf_prealloc(PBUF_RAW, seglen, space, &oversize, pcb, apiflags, 1)) == NULL) {
  37716. 802cf80: 2301 movs r3, #1
  37717. 802cf82: 9101 str r1, [sp, #4]
  37718. 802cf84: 9302 str r3, [sp, #8]
  37719. 802cf86: 9400 str r4, [sp, #0]
  37720. 802cf88: 2003 movs r0, #3
  37721. 802cf8a: 4641 mov r1, r8
  37722. 802cf8c: f10d 0336 add.w r3, sp, #54 ; 0x36
  37723. 802cf90: f7ff fedc bl 802cd4c <tcp_pbuf_prealloc>
  37724. 802cf94: 4607 mov r7, r0
  37725. 802cf96: 2800 cmp r0, #0
  37726. 802cf98: f000 80e9 beq.w 802d16e <tcp_write+0x2cc>
  37727. goto memerr;
  37728. }
  37729. #if TCP_OVERSIZE_DBGCHECK
  37730. last_unsent->oversize_left += oversize;
  37731. #endif /* TCP_OVERSIZE_DBGCHECK */
  37732. TCP_DATA_COPY2(concat_p->payload, (u8_t*)arg + pos, seglen, &concat_chksum, &concat_chksum_swapped);
  37733. 802cf9c: 9a06 ldr r2, [sp, #24]
  37734. 802cf9e: 6840 ldr r0, [r0, #4]
  37735. 802cfa0: 1951 adds r1, r2, r5
  37736. 802cfa2: 4642 mov r2, r8
  37737. 802cfa4: f7f4 fb4e bl 8021644 <memcpy>
  37738. 802cfa8: e00b b.n 802cfc2 <tcp_write+0x120>
  37739. #if TCP_CHECKSUM_ON_COPY
  37740. concat_chksummed += seglen;
  37741. #endif /* TCP_CHECKSUM_ON_COPY */
  37742. } else {
  37743. /* Data is not copied */
  37744. if ((concat_p = pbuf_alloc(PBUF_RAW, seglen, PBUF_ROM)) == NULL) {
  37745. 802cfaa: 2003 movs r0, #3
  37746. 802cfac: 4641 mov r1, r8
  37747. 802cfae: 2201 movs r2, #1
  37748. 802cfb0: f7fe f99b bl 802b2ea <pbuf_alloc>
  37749. 802cfb4: 4607 mov r7, r0
  37750. 802cfb6: 2800 cmp r0, #0
  37751. 802cfb8: f000 80d9 beq.w 802d16e <tcp_write+0x2cc>
  37752. tcp_seg_add_chksum(~inet_chksum((u8_t*)arg + pos, seglen), seglen,
  37753. &concat_chksum, &concat_chksum_swapped);
  37754. concat_chksummed += seglen;
  37755. #endif /* TCP_CHECKSUM_ON_COPY */
  37756. /* reference the non-volatile payload data */
  37757. concat_p->payload = (u8_t*)arg + pos;
  37758. 802cfbc: 9806 ldr r0, [sp, #24]
  37759. 802cfbe: 1943 adds r3, r0, r5
  37760. 802cfc0: 607b str r3, [r7, #4]
  37761. }
  37762. pos += seglen;
  37763. queuelen += pbuf_clen(concat_p);
  37764. 802cfc2: 4638 mov r0, r7
  37765. 802cfc4: f7fe fa18 bl 802b3f8 <pbuf_clen>
  37766. #endif /* TCP_CHECKSUM_ON_COPY */
  37767. /* reference the non-volatile payload data */
  37768. concat_p->payload = (u8_t*)arg + pos;
  37769. }
  37770. pos += seglen;
  37771. 802cfc8: 44a8 add r8, r5
  37772. 802cfca: fa1f f888 uxth.w r8, r8
  37773. queuelen += pbuf_clen(concat_p);
  37774. 802cfce: 4458 add r0, fp
  37775. 802cfd0: 46aa mov sl, r5
  37776. 802cfd2: fa1f fb80 uxth.w fp, r0
  37777. #endif /* TCP_CHECKSUM_ON_COPY */
  37778. /* reference the non-volatile payload data */
  37779. concat_p->payload = (u8_t*)arg + pos;
  37780. }
  37781. pos += seglen;
  37782. 802cfd6: 4645 mov r5, r8
  37783. queuelen += pbuf_clen(concat_p);
  37784. 802cfd8: 4633 mov r3, r6
  37785. 802cfda: e007 b.n 802cfec <tcp_write+0x14a>
  37786. u16_t queuelen;
  37787. u8_t optlen = 0;
  37788. u8_t optflags = 0;
  37789. #if TCP_OVERSIZE
  37790. u16_t oversize = 0;
  37791. u16_t oversize_used = 0;
  37792. 802cfdc: 46b2 mov sl, r6
  37793. err_t
  37794. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  37795. {
  37796. struct pbuf *concat_p = NULL;
  37797. struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
  37798. u16_t pos = 0; /* position in 'arg' data */
  37799. 802cfde: 4635 mov r5, r6
  37800. */
  37801. err_t
  37802. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  37803. {
  37804. struct pbuf *concat_p = NULL;
  37805. struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
  37806. 802cfe0: 4633 mov r3, r6
  37807. 802cfe2: e000 b.n 802cfe6 <tcp_write+0x144>
  37808. *
  37809. * We don't extend segments containing SYN/FIN flags or options
  37810. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  37811. * the end.
  37812. */
  37813. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  37814. 802cfe4: 46aa mov sl, r5
  37815. * @return ERR_OK if enqueued, another err_t on error
  37816. */
  37817. err_t
  37818. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  37819. {
  37820. struct pbuf *concat_p = NULL;
  37821. 802cfe6: 2700 movs r7, #0
  37822. 802cfe8: e000 b.n 802cfec <tcp_write+0x14a>
  37823. *
  37824. * We don't extend segments containing SYN/FIN flags or options
  37825. * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at
  37826. * the end.
  37827. */
  37828. if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
  37829. 802cfea: 46aa mov sl, r5
  37830. #if TCP_CHECKSUM_ON_COPY
  37831. u16_t chksum = 0;
  37832. u8_t chksum_swapped = 0;
  37833. #endif /* TCP_CHECKSUM_ON_COPY */
  37834. if (apiflags & TCP_WRITE_FLAG_COPY) {
  37835. 802cfec: 9907 ldr r1, [sp, #28]
  37836. seg->chksum_swapped = chksum_swapped;
  37837. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  37838. #endif /* TCP_CHECKSUM_ON_COPY */
  37839. /* first segment of to-be-queued data? */
  37840. if (queue == NULL) {
  37841. 802cfee: f04f 0800 mov.w r8, #0
  37842. #if TCP_CHECKSUM_ON_COPY
  37843. u16_t chksum = 0;
  37844. u8_t chksum_swapped = 0;
  37845. #endif /* TCP_CHECKSUM_ON_COPY */
  37846. if (apiflags & TCP_WRITE_FLAG_COPY) {
  37847. 802cff2: f001 0101 and.w r1, r1, #1
  37848. seg->chksum_swapped = chksum_swapped;
  37849. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  37850. #endif /* TCP_CHECKSUM_ON_COPY */
  37851. /* first segment of to-be-queued data? */
  37852. if (queue == NULL) {
  37853. 802cff6: f8cd 802c str.w r8, [sp, #44] ; 0x2c
  37854. #if TCP_CHECKSUM_ON_COPY
  37855. u16_t chksum = 0;
  37856. u8_t chksum_swapped = 0;
  37857. #endif /* TCP_CHECKSUM_ON_COPY */
  37858. if (apiflags & TCP_WRITE_FLAG_COPY) {
  37859. 802cffa: 9108 str r1, [sp, #32]
  37860. 802cffc: e068 b.n 802d0d0 <tcp_write+0x22e>
  37861. * The new segments are chained together in the local 'queue'
  37862. * variable, ready to be appended to pcb->unsent.
  37863. */
  37864. while (pos < len) {
  37865. struct pbuf *p;
  37866. u16_t left = len - pos;
  37867. 802cffe: ebc5 0309 rsb r3, r5, r9
  37868. u16_t max_len = mss_local - optlen;
  37869. u16_t seglen = left > max_len ? max_len : left;
  37870. 802d002: 9a0a ldr r2, [sp, #40] ; 0x28
  37871. 802d004: b29b uxth r3, r3
  37872. 802d006: 4293 cmp r3, r2
  37873. 802d008: bf38 it cc
  37874. 802d00a: 461a movcc r2, r3
  37875. #if TCP_CHECKSUM_ON_COPY
  37876. u16_t chksum = 0;
  37877. u8_t chksum_swapped = 0;
  37878. #endif /* TCP_CHECKSUM_ON_COPY */
  37879. if (apiflags & TCP_WRITE_FLAG_COPY) {
  37880. 802d00c: 9b08 ldr r3, [sp, #32]
  37881. */
  37882. while (pos < len) {
  37883. struct pbuf *p;
  37884. u16_t left = len - pos;
  37885. u16_t max_len = mss_local - optlen;
  37886. u16_t seglen = left > max_len ? max_len : left;
  37887. 802d00e: 9209 str r2, [sp, #36] ; 0x24
  37888. #if TCP_CHECKSUM_ON_COPY
  37889. u16_t chksum = 0;
  37890. u8_t chksum_swapped = 0;
  37891. #endif /* TCP_CHECKSUM_ON_COPY */
  37892. if (apiflags & TCP_WRITE_FLAG_COPY) {
  37893. 802d010: b1db cbz r3, 802d04a <tcp_write+0x1a8>
  37894. /* If copy is set, memory should be allocated and data copied
  37895. * into pbuf */
  37896. if ((p = tcp_pbuf_prealloc(PBUF_TRANSPORT, seglen + optlen, mss_local, &oversize, pcb, apiflags, queue == NULL)) == NULL) {
  37897. 802d012: f1d8 0301 rsbs r3, r8, #1
  37898. 802d016: 9807 ldr r0, [sp, #28]
  37899. 802d018: 9400 str r4, [sp, #0]
  37900. 802d01a: bf38 it cc
  37901. 802d01c: 2300 movcc r3, #0
  37902. 802d01e: 9001 str r0, [sp, #4]
  37903. 802d020: 9302 str r3, [sp, #8]
  37904. 802d022: 4611 mov r1, r2
  37905. 802d024: 2000 movs r0, #0
  37906. 802d026: 9a0a ldr r2, [sp, #40] ; 0x28
  37907. 802d028: f10d 0336 add.w r3, sp, #54 ; 0x36
  37908. 802d02c: f7ff fe8e bl 802cd4c <tcp_pbuf_prealloc>
  37909. 802d030: 4684 mov ip, r0
  37910. 802d032: 2800 cmp r0, #0
  37911. 802d034: f000 809e beq.w 802d174 <tcp_write+0x2d2>
  37912. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n", seglen));
  37913. goto memerr;
  37914. }
  37915. LWIP_ASSERT("tcp_write: check that first pbuf can hold the complete seglen",
  37916. (p->len >= seglen));
  37917. TCP_DATA_COPY2((char *)p->payload + optlen, (u8_t*)arg + pos, seglen, &chksum, &chksum_swapped);
  37918. 802d038: 9a06 ldr r2, [sp, #24]
  37919. 802d03a: 6840 ldr r0, [r0, #4]
  37920. 802d03c: f8cd c014 str.w ip, [sp, #20]
  37921. 802d040: 1951 adds r1, r2, r5
  37922. 802d042: 9a09 ldr r2, [sp, #36] ; 0x24
  37923. 802d044: f7f4 fafe bl 8021644 <memcpy>
  37924. 802d048: e019 b.n 802d07e <tcp_write+0x1dc>
  37925. */
  37926. struct pbuf *p2;
  37927. #if TCP_OVERSIZE
  37928. LWIP_ASSERT("oversize == 0", oversize == 0);
  37929. #endif /* TCP_OVERSIZE */
  37930. if ((p2 = pbuf_alloc(PBUF_TRANSPORT, seglen, PBUF_ROM)) == NULL) {
  37931. 802d04a: 9808 ldr r0, [sp, #32]
  37932. 802d04c: 9909 ldr r1, [sp, #36] ; 0x24
  37933. 802d04e: 2201 movs r2, #1
  37934. 802d050: f7fe f94b bl 802b2ea <pbuf_alloc>
  37935. 802d054: 4603 mov r3, r0
  37936. 802d056: 2800 cmp r0, #0
  37937. 802d058: f000 808c beq.w 802d174 <tcp_write+0x2d2>
  37938. #if TCP_CHECKSUM_ON_COPY
  37939. /* calculate the checksum of nocopy-data */
  37940. chksum = ~inet_chksum((u8_t*)arg + pos, seglen);
  37941. #endif /* TCP_CHECKSUM_ON_COPY */
  37942. /* reference the non-volatile payload data */
  37943. p2->payload = (u8_t*)arg + pos;
  37944. 802d05c: 9806 ldr r0, [sp, #24]
  37945. 802d05e: 1942 adds r2, r0, r5
  37946. /* Second, allocate a pbuf for the headers. */
  37947. if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
  37948. 802d060: 9808 ldr r0, [sp, #32]
  37949. #if TCP_CHECKSUM_ON_COPY
  37950. /* calculate the checksum of nocopy-data */
  37951. chksum = ~inet_chksum((u8_t*)arg + pos, seglen);
  37952. #endif /* TCP_CHECKSUM_ON_COPY */
  37953. /* reference the non-volatile payload data */
  37954. p2->payload = (u8_t*)arg + pos;
  37955. 802d062: 605a str r2, [r3, #4]
  37956. /* Second, allocate a pbuf for the headers. */
  37957. if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
  37958. 802d064: 4601 mov r1, r0
  37959. 802d066: 4602 mov r2, r0
  37960. 802d068: 9305 str r3, [sp, #20]
  37961. 802d06a: f7fe f93e bl 802b2ea <pbuf_alloc>
  37962. 802d06e: 9b05 ldr r3, [sp, #20]
  37963. 802d070: b908 cbnz r0, 802d076 <tcp_write+0x1d4>
  37964. /* If allocation fails, we have to deallocate the data pbuf as
  37965. * well. */
  37966. pbuf_free(p2);
  37967. 802d072: 4618 mov r0, r3
  37968. 802d074: e013 b.n 802d09e <tcp_write+0x1fc>
  37969. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write: could not allocate memory for header pbuf\n"));
  37970. goto memerr;
  37971. }
  37972. /* Concatenate the headers and data pbufs together. */
  37973. pbuf_cat(p/*header*/, p2/*data*/);
  37974. 802d076: 4619 mov r1, r3
  37975. 802d078: 9005 str r0, [sp, #20]
  37976. 802d07a: f7fe f9d3 bl 802b424 <pbuf_cat>
  37977. 802d07e: f8dd c014 ldr.w ip, [sp, #20]
  37978. }
  37979. queuelen += pbuf_clen(p);
  37980. 802d082: 4660 mov r0, ip
  37981. 802d084: f8cd c014 str.w ip, [sp, #20]
  37982. 802d088: f7fe f9b6 bl 802b3f8 <pbuf_clen>
  37983. 802d08c: 4458 add r0, fp
  37984. 802d08e: fa1f fb80 uxth.w fp, r0
  37985. /* Now that there are more segments queued, we check again if the
  37986. * length of the queue exceeds the configured maximum or
  37987. * overflows. */
  37988. if ((queuelen > TCP_SND_QUEUELEN) || (queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
  37989. 802d092: f1bb 0f48 cmp.w fp, #72 ; 0x48
  37990. 802d096: f8dd c014 ldr.w ip, [sp, #20]
  37991. 802d09a: d903 bls.n 802d0a4 <tcp_write+0x202>
  37992. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write: queue too long %"U16_F" (%"U16_F")\n", queuelen, TCP_SND_QUEUELEN));
  37993. pbuf_free(p);
  37994. 802d09c: 4660 mov r0, ip
  37995. 802d09e: f7fe f8d7 bl 802b250 <pbuf_free>
  37996. goto memerr;
  37997. 802d0a2: e067 b.n 802d174 <tcp_write+0x2d2>
  37998. }
  37999. if ((seg = tcp_create_segment(pcb, p, 0, pcb->snd_lbb + pos, optflags)) == NULL) {
  38000. 802d0a4: 6de3 ldr r3, [r4, #92] ; 0x5c
  38001. 802d0a6: 2200 movs r2, #0
  38002. 802d0a8: 18eb adds r3, r5, r3
  38003. 802d0aa: 9200 str r2, [sp, #0]
  38004. 802d0ac: 4620 mov r0, r4
  38005. 802d0ae: 4661 mov r1, ip
  38006. 802d0b0: f7ff fe78 bl 802cda4 <tcp_create_segment>
  38007. 802d0b4: 4603 mov r3, r0
  38008. 802d0b6: 2800 cmp r0, #0
  38009. 802d0b8: d05c beq.n 802d174 <tcp_write+0x2d2>
  38010. seg->chksum_swapped = chksum_swapped;
  38011. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  38012. #endif /* TCP_CHECKSUM_ON_COPY */
  38013. /* first segment of to-be-queued data? */
  38014. if (queue == NULL) {
  38015. 802d0ba: f1b8 0f00 cmp.w r8, #0
  38016. 802d0be: d002 beq.n 802d0c6 <tcp_write+0x224>
  38017. queue = seg;
  38018. } else {
  38019. /* Attach the segment to the end of the queued segments */
  38020. LWIP_ASSERT("prev_seg != NULL", prev_seg != NULL);
  38021. prev_seg->next = seg;
  38022. 802d0c0: 990b ldr r1, [sp, #44] ; 0x2c
  38023. 802d0c2: 6008 str r0, [r1, #0]
  38024. 802d0c4: e000 b.n 802d0c8 <tcp_write+0x226>
  38025. seg->chksum_swapped = chksum_swapped;
  38026. seg->flags |= TF_SEG_DATA_CHECKSUMMED;
  38027. #endif /* TCP_CHECKSUM_ON_COPY */
  38028. /* first segment of to-be-queued data? */
  38029. if (queue == NULL) {
  38030. 802d0c6: 4680 mov r8, r0
  38031. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, ("tcp_write: queueing %"U32_F":%"U32_F"\n",
  38032. ntohl(seg->tcphdr->seqno),
  38033. ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg)));
  38034. pos += seglen;
  38035. 802d0c8: 9a09 ldr r2, [sp, #36] ; 0x24
  38036. 802d0ca: 930b str r3, [sp, #44] ; 0x2c
  38037. 802d0cc: 1955 adds r5, r2, r5
  38038. 802d0ce: b2ad uxth r5, r5
  38039. * Phase 3: Create new segments.
  38040. *
  38041. * The new segments are chained together in the local 'queue'
  38042. * variable, ready to be appended to pcb->unsent.
  38043. */
  38044. while (pos < len) {
  38045. 802d0d0: 454d cmp r5, r9
  38046. 802d0d2: d394 bcc.n 802cffe <tcp_write+0x15c>
  38047. /*
  38048. * Phase 1: If data has been added to the preallocated tail of
  38049. * last_unsent, we update the length fields of the pbuf chain.
  38050. */
  38051. #if TCP_OVERSIZE
  38052. if (oversize_used > 0) {
  38053. 802d0d4: f1ba 0f00 cmp.w sl, #0
  38054. 802d0d8: d019 beq.n 802d10e <tcp_write+0x26c>
  38055. struct pbuf *p;
  38056. /* Bump tot_len of whole chain, len of tail */
  38057. for (p = last_unsent->p; p; p = p->next) {
  38058. 802d0da: 6875 ldr r5, [r6, #4]
  38059. 802d0dc: e011 b.n 802d102 <tcp_write+0x260>
  38060. p->tot_len += oversize_used;
  38061. 802d0de: 892a ldrh r2, [r5, #8]
  38062. 802d0e0: 4452 add r2, sl
  38063. 802d0e2: 812a strh r2, [r5, #8]
  38064. if (p->next == NULL) {
  38065. 802d0e4: 682a ldr r2, [r5, #0]
  38066. 802d0e6: b95a cbnz r2, 802d100 <tcp_write+0x25e>
  38067. TCP_DATA_COPY((char *)p->payload + p->len, arg, oversize_used, last_unsent);
  38068. 802d0e8: 686a ldr r2, [r5, #4]
  38069. 802d0ea: 8968 ldrh r0, [r5, #10]
  38070. 802d0ec: 9906 ldr r1, [sp, #24]
  38071. 802d0ee: 9305 str r3, [sp, #20]
  38072. 802d0f0: 1810 adds r0, r2, r0
  38073. 802d0f2: 4652 mov r2, sl
  38074. 802d0f4: f7f4 faa6 bl 8021644 <memcpy>
  38075. p->len += oversize_used;
  38076. 802d0f8: 896a ldrh r2, [r5, #10]
  38077. 802d0fa: 9b05 ldr r3, [sp, #20]
  38078. 802d0fc: 4452 add r2, sl
  38079. 802d0fe: 816a strh r2, [r5, #10]
  38080. */
  38081. #if TCP_OVERSIZE
  38082. if (oversize_used > 0) {
  38083. struct pbuf *p;
  38084. /* Bump tot_len of whole chain, len of tail */
  38085. for (p = last_unsent->p; p; p = p->next) {
  38086. 802d100: 682d ldr r5, [r5, #0]
  38087. 802d102: 2d00 cmp r5, #0
  38088. 802d104: d1eb bne.n 802d0de <tcp_write+0x23c>
  38089. if (p->next == NULL) {
  38090. TCP_DATA_COPY((char *)p->payload + p->len, arg, oversize_used, last_unsent);
  38091. p->len += oversize_used;
  38092. }
  38093. }
  38094. last_unsent->len += oversize_used;
  38095. 802d106: 8932 ldrh r2, [r6, #8]
  38096. 802d108: 4492 add sl, r2
  38097. 802d10a: f8a6 a008 strh.w sl, [r6, #8]
  38098. LWIP_ASSERT("last_unsent->oversize_left >= oversize_used",
  38099. last_unsent->oversize_left >= oversize_used);
  38100. last_unsent->oversize_left -= oversize_used;
  38101. #endif /* TCP_OVERSIZE_DBGCHECK */
  38102. }
  38103. pcb->unsent_oversize = oversize;
  38104. 802d10e: f8bd 2036 ldrh.w r2, [sp, #54] ; 0x36
  38105. 802d112: f8a4 206a strh.w r2, [r4, #106] ; 0x6a
  38106. #endif /* TCP_OVERSIZE */
  38107. /*
  38108. * Phase 2: concat_p can be concatenated onto last_unsent->p
  38109. */
  38110. if (concat_p != NULL) {
  38111. 802d116: b157 cbz r7, 802d12e <tcp_write+0x28c>
  38112. LWIP_ASSERT("tcp_write: cannot concatenate when pcb->unsent is empty",
  38113. (last_unsent != NULL));
  38114. pbuf_cat(last_unsent->p, concat_p);
  38115. 802d118: 6870 ldr r0, [r6, #4]
  38116. 802d11a: 9305 str r3, [sp, #20]
  38117. 802d11c: 4639 mov r1, r7
  38118. 802d11e: f7fe f981 bl 802b424 <pbuf_cat>
  38119. last_unsent->len += concat_p->tot_len;
  38120. 802d122: 8939 ldrh r1, [r7, #8]
  38121. 802d124: 8932 ldrh r2, [r6, #8]
  38122. 802d126: 9b05 ldr r3, [sp, #20]
  38123. 802d128: 188a adds r2, r1, r2
  38124. 802d12a: 8132 strh r2, [r6, #8]
  38125. 802d12c: e003 b.n 802d136 <tcp_write+0x294>
  38126. /*
  38127. * Phase 3: Append queue to pcb->unsent. Queue may be NULL, but that
  38128. * is harmless
  38129. */
  38130. if (last_unsent == NULL) {
  38131. 802d12e: b916 cbnz r6, 802d136 <tcp_write+0x294>
  38132. pcb->unsent = queue;
  38133. 802d130: f8c4 806c str.w r8, [r4, #108] ; 0x6c
  38134. 802d134: e001 b.n 802d13a <tcp_write+0x298>
  38135. } else {
  38136. last_unsent->next = queue;
  38137. 802d136: f8c6 8000 str.w r8, [r6]
  38138. }
  38139. /*
  38140. * Finally update the pcb state.
  38141. */
  38142. pcb->snd_lbb += len;
  38143. 802d13a: 6de2 ldr r2, [r4, #92] ; 0x5c
  38144. pcb->snd_buf -= len;
  38145. pcb->snd_queuelen = queuelen;
  38146. 802d13c: f8a4 b068 strh.w fp, [r4, #104] ; 0x68
  38147. }
  38148. /*
  38149. * Finally update the pcb state.
  38150. */
  38151. pcb->snd_lbb += len;
  38152. 802d140: 444a add r2, r9
  38153. 802d142: 65e2 str r2, [r4, #92] ; 0x5c
  38154. pcb->snd_buf -= len;
  38155. 802d144: f8b4 2066 ldrh.w r2, [r4, #102] ; 0x66
  38156. 802d148: ebc9 0902 rsb r9, r9, r2
  38157. 802d14c: f8a4 9066 strh.w r9, [r4, #102] ; 0x66
  38158. LWIP_ASSERT("tcp_write: valid queue length",
  38159. pcb->unacked != NULL || pcb->unsent != NULL);
  38160. }
  38161. /* Set the PSH flag in the last segment that we enqueued. */
  38162. if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE)==0)) {
  38163. 802d150: b333 cbz r3, 802d1a0 <tcp_write+0x2fe>
  38164. 802d152: 68dc ldr r4, [r3, #12]
  38165. 802d154: b30c cbz r4, 802d19a <tcp_write+0x2f8>
  38166. 802d156: 9b07 ldr r3, [sp, #28]
  38167. 802d158: f003 0502 and.w r5, r3, #2
  38168. 802d15c: b2ed uxtb r5, r5
  38169. 802d15e: b9e5 cbnz r5, 802d19a <tcp_write+0x2f8>
  38170. TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
  38171. 802d160: 2008 movs r0, #8
  38172. 802d162: 89a6 ldrh r6, [r4, #12]
  38173. 802d164: f7fc ff36 bl 8029fd4 <lwip_htons>
  38174. 802d168: 4330 orrs r0, r6
  38175. 802d16a: 81a0 strh r0, [r4, #12]
  38176. 802d16c: e015 b.n 802d19a <tcp_write+0x2f8>
  38177. */
  38178. err_t
  38179. tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
  38180. {
  38181. struct pbuf *concat_p = NULL;
  38182. struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;
  38183. 802d16e: f04f 0800 mov.w r8, #0
  38184. 802d172: 4647 mov r7, r8
  38185. TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
  38186. }
  38187. return ERR_OK;
  38188. memerr:
  38189. pcb->flags |= TF_NAGLEMEMERR;
  38190. 802d174: 7fa3 ldrb r3, [r4, #30]
  38191. 802d176: f063 037f orn r3, r3, #127 ; 0x7f
  38192. 802d17a: 77a3 strb r3, [r4, #30]
  38193. TCP_STATS_INC(tcp.memerr);
  38194. if (concat_p != NULL) {
  38195. 802d17c: b117 cbz r7, 802d184 <tcp_write+0x2e2>
  38196. pbuf_free(concat_p);
  38197. 802d17e: 4638 mov r0, r7
  38198. 802d180: f7fe f866 bl 802b250 <pbuf_free>
  38199. }
  38200. if (queue != NULL) {
  38201. 802d184: f1b8 0f00 cmp.w r8, #0
  38202. 802d188: d009 beq.n 802d19e <tcp_write+0x2fc>
  38203. tcp_segs_free(queue);
  38204. 802d18a: 4640 mov r0, r8
  38205. 802d18c: f7fe fb1b bl 802b7c6 <tcp_segs_free>
  38206. 802d190: e005 b.n 802d19e <tcp_write+0x2fc>
  38207. apiflags |= TCP_WRITE_FLAG_COPY;
  38208. #endif /* LWIP_NETIF_TX_SINGLE_PBUF */
  38209. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n",
  38210. (void *)pcb, arg, len, (u16_t)apiflags));
  38211. LWIP_ERROR("tcp_write: arg == NULL (programmer violates API)",
  38212. 802d192: 23f2 movs r3, #242 ; 0xf2
  38213. 802d194: e004 b.n 802d1a0 <tcp_write+0x2fe>
  38214. if ((pcb->state != ESTABLISHED) &&
  38215. (pcb->state != CLOSE_WAIT) &&
  38216. (pcb->state != SYN_SENT) &&
  38217. (pcb->state != SYN_RCVD)) {
  38218. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, ("tcp_write() called in invalid state\n"));
  38219. return ERR_CONN;
  38220. 802d196: 23f3 movs r3, #243 ; 0xf3
  38221. 802d198: e002 b.n 802d1a0 <tcp_write+0x2fe>
  38222. /* Set the PSH flag in the last segment that we enqueued. */
  38223. if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE)==0)) {
  38224. TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
  38225. }
  38226. return ERR_OK;
  38227. 802d19a: 2300 movs r3, #0
  38228. 802d19c: e000 b.n 802d1a0 <tcp_write+0x2fe>
  38229. if (pcb->snd_queuelen != 0) {
  38230. LWIP_ASSERT("tcp_write: valid queue length", pcb->unacked != NULL ||
  38231. pcb->unsent != NULL);
  38232. }
  38233. LWIP_DEBUGF(TCP_QLEN_DEBUG | LWIP_DBG_STATE, ("tcp_write: %"S16_F" (with mem err)\n", pcb->snd_queuelen));
  38234. return ERR_MEM;
  38235. 802d19e: 23ff movs r3, #255 ; 0xff
  38236. 802d1a0: b258 sxtb r0, r3
  38237. }
  38238. 802d1a2: b00f add sp, #60 ; 0x3c
  38239. 802d1a4: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  38240. 0802d1a8 <tcp_enqueue_flags>:
  38241. LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)",
  38242. (flags & (TCP_SYN | TCP_FIN)) != 0);
  38243. /* check for configured max queuelen and possible overflow */
  38244. if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
  38245. 802d1a8: f8b0 3068 ldrh.w r3, [r0, #104] ; 0x68
  38246. 802d1ac: 2b47 cmp r3, #71 ; 0x47
  38247. * @param optdata pointer to TCP options, or NULL.
  38248. * @param optlen length of TCP options in bytes.
  38249. */
  38250. err_t
  38251. tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags)
  38252. {
  38253. 802d1ae: b573 push {r0, r1, r4, r5, r6, lr}
  38254. 802d1b0: 4604 mov r4, r0
  38255. 802d1b2: 460d mov r5, r1
  38256. LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)",
  38257. (flags & (TCP_SYN | TCP_FIN)) != 0);
  38258. /* check for configured max queuelen and possible overflow */
  38259. if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
  38260. 802d1b4: d900 bls.n 802d1b8 <tcp_enqueue_flags+0x10>
  38261. 802d1b6: e014 b.n 802d1e2 <tcp_enqueue_flags+0x3a>
  38262. /* tcp_enqueue_flags is always called with either SYN or FIN in flags.
  38263. * We need one available snd_buf byte to do that.
  38264. * This means we can't send FIN while snd_buf==0. A better fix would be to
  38265. * not include SYN and FIN sequence numbers in the snd_buf count. */
  38266. if (pcb->snd_buf == 0) {
  38267. 802d1b8: f8b0 3066 ldrh.w r3, [r0, #102] ; 0x66
  38268. err_t
  38269. tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags)
  38270. {
  38271. struct pbuf *p;
  38272. struct tcp_seg *seg;
  38273. u8_t optflags = 0;
  38274. 802d1bc: f3c1 0640 ubfx r6, r1, #1, #1
  38275. #if LWIP_TCP_TIMESTAMPS
  38276. if ((pcb->flags & TF_TIMESTAMP)) {
  38277. optflags |= TF_SEG_OPTS_TS;
  38278. }
  38279. #endif /* LWIP_TCP_TIMESTAMPS */
  38280. optlen = LWIP_TCP_OPT_LENGTH(optflags);
  38281. 802d1c0: 00b1 lsls r1, r6, #2
  38282. /* tcp_enqueue_flags is always called with either SYN or FIN in flags.
  38283. * We need one available snd_buf byte to do that.
  38284. * This means we can't send FIN while snd_buf==0. A better fix would be to
  38285. * not include SYN and FIN sequence numbers in the snd_buf count. */
  38286. if (pcb->snd_buf == 0) {
  38287. 802d1c2: 2b00 cmp r3, #0
  38288. 802d1c4: d038 beq.n 802d238 <tcp_enqueue_flags+0x90>
  38289. TCP_STATS_INC(tcp.memerr);
  38290. return ERR_MEM;
  38291. }
  38292. /* Allocate pbuf with room for TCP header + options */
  38293. if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
  38294. 802d1c6: 2000 movs r0, #0
  38295. 802d1c8: 4602 mov r2, r0
  38296. 802d1ca: f7fe f88e bl 802b2ea <pbuf_alloc>
  38297. 802d1ce: 4601 mov r1, r0
  38298. 802d1d0: b900 cbnz r0, 802d1d4 <tcp_enqueue_flags+0x2c>
  38299. 802d1d2: e006 b.n 802d1e2 <tcp_enqueue_flags+0x3a>
  38300. }
  38301. LWIP_ASSERT("tcp_enqueue_flags: check that first pbuf can hold optlen",
  38302. (p->len >= optlen));
  38303. /* Allocate memory for tcp_seg, and fill in fields. */
  38304. if ((seg = tcp_create_segment(pcb, p, flags, pcb->snd_lbb, optflags)) == NULL) {
  38305. 802d1d4: 9600 str r6, [sp, #0]
  38306. 802d1d6: 4620 mov r0, r4
  38307. 802d1d8: 462a mov r2, r5
  38308. 802d1da: 6de3 ldr r3, [r4, #92] ; 0x5c
  38309. 802d1dc: f7ff fde2 bl 802cda4 <tcp_create_segment>
  38310. 802d1e0: b920 cbnz r0, 802d1ec <tcp_enqueue_flags+0x44>
  38311. pcb->flags |= TF_NAGLEMEMERR;
  38312. 802d1e2: 7fa3 ldrb r3, [r4, #30]
  38313. 802d1e4: f063 037f orn r3, r3, #127 ; 0x7f
  38314. 802d1e8: 77a3 strb r3, [r4, #30]
  38315. 802d1ea: e025 b.n 802d238 <tcp_enqueue_flags+0x90>
  38316. ntohl(seg->tcphdr->seqno),
  38317. ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg),
  38318. (u16_t)flags));
  38319. /* Now append seg to pcb->unsent queue */
  38320. if (pcb->unsent == NULL) {
  38321. 802d1ec: 6ee3 ldr r3, [r4, #108] ; 0x6c
  38322. 802d1ee: b913 cbnz r3, 802d1f6 <tcp_enqueue_flags+0x4e>
  38323. pcb->unsent = seg;
  38324. 802d1f0: 66e0 str r0, [r4, #108] ; 0x6c
  38325. 802d1f2: e004 b.n 802d1fe <tcp_enqueue_flags+0x56>
  38326. } else {
  38327. struct tcp_seg *useg;
  38328. for (useg = pcb->unsent; useg->next != NULL; useg = useg->next);
  38329. 802d1f4: 4613 mov r3, r2
  38330. 802d1f6: 681a ldr r2, [r3, #0]
  38331. 802d1f8: 2a00 cmp r2, #0
  38332. 802d1fa: d1fb bne.n 802d1f4 <tcp_enqueue_flags+0x4c>
  38333. useg->next = seg;
  38334. 802d1fc: 6018 str r0, [r3, #0]
  38335. }
  38336. #if TCP_OVERSIZE
  38337. /* The new unsent tail has no space */
  38338. pcb->unsent_oversize = 0;
  38339. 802d1fe: 2300 movs r3, #0
  38340. #endif /* TCP_OVERSIZE */
  38341. /* SYN and FIN bump the sequence number */
  38342. if ((flags & TCP_SYN) || (flags & TCP_FIN)) {
  38343. 802d200: 07a9 lsls r1, r5, #30
  38344. for (useg = pcb->unsent; useg->next != NULL; useg = useg->next);
  38345. useg->next = seg;
  38346. }
  38347. #if TCP_OVERSIZE
  38348. /* The new unsent tail has no space */
  38349. pcb->unsent_oversize = 0;
  38350. 802d202: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  38351. #endif /* TCP_OVERSIZE */
  38352. /* SYN and FIN bump the sequence number */
  38353. if ((flags & TCP_SYN) || (flags & TCP_FIN)) {
  38354. 802d206: d007 beq.n 802d218 <tcp_enqueue_flags+0x70>
  38355. pcb->snd_lbb++;
  38356. 802d208: 6de3 ldr r3, [r4, #92] ; 0x5c
  38357. 802d20a: 3301 adds r3, #1
  38358. 802d20c: 65e3 str r3, [r4, #92] ; 0x5c
  38359. /* optlen does not influence snd_buf */
  38360. pcb->snd_buf--;
  38361. 802d20e: f8b4 3066 ldrh.w r3, [r4, #102] ; 0x66
  38362. 802d212: 3b01 subs r3, #1
  38363. 802d214: f8a4 3066 strh.w r3, [r4, #102] ; 0x66
  38364. }
  38365. if (flags & TCP_FIN) {
  38366. 802d218: 07ea lsls r2, r5, #31
  38367. 802d21a: d503 bpl.n 802d224 <tcp_enqueue_flags+0x7c>
  38368. pcb->flags |= TF_FIN;
  38369. 802d21c: 7fa3 ldrb r3, [r4, #30]
  38370. 802d21e: f043 0320 orr.w r3, r3, #32
  38371. 802d222: 77a3 strb r3, [r4, #30]
  38372. }
  38373. /* update number of segments on the queues */
  38374. pcb->snd_queuelen += pbuf_clen(seg->p);
  38375. 802d224: 6840 ldr r0, [r0, #4]
  38376. 802d226: f8b4 5068 ldrh.w r5, [r4, #104] ; 0x68
  38377. 802d22a: f7fe f8e5 bl 802b3f8 <pbuf_clen>
  38378. 802d22e: 1940 adds r0, r0, r5
  38379. 802d230: f8a4 0068 strh.w r0, [r4, #104] ; 0x68
  38380. if (pcb->snd_queuelen != 0) {
  38381. LWIP_ASSERT("tcp_enqueue_flags: invalid queue length",
  38382. pcb->unacked != NULL || pcb->unsent != NULL);
  38383. }
  38384. return ERR_OK;
  38385. 802d234: 2000 movs r0, #0
  38386. 802d236: e000 b.n 802d23a <tcp_enqueue_flags+0x92>
  38387. * This means we can't send FIN while snd_buf==0. A better fix would be to
  38388. * not include SYN and FIN sequence numbers in the snd_buf count. */
  38389. if (pcb->snd_buf == 0) {
  38390. LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_enqueue_flags: no send buffer available\n"));
  38391. TCP_STATS_INC(tcp.memerr);
  38392. return ERR_MEM;
  38393. 802d238: 20ff movs r0, #255 ; 0xff
  38394. LWIP_ASSERT("tcp_enqueue_flags: invalid queue length",
  38395. pcb->unacked != NULL || pcb->unsent != NULL);
  38396. }
  38397. return ERR_OK;
  38398. }
  38399. 802d23a: b240 sxtb r0, r0
  38400. 802d23c: bd7c pop {r2, r3, r4, r5, r6, pc}
  38401. 0802d23e <tcp_send_fin>:
  38402. * @param pcb the tcp_pcb over which to send a segment
  38403. * @return ERR_OK if sent, another err_t otherwise
  38404. */
  38405. err_t
  38406. tcp_send_fin(struct tcp_pcb *pcb)
  38407. {
  38408. 802d23e: b5f8 push {r3, r4, r5, r6, r7, lr}
  38409. /* first, try to add the fin to the last unsent segment */
  38410. if (pcb->unsent != NULL) {
  38411. 802d240: 6ec4 ldr r4, [r0, #108] ; 0x6c
  38412. * @param pcb the tcp_pcb over which to send a segment
  38413. * @return ERR_OK if sent, another err_t otherwise
  38414. */
  38415. err_t
  38416. tcp_send_fin(struct tcp_pcb *pcb)
  38417. {
  38418. 802d242: 4605 mov r5, r0
  38419. /* first, try to add the fin to the last unsent segment */
  38420. if (pcb->unsent != NULL) {
  38421. 802d244: b90c cbnz r4, 802d24a <tcp_send_fin+0xc>
  38422. 802d246: e00a b.n 802d25e <tcp_send_fin+0x20>
  38423. struct tcp_seg *last_unsent;
  38424. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  38425. last_unsent = last_unsent->next);
  38426. 802d248: 461c mov r4, r3
  38427. tcp_send_fin(struct tcp_pcb *pcb)
  38428. {
  38429. /* first, try to add the fin to the last unsent segment */
  38430. if (pcb->unsent != NULL) {
  38431. struct tcp_seg *last_unsent;
  38432. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  38433. 802d24a: 6823 ldr r3, [r4, #0]
  38434. 802d24c: 2b00 cmp r3, #0
  38435. 802d24e: d1fb bne.n 802d248 <tcp_send_fin+0xa>
  38436. last_unsent = last_unsent->next);
  38437. if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) {
  38438. 802d250: 68e3 ldr r3, [r4, #12]
  38439. 802d252: 8998 ldrh r0, [r3, #12]
  38440. 802d254: f7fc fec3 bl 8029fde <lwip_ntohs>
  38441. 802d258: f010 0607 ands.w r6, r0, #7
  38442. 802d25c: d005 beq.n 802d26a <tcp_send_fin+0x2c>
  38443. pcb->flags |= TF_FIN;
  38444. return ERR_OK;
  38445. }
  38446. }
  38447. /* no data, no length, flags, copy=1, no optdata */
  38448. return tcp_enqueue_flags(pcb, TCP_FIN);
  38449. 802d25e: 4628 mov r0, r5
  38450. 802d260: 2101 movs r1, #1
  38451. }
  38452. 802d262: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr}
  38453. pcb->flags |= TF_FIN;
  38454. return ERR_OK;
  38455. }
  38456. }
  38457. /* no data, no length, flags, copy=1, no optdata */
  38458. return tcp_enqueue_flags(pcb, TCP_FIN);
  38459. 802d266: f7ff bf9f b.w 802d1a8 <tcp_enqueue_flags>
  38460. for (last_unsent = pcb->unsent; last_unsent->next != NULL;
  38461. last_unsent = last_unsent->next);
  38462. if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) {
  38463. /* no SYN/FIN/RST flag in the header, we can add the FIN flag */
  38464. TCPH_SET_FLAG(last_unsent->tcphdr, TCP_FIN);
  38465. 802d26a: 68e4 ldr r4, [r4, #12]
  38466. 802d26c: 2001 movs r0, #1
  38467. 802d26e: 89a7 ldrh r7, [r4, #12]
  38468. 802d270: f7fc feb0 bl 8029fd4 <lwip_htons>
  38469. 802d274: 4338 orrs r0, r7
  38470. 802d276: 81a0 strh r0, [r4, #12]
  38471. pcb->flags |= TF_FIN;
  38472. 802d278: 7fab ldrb r3, [r5, #30]
  38473. 802d27a: f043 0320 orr.w r3, r3, #32
  38474. 802d27e: 77ab strb r3, [r5, #30]
  38475. return ERR_OK;
  38476. }
  38477. }
  38478. /* no data, no length, flags, copy=1, no optdata */
  38479. return tcp_enqueue_flags(pcb, TCP_FIN);
  38480. }
  38481. 802d280: 4630 mov r0, r6
  38482. 802d282: bdf8 pop {r3, r4, r5, r6, r7, pc}
  38483. 0802d284 <tcp_send_empty_ack>:
  38484. *
  38485. * @param pcb Protocol control block for the TCP connection to send the ACK
  38486. */
  38487. err_t
  38488. tcp_send_empty_ack(struct tcp_pcb *pcb)
  38489. {
  38490. 802d284: b537 push {r0, r1, r2, r4, r5, lr}
  38491. 802d286: 4604 mov r4, r0
  38492. if (pcb->flags & TF_TIMESTAMP) {
  38493. optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS);
  38494. }
  38495. #endif
  38496. p = tcp_output_alloc_header(pcb, optlen, 0, htonl(pcb->snd_nxt));
  38497. 802d288: 6d00 ldr r0, [r0, #80] ; 0x50
  38498. 802d28a: f7fc fead bl 8029fe8 <lwip_htonl>
  38499. 802d28e: 2100 movs r1, #0
  38500. 802d290: 4602 mov r2, r0
  38501. 802d292: 4620 mov r0, r4
  38502. 802d294: f7ff fdd8 bl 802ce48 <tcp_output_alloc_header.constprop.0>
  38503. if (p == NULL) {
  38504. 802d298: 4605 mov r5, r0
  38505. 802d29a: b188 cbz r0, 802d2c0 <tcp_send_empty_ack+0x3c>
  38506. }
  38507. tcphdr = (struct tcp_hdr *)p->payload;
  38508. LWIP_DEBUGF(TCP_OUTPUT_DEBUG,
  38509. ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
  38510. /* remove ACK flags from the PCB, as we send an empty ACK now */
  38511. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  38512. 802d29c: 7fa3 ldrb r3, [r4, #30]
  38513. #endif
  38514. #if LWIP_NETIF_HWADDRHINT
  38515. ip_output_hinted(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  38516. IP_PROTO_TCP, &(pcb->addr_hint));
  38517. #else /* LWIP_NETIF_HWADDRHINT*/
  38518. ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  38519. 802d29e: 7a62 ldrb r2, [r4, #9]
  38520. }
  38521. tcphdr = (struct tcp_hdr *)p->payload;
  38522. LWIP_DEBUGF(TCP_OUTPUT_DEBUG,
  38523. ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
  38524. /* remove ACK flags from the PCB, as we send an empty ACK now */
  38525. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  38526. 802d2a0: f023 0303 bic.w r3, r3, #3
  38527. #endif
  38528. #if LWIP_NETIF_HWADDRHINT
  38529. ip_output_hinted(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  38530. IP_PROTO_TCP, &(pcb->addr_hint));
  38531. #else /* LWIP_NETIF_HWADDRHINT*/
  38532. ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  38533. 802d2a4: 9200 str r2, [sp, #0]
  38534. 802d2a6: 2206 movs r2, #6
  38535. }
  38536. tcphdr = (struct tcp_hdr *)p->payload;
  38537. LWIP_DEBUGF(TCP_OUTPUT_DEBUG,
  38538. ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
  38539. /* remove ACK flags from the PCB, as we send an empty ACK now */
  38540. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  38541. 802d2a8: 77a3 strb r3, [r4, #30]
  38542. #endif
  38543. #if LWIP_NETIF_HWADDRHINT
  38544. ip_output_hinted(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  38545. IP_PROTO_TCP, &(pcb->addr_hint));
  38546. #else /* LWIP_NETIF_HWADDRHINT*/
  38547. ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  38548. 802d2aa: 9201 str r2, [sp, #4]
  38549. 802d2ac: 7aa3 ldrb r3, [r4, #10]
  38550. 802d2ae: 4621 mov r1, r4
  38551. 802d2b0: 1d22 adds r2, r4, #4
  38552. 802d2b2: f001 f8ab bl 802e40c <ip_output>
  38553. IP_PROTO_TCP);
  38554. #endif /* LWIP_NETIF_HWADDRHINT*/
  38555. pbuf_free(p);
  38556. 802d2b6: 4628 mov r0, r5
  38557. 802d2b8: f7fd ffca bl 802b250 <pbuf_free>
  38558. return ERR_OK;
  38559. 802d2bc: 2000 movs r0, #0
  38560. 802d2be: e000 b.n 802d2c2 <tcp_send_empty_ack+0x3e>
  38561. #endif
  38562. p = tcp_output_alloc_header(pcb, optlen, 0, htonl(pcb->snd_nxt));
  38563. if (p == NULL) {
  38564. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n"));
  38565. return ERR_BUF;
  38566. 802d2c0: 20fe movs r0, #254 ; 0xfe
  38567. IP_PROTO_TCP);
  38568. #endif /* LWIP_NETIF_HWADDRHINT*/
  38569. pbuf_free(p);
  38570. return ERR_OK;
  38571. }
  38572. 802d2c2: b240 sxtb r0, r0
  38573. 802d2c4: bd3e pop {r1, r2, r3, r4, r5, pc}
  38574. 802d2c6: 0000 movs r0, r0
  38575. 0802d2c8 <tcp_output>:
  38576. /* First, check if we are invoked by the TCP input processing
  38577. code. If so, we do not output anything. Instead, we rely on the
  38578. input processing code to call us when input processing is done
  38579. with. */
  38580. if (tcp_input_pcb == pcb) {
  38581. 802d2c8: 4b8f ldr r3, [pc, #572] ; (802d508 <tcp_output+0x240>)
  38582. 802d2ca: 681b ldr r3, [r3, #0]
  38583. 802d2cc: 4283 cmp r3, r0
  38584. * @return ERR_OK if data has been sent or nothing to send
  38585. * another err_t on error
  38586. */
  38587. err_t
  38588. tcp_output(struct tcp_pcb *pcb)
  38589. {
  38590. 802d2ce: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  38591. 802d2d2: 4604 mov r4, r0
  38592. /* First, check if we are invoked by the TCP input processing
  38593. code. If so, we do not output anything. Instead, we rely on the
  38594. input processing code to call us when input processing is done
  38595. with. */
  38596. if (tcp_input_pcb == pcb) {
  38597. 802d2d4: f000 8113 beq.w 802d4fe <tcp_output+0x236>
  38598. return ERR_OK;
  38599. }
  38600. wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd);
  38601. 802d2d8: f8b0 304c ldrh.w r3, [r0, #76] ; 0x4c
  38602. 802d2dc: f8b0 9060 ldrh.w r9, [r0, #96] ; 0x60
  38603. seg = pcb->unsent;
  38604. 802d2e0: 6ec5 ldr r5, [r0, #108] ; 0x6c
  38605. with. */
  38606. if (tcp_input_pcb == pcb) {
  38607. return ERR_OK;
  38608. }
  38609. wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd);
  38610. 802d2e2: 4599 cmp r9, r3
  38611. 802d2e4: bf28 it cs
  38612. 802d2e6: 4699 movcs r9, r3
  38613. * because the ->unsent queue is empty or because the window does
  38614. * not allow it), construct an empty ACK segment and send it.
  38615. *
  38616. * If data is to be sent, we will just piggyback the ACK (see below).
  38617. */
  38618. if (pcb->flags & TF_ACK_NOW &&
  38619. 802d2e8: 7f83 ldrb r3, [r0, #30]
  38620. 802d2ea: f003 0302 and.w r3, r3, #2
  38621. 802d2ee: b2db uxtb r3, r3
  38622. 802d2f0: b183 cbz r3, 802d314 <tcp_output+0x4c>
  38623. 802d2f2: b92d cbnz r5, 802d300 <tcp_output+0x38>
  38624. (seg == NULL ||
  38625. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
  38626. return tcp_send_empty_ack(pcb);
  38627. 802d2f4: 4620 mov r0, r4
  38628. }
  38629. #endif /* TCP_OVERSIZE */
  38630. pcb->flags &= ~TF_NAGLEMEMERR;
  38631. return ERR_OK;
  38632. }
  38633. 802d2f6: b003 add sp, #12
  38634. 802d2f8: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  38635. * If data is to be sent, we will just piggyback the ACK (see below).
  38636. */
  38637. if (pcb->flags & TF_ACK_NOW &&
  38638. (seg == NULL ||
  38639. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
  38640. return tcp_send_empty_ack(pcb);
  38641. 802d2fc: f7ff bfc2 b.w 802d284 <tcp_send_empty_ack>
  38642. *
  38643. * If data is to be sent, we will just piggyback the ACK (see below).
  38644. */
  38645. if (pcb->flags & TF_ACK_NOW &&
  38646. (seg == NULL ||
  38647. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
  38648. 802d300: 68eb ldr r3, [r5, #12]
  38649. 802d302: 6858 ldr r0, [r3, #4]
  38650. 802d304: f7fc fe72 bl 8029fec <lwip_ntohl>
  38651. 802d308: 892a ldrh r2, [r5, #8]
  38652. 802d30a: 6ca3 ldr r3, [r4, #72] ; 0x48
  38653. 802d30c: 1ad3 subs r3, r2, r3
  38654. 802d30e: 1818 adds r0, r3, r0
  38655. * not allow it), construct an empty ACK segment and send it.
  38656. *
  38657. * If data is to be sent, we will just piggyback the ACK (see below).
  38658. */
  38659. if (pcb->flags & TF_ACK_NOW &&
  38660. (seg == NULL ||
  38661. 802d310: 4548 cmp r0, r9
  38662. 802d312: d8ef bhi.n 802d2f4 <tcp_output+0x2c>
  38663. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
  38664. return tcp_send_empty_ack(pcb);
  38665. }
  38666. /* useg should point to last segment on unacked queue */
  38667. useg = pcb->unacked;
  38668. 802d314: 6f26 ldr r6, [r4, #112] ; 0x70
  38669. if (useg != NULL) {
  38670. 802d316: b90e cbnz r6, 802d31c <tcp_output+0x54>
  38671. 802d318: e0d1 b.n 802d4be <tcp_output+0x1f6>
  38672. for (; useg->next != NULL; useg = useg->next);
  38673. 802d31a: 461e mov r6, r3
  38674. 802d31c: 6833 ldr r3, [r6, #0]
  38675. 802d31e: 2b00 cmp r3, #0
  38676. 802d320: d1fb bne.n 802d31a <tcp_output+0x52>
  38677. 802d322: e0cc b.n 802d4be <tcp_output+0x1f6>
  38678. }
  38679. #endif /* TCP_CWND_DEBUG */
  38680. /* data available and window allows it to be sent? */
  38681. while (seg != NULL &&
  38682. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
  38683. LWIP_ASSERT("RST not expected here!",
  38684. 802d324: 68eb ldr r3, [r5, #12]
  38685. 802d326: 8998 ldrh r0, [r3, #12]
  38686. 802d328: f7fc fe59 bl 8029fde <lwip_ntohs>
  38687. * - if tcp_write had a memory error before (prevent delayed ACK timeout) or
  38688. * - if FIN was already enqueued for this PCB (SYN is always alone in a segment -
  38689. * either seg->next != NULL or pcb->unacked == NULL;
  38690. * RST is no sent using tcp_write/tcp_output.
  38691. */
  38692. if((tcp_do_output_nagle(pcb) == 0) &&
  38693. 802d32c: 6f23 ldr r3, [r4, #112] ; 0x70
  38694. 802d32e: b19b cbz r3, 802d358 <tcp_output+0x90>
  38695. 802d330: 7fa2 ldrb r2, [r4, #30]
  38696. 802d332: f012 0f44 tst.w r2, #68 ; 0x44
  38697. 802d336: d10f bne.n 802d358 <tcp_output+0x90>
  38698. 802d338: 6ee3 ldr r3, [r4, #108] ; 0x6c
  38699. 802d33a: b12b cbz r3, 802d348 <tcp_output+0x80>
  38700. 802d33c: 6819 ldr r1, [r3, #0]
  38701. 802d33e: b959 cbnz r1, 802d358 <tcp_output+0x90>
  38702. 802d340: 8919 ldrh r1, [r3, #8]
  38703. 802d342: 8ee3 ldrh r3, [r4, #54] ; 0x36
  38704. 802d344: 4299 cmp r1, r3
  38705. 802d346: d207 bcs.n 802d358 <tcp_output+0x90>
  38706. 802d348: f8b4 3066 ldrh.w r3, [r4, #102] ; 0x66
  38707. 802d34c: b123 cbz r3, 802d358 <tcp_output+0x90>
  38708. 802d34e: f8b4 3068 ldrh.w r3, [r4, #104] ; 0x68
  38709. 802d352: 2b47 cmp r3, #71 ; 0x47
  38710. 802d354: f240 80ce bls.w 802d4f4 <tcp_output+0x22c>
  38711. pcb->lastack,
  38712. ntohl(seg->tcphdr->seqno), pcb->lastack, i));
  38713. ++i;
  38714. #endif /* TCP_CWND_DEBUG */
  38715. pcb->unsent = seg->next;
  38716. 802d358: 682b ldr r3, [r5, #0]
  38717. 802d35a: 66e3 str r3, [r4, #108] ; 0x6c
  38718. if (pcb->state != SYN_SENT) {
  38719. 802d35c: 7e23 ldrb r3, [r4, #24]
  38720. 802d35e: 2b02 cmp r3, #2
  38721. 802d360: d00c beq.n 802d37c <tcp_output+0xb4>
  38722. TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
  38723. 802d362: 68ef ldr r7, [r5, #12]
  38724. 802d364: 2010 movs r0, #16
  38725. 802d366: f8b7 b00c ldrh.w fp, [r7, #12]
  38726. 802d36a: f7fc fe33 bl 8029fd4 <lwip_htons>
  38727. 802d36e: ea40 000b orr.w r0, r0, fp
  38728. 802d372: 81b8 strh r0, [r7, #12]
  38729. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  38730. 802d374: 7fa3 ldrb r3, [r4, #30]
  38731. 802d376: f023 0303 bic.w r3, r3, #3
  38732. 802d37a: 77a3 strb r3, [r4, #30]
  38733. u16_t len;
  38734. struct netif *netif;
  38735. u32_t *opts;
  38736. /** @bug Exclude retransmitted segments from this count. */
  38737. snmp_inc_tcpoutsegs();
  38738. 802d37c: f002 fd48 bl 802fe10 <snmp_inc_tcpoutsegs>
  38739. /* The TCP header has already been constructed, but the ackno and
  38740. wnd fields remain. */
  38741. seg->tcphdr->ackno = htonl(pcb->rcv_nxt);
  38742. 802d380: 6aa0 ldr r0, [r4, #40] ; 0x28
  38743. 802d382: 68ef ldr r7, [r5, #12]
  38744. 802d384: f7fc fe30 bl 8029fe8 <lwip_htonl>
  38745. 802d388: 60b8 str r0, [r7, #8]
  38746. /* advertise our receive window size in this TCP segment */
  38747. seg->tcphdr->wnd = htons(pcb->rcv_ann_wnd);
  38748. 802d38a: 8de0 ldrh r0, [r4, #46] ; 0x2e
  38749. 802d38c: 68ef ldr r7, [r5, #12]
  38750. 802d38e: f7fc fe21 bl 8029fd4 <lwip_htons>
  38751. 802d392: 81f8 strh r0, [r7, #14]
  38752. pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
  38753. 802d394: 8de2 ldrh r2, [r4, #46] ; 0x2e
  38754. 802d396: 6aa3 ldr r3, [r4, #40] ; 0x28
  38755. /* Add any requested options. NB MSS option is only set on SYN
  38756. packets, so ignore it here */
  38757. opts = (u32_t *)(void *)(seg->tcphdr + 1);
  38758. 802d398: 68ef ldr r7, [r5, #12]
  38759. seg->tcphdr->ackno = htonl(pcb->rcv_nxt);
  38760. /* advertise our receive window size in this TCP segment */
  38761. seg->tcphdr->wnd = htons(pcb->rcv_ann_wnd);
  38762. pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
  38763. 802d39a: 18d3 adds r3, r2, r3
  38764. 802d39c: 6323 str r3, [r4, #48] ; 0x30
  38765. /* Add any requested options. NB MSS option is only set on SYN
  38766. packets, so ignore it here */
  38767. opts = (u32_t *)(void *)(seg->tcphdr + 1);
  38768. if (seg->flags & TF_SEG_OPTS_MSS) {
  38769. 802d39e: 7aab ldrb r3, [r5, #10]
  38770. 802d3a0: 07d8 lsls r0, r3, #31
  38771. 802d3a2: d509 bpl.n 802d3b8 <tcp_output+0xf0>
  38772. u16_t mss;
  38773. #if TCP_CALCULATE_EFF_SEND_MSS
  38774. mss = tcp_eff_send_mss(TCP_MSS, &pcb->remote_ip);
  38775. 802d3a4: 4641 mov r1, r8
  38776. 802d3a6: f240 50b4 movw r0, #1460 ; 0x5b4
  38777. 802d3aa: f7fe fde4 bl 802bf76 <tcp_eff_send_mss>
  38778. #else /* TCP_CALCULATE_EFF_SEND_MSS */
  38779. mss = TCP_MSS;
  38780. #endif /* TCP_CALCULATE_EFF_SEND_MSS */
  38781. *opts = TCP_BUILD_MSS_OPTION(mss);
  38782. 802d3ae: f040 7001 orr.w r0, r0, #33816576 ; 0x2040000
  38783. 802d3b2: f7fc fe19 bl 8029fe8 <lwip_htonl>
  38784. 802d3b6: 6178 str r0, [r7, #20]
  38785. }
  38786. #endif
  38787. /* Set retransmission timer running if it is not currently enabled
  38788. This must be set before checking the route. */
  38789. if (pcb->rtime == -1) {
  38790. 802d3b8: f9b4 3034 ldrsh.w r3, [r4, #52] ; 0x34
  38791. 802d3bc: 3301 adds r3, #1
  38792. 802d3be: d101 bne.n 802d3c4 <tcp_output+0xfc>
  38793. pcb->rtime = 0;
  38794. 802d3c0: 2300 movs r3, #0
  38795. 802d3c2: 86a3 strh r3, [r4, #52] ; 0x34
  38796. }
  38797. /* If we don't have a local IP address, we get one by
  38798. calling ip_route(). */
  38799. if (ip_addr_isany(&(pcb->local_ip))) {
  38800. 802d3c4: 6823 ldr r3, [r4, #0]
  38801. 802d3c6: b92b cbnz r3, 802d3d4 <tcp_output+0x10c>
  38802. netif = ip_route(&(pcb->remote_ip));
  38803. 802d3c8: 4640 mov r0, r8
  38804. 802d3ca: f000 fecb bl 802e164 <ip_route>
  38805. if (netif == NULL) {
  38806. 802d3ce: b310 cbz r0, 802d416 <tcp_output+0x14e>
  38807. return;
  38808. }
  38809. ip_addr_copy(pcb->local_ip, netif->ip_addr);
  38810. 802d3d0: 6843 ldr r3, [r0, #4]
  38811. 802d3d2: 6023 str r3, [r4, #0]
  38812. }
  38813. if (pcb->rttest == 0) {
  38814. 802d3d4: 6ba3 ldr r3, [r4, #56] ; 0x38
  38815. 802d3d6: b93b cbnz r3, 802d3e8 <tcp_output+0x120>
  38816. pcb->rttest = tcp_ticks;
  38817. 802d3d8: f8da 3000 ldr.w r3, [sl]
  38818. 802d3dc: 63a3 str r3, [r4, #56] ; 0x38
  38819. pcb->rtseq = ntohl(seg->tcphdr->seqno);
  38820. 802d3de: 68eb ldr r3, [r5, #12]
  38821. 802d3e0: 6858 ldr r0, [r3, #4]
  38822. 802d3e2: f7fc fe03 bl 8029fec <lwip_ntohl>
  38823. 802d3e6: 63e0 str r0, [r4, #60] ; 0x3c
  38824. }
  38825. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n",
  38826. htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) +
  38827. seg->len));
  38828. len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload);
  38829. 802d3e8: 6868 ldr r0, [r5, #4]
  38830. 802d3ea: 68eb ldr r3, [r5, #12]
  38831. 802d3ec: 6842 ldr r2, [r0, #4]
  38832. seg->p->len -= len;
  38833. 802d3ee: 8941 ldrh r1, [r0, #10]
  38834. seg->p->tot_len -= len;
  38835. seg->p->payload = seg->tcphdr;
  38836. 802d3f0: 6043 str r3, [r0, #4]
  38837. }
  38838. LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n",
  38839. htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) +
  38840. seg->len));
  38841. len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload);
  38842. 802d3f2: 1a9a subs r2, r3, r2
  38843. seg->p->len -= len;
  38844. 802d3f4: 1a89 subs r1, r1, r2
  38845. 802d3f6: 8141 strh r1, [r0, #10]
  38846. seg->p->tot_len -= len;
  38847. 802d3f8: 8901 ldrh r1, [r0, #8]
  38848. 802d3fa: 1a8a subs r2, r1, r2
  38849. 802d3fc: 8102 strh r2, [r0, #8]
  38850. seg->p->payload = seg->tcphdr;
  38851. seg->tcphdr->chksum = 0;
  38852. 802d3fe: 2200 movs r2, #0
  38853. 802d400: 741a strb r2, [r3, #16]
  38854. 802d402: 745a strb r2, [r3, #17]
  38855. #if LWIP_NETIF_HWADDRHINT
  38856. ip_output_hinted(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  38857. IP_PROTO_TCP, &(pcb->addr_hint));
  38858. #else /* LWIP_NETIF_HWADDRHINT*/
  38859. ip_output(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
  38860. 802d404: 7a62 ldrb r2, [r4, #9]
  38861. 802d406: 7aa3 ldrb r3, [r4, #10]
  38862. 802d408: 9200 str r2, [sp, #0]
  38863. 802d40a: 2206 movs r2, #6
  38864. 802d40c: 9201 str r2, [sp, #4]
  38865. 802d40e: 4621 mov r1, r4
  38866. 802d410: 4642 mov r2, r8
  38867. 802d412: f000 fffb bl 802e40c <ip_output>
  38868. TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
  38869. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  38870. }
  38871. tcp_output_segment(seg, pcb);
  38872. snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
  38873. 802d416: 68eb ldr r3, [r5, #12]
  38874. 802d418: 6858 ldr r0, [r3, #4]
  38875. 802d41a: f7fc fde7 bl 8029fec <lwip_ntohl>
  38876. 802d41e: 68ea ldr r2, [r5, #12]
  38877. 802d420: f8b5 b008 ldrh.w fp, [r5, #8]
  38878. 802d424: 4607 mov r7, r0
  38879. 802d426: 8990 ldrh r0, [r2, #12]
  38880. 802d428: f7fc fdd9 bl 8029fde <lwip_ntohs>
  38881. 802d42c: f010 0003 ands.w r0, r0, #3
  38882. 802d430: bf18 it ne
  38883. 802d432: 2001 movne r0, #1
  38884. if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {
  38885. 802d434: 6d22 ldr r2, [r4, #80] ; 0x50
  38886. TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
  38887. pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  38888. }
  38889. tcp_output_segment(seg, pcb);
  38890. snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
  38891. 802d436: eb0b 0300 add.w r3, fp, r0
  38892. 802d43a: 19db adds r3, r3, r7
  38893. if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {
  38894. 802d43c: 1ad2 subs r2, r2, r3
  38895. 802d43e: 2a00 cmp r2, #0
  38896. pcb->snd_nxt = snd_nxt;
  38897. 802d440: bfb8 it lt
  38898. 802d442: 6523 strlt r3, [r4, #80] ; 0x50
  38899. }
  38900. /* put segment on unacknowledged list if length > 0 */
  38901. if (TCP_TCPLEN(seg) > 0) {
  38902. 802d444: 68eb ldr r3, [r5, #12]
  38903. 802d446: 892f ldrh r7, [r5, #8]
  38904. 802d448: 8998 ldrh r0, [r3, #12]
  38905. 802d44a: f7fc fdc8 bl 8029fde <lwip_ntohs>
  38906. 802d44e: f010 0003 ands.w r0, r0, #3
  38907. 802d452: bf18 it ne
  38908. 802d454: 2001 movne r0, #1
  38909. 802d456: 1838 adds r0, r7, r0
  38910. 802d458: b360 cbz r0, 802d4b4 <tcp_output+0x1ec>
  38911. seg->next = NULL;
  38912. 802d45a: 2300 movs r3, #0
  38913. 802d45c: 602b str r3, [r5, #0]
  38914. /* unacked list is empty? */
  38915. if (pcb->unacked == NULL) {
  38916. 802d45e: 6f23 ldr r3, [r4, #112] ; 0x70
  38917. 802d460: b90b cbnz r3, 802d466 <tcp_output+0x19e>
  38918. pcb->unacked = seg;
  38919. 802d462: 6725 str r5, [r4, #112] ; 0x70
  38920. 802d464: e024 b.n 802d4b0 <tcp_output+0x1e8>
  38921. /* unacked list is not empty? */
  38922. } else {
  38923. /* In the case of fast retransmit, the packet should not go to the tail
  38924. * of the unacked queue, but rather somewhere before it. We need to check for
  38925. * this case. -STJ Jul 27, 2004 */
  38926. if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) {
  38927. 802d466: 68eb ldr r3, [r5, #12]
  38928. 802d468: 6858 ldr r0, [r3, #4]
  38929. 802d46a: f7fc fdbf bl 8029fec <lwip_ntohl>
  38930. 802d46e: 68f3 ldr r3, [r6, #12]
  38931. 802d470: 4607 mov r7, r0
  38932. 802d472: 6858 ldr r0, [r3, #4]
  38933. 802d474: f7fc fdba bl 8029fec <lwip_ntohl>
  38934. 802d478: 1a38 subs r0, r7, r0
  38935. 802d47a: 2800 cmp r0, #0
  38936. 802d47c: da17 bge.n 802d4ae <tcp_output+0x1e6>
  38937. /* add segment to before tail of unacked list, keeping the list sorted */
  38938. struct tcp_seg **cur_seg = &(pcb->unacked);
  38939. 802d47e: f104 0770 add.w r7, r4, #112 ; 0x70
  38940. while (*cur_seg &&
  38941. 802d482: e000 b.n 802d486 <tcp_output+0x1be>
  38942. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  38943. cur_seg = &((*cur_seg)->next );
  38944. 802d484: 683f ldr r7, [r7, #0]
  38945. * of the unacked queue, but rather somewhere before it. We need to check for
  38946. * this case. -STJ Jul 27, 2004 */
  38947. if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) {
  38948. /* add segment to before tail of unacked list, keeping the list sorted */
  38949. struct tcp_seg **cur_seg = &(pcb->unacked);
  38950. while (*cur_seg &&
  38951. 802d486: 683b ldr r3, [r7, #0]
  38952. 802d488: b91b cbnz r3, 802d492 <tcp_output+0x1ca>
  38953. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  38954. cur_seg = &((*cur_seg)->next );
  38955. }
  38956. seg->next = (*cur_seg);
  38957. 802d48a: 683b ldr r3, [r7, #0]
  38958. 802d48c: 602b str r3, [r5, #0]
  38959. (*cur_seg) = seg;
  38960. 802d48e: 603d str r5, [r7, #0]
  38961. 802d490: e013 b.n 802d4ba <tcp_output+0x1f2>
  38962. * this case. -STJ Jul 27, 2004 */
  38963. if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) {
  38964. /* add segment to before tail of unacked list, keeping the list sorted */
  38965. struct tcp_seg **cur_seg = &(pcb->unacked);
  38966. while (*cur_seg &&
  38967. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  38968. 802d492: 68db ldr r3, [r3, #12]
  38969. 802d494: 6858 ldr r0, [r3, #4]
  38970. 802d496: f7fc fda9 bl 8029fec <lwip_ntohl>
  38971. 802d49a: 68eb ldr r3, [r5, #12]
  38972. 802d49c: 4683 mov fp, r0
  38973. 802d49e: 6858 ldr r0, [r3, #4]
  38974. 802d4a0: f7fc fda4 bl 8029fec <lwip_ntohl>
  38975. 802d4a4: ebc0 000b rsb r0, r0, fp
  38976. * of the unacked queue, but rather somewhere before it. We need to check for
  38977. * this case. -STJ Jul 27, 2004 */
  38978. if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) {
  38979. /* add segment to before tail of unacked list, keeping the list sorted */
  38980. struct tcp_seg **cur_seg = &(pcb->unacked);
  38981. while (*cur_seg &&
  38982. 802d4a8: 2800 cmp r0, #0
  38983. 802d4aa: dbeb blt.n 802d484 <tcp_output+0x1bc>
  38984. 802d4ac: e7ed b.n 802d48a <tcp_output+0x1c2>
  38985. }
  38986. seg->next = (*cur_seg);
  38987. (*cur_seg) = seg;
  38988. } else {
  38989. /* add segment to tail of unacked list */
  38990. useg->next = seg;
  38991. 802d4ae: 6035 str r5, [r6, #0]
  38992. 802d4b0: 462e mov r6, r5
  38993. 802d4b2: e002 b.n 802d4ba <tcp_output+0x1f2>
  38994. useg = useg->next;
  38995. }
  38996. }
  38997. /* do not queue empty segments on the unacked list */
  38998. } else {
  38999. tcp_seg_free(seg);
  39000. 802d4b4: 4628 mov r0, r5
  39001. 802d4b6: f7fe f978 bl 802b7aa <tcp_seg_free>
  39002. }
  39003. seg = pcb->unsent;
  39004. 802d4ba: 6ee5 ldr r5, [r4, #108] ; 0x6c
  39005. 802d4bc: e003 b.n 802d4c6 <tcp_output+0x1fe>
  39006. }
  39007. ip_addr_copy(pcb->local_ip, netif->ip_addr);
  39008. }
  39009. if (pcb->rttest == 0) {
  39010. pcb->rttest = tcp_ticks;
  39011. 802d4be: f8df a04c ldr.w sl, [pc, #76] ; 802d50c <tcp_output+0x244>
  39012. packets, so ignore it here */
  39013. opts = (u32_t *)(void *)(seg->tcphdr + 1);
  39014. if (seg->flags & TF_SEG_OPTS_MSS) {
  39015. u16_t mss;
  39016. #if TCP_CALCULATE_EFF_SEND_MSS
  39017. mss = tcp_eff_send_mss(TCP_MSS, &pcb->remote_ip);
  39018. 802d4c2: f104 0804 add.w r8, r4, #4
  39019. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,
  39020. ntohl(seg->tcphdr->seqno), pcb->lastack));
  39021. }
  39022. #endif /* TCP_CWND_DEBUG */
  39023. /* data available and window allows it to be sent? */
  39024. while (seg != NULL &&
  39025. 802d4c6: b915 cbnz r5, 802d4ce <tcp_output+0x206>
  39026. tcp_seg_free(seg);
  39027. }
  39028. seg = pcb->unsent;
  39029. }
  39030. #if TCP_OVERSIZE
  39031. if (pcb->unsent == NULL) {
  39032. 802d4c8: 6ee3 ldr r3, [r4, #108] ; 0x6c
  39033. 802d4ca: b973 cbnz r3, 802d4ea <tcp_output+0x222>
  39034. 802d4cc: e00b b.n 802d4e6 <tcp_output+0x21e>
  39035. ntohl(seg->tcphdr->seqno), pcb->lastack));
  39036. }
  39037. #endif /* TCP_CWND_DEBUG */
  39038. /* data available and window allows it to be sent? */
  39039. while (seg != NULL &&
  39040. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
  39041. 802d4ce: 68eb ldr r3, [r5, #12]
  39042. 802d4d0: 6858 ldr r0, [r3, #4]
  39043. 802d4d2: f7fc fd8b bl 8029fec <lwip_ntohl>
  39044. 802d4d6: 892a ldrh r2, [r5, #8]
  39045. 802d4d8: 6ca3 ldr r3, [r4, #72] ; 0x48
  39046. 802d4da: 1ad3 subs r3, r2, r3
  39047. 802d4dc: 1818 adds r0, r3, r0
  39048. ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,
  39049. ntohl(seg->tcphdr->seqno), pcb->lastack));
  39050. }
  39051. #endif /* TCP_CWND_DEBUG */
  39052. /* data available and window allows it to be sent? */
  39053. while (seg != NULL &&
  39054. 802d4de: 4548 cmp r0, r9
  39055. 802d4e0: f67f af20 bls.w 802d324 <tcp_output+0x5c>
  39056. 802d4e4: e7f0 b.n 802d4c8 <tcp_output+0x200>
  39057. seg = pcb->unsent;
  39058. }
  39059. #if TCP_OVERSIZE
  39060. if (pcb->unsent == NULL) {
  39061. /* last unsent has been removed, reset unsent_oversize */
  39062. pcb->unsent_oversize = 0;
  39063. 802d4e6: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  39064. }
  39065. #endif /* TCP_OVERSIZE */
  39066. pcb->flags &= ~TF_NAGLEMEMERR;
  39067. 802d4ea: 7fa3 ldrb r3, [r4, #30]
  39068. 802d4ec: f003 037f and.w r3, r3, #127 ; 0x7f
  39069. 802d4f0: 77a3 strb r3, [r4, #30]
  39070. return ERR_OK;
  39071. 802d4f2: e004 b.n 802d4fe <tcp_output+0x236>
  39072. * - if tcp_write had a memory error before (prevent delayed ACK timeout) or
  39073. * - if FIN was already enqueued for this PCB (SYN is always alone in a segment -
  39074. * either seg->next != NULL or pcb->unacked == NULL;
  39075. * RST is no sent using tcp_write/tcp_output.
  39076. */
  39077. if((tcp_do_output_nagle(pcb) == 0) &&
  39078. 802d4f4: f012 0fa0 tst.w r2, #160 ; 0xa0
  39079. 802d4f8: f47f af2e bne.w 802d358 <tcp_output+0x90>
  39080. 802d4fc: e7e4 b.n 802d4c8 <tcp_output+0x200>
  39081. }
  39082. #endif /* TCP_OVERSIZE */
  39083. pcb->flags &= ~TF_NAGLEMEMERR;
  39084. return ERR_OK;
  39085. }
  39086. 802d4fe: 2000 movs r0, #0
  39087. 802d500: b003 add sp, #12
  39088. 802d502: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  39089. 802d506: bf00 nop
  39090. 802d508: 20010d90 .word 0x20010d90
  39091. 802d50c: 20010d7c .word 0x20010d7c
  39092. 0802d510 <tcp_rst>:
  39093. */
  39094. void
  39095. tcp_rst(u32_t seqno, u32_t ackno,
  39096. ip_addr_t *local_ip, ip_addr_t *remote_ip,
  39097. u16_t local_port, u16_t remote_port)
  39098. {
  39099. 802d510: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  39100. 802d514: 4681 mov r9, r0
  39101. 802d516: 460d mov r5, r1
  39102. 802d518: 4690 mov r8, r2
  39103. struct pbuf *p;
  39104. struct tcp_hdr *tcphdr;
  39105. p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);
  39106. 802d51a: 2001 movs r0, #1
  39107. 802d51c: 2114 movs r1, #20
  39108. 802d51e: 2200 movs r2, #0
  39109. */
  39110. void
  39111. tcp_rst(u32_t seqno, u32_t ackno,
  39112. ip_addr_t *local_ip, ip_addr_t *remote_ip,
  39113. u16_t local_port, u16_t remote_port)
  39114. {
  39115. 802d520: 461f mov r7, r3
  39116. 802d522: f8bd b030 ldrh.w fp, [sp, #48] ; 0x30
  39117. 802d526: f8bd a034 ldrh.w sl, [sp, #52] ; 0x34
  39118. struct pbuf *p;
  39119. struct tcp_hdr *tcphdr;
  39120. p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);
  39121. 802d52a: f7fd fede bl 802b2ea <pbuf_alloc>
  39122. if (p == NULL) {
  39123. 802d52e: 4606 mov r6, r0
  39124. 802d530: 2800 cmp r0, #0
  39125. 802d532: d030 beq.n 802d596 <tcp_rst+0x86>
  39126. return;
  39127. }
  39128. LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr",
  39129. (p->len >= sizeof(struct tcp_hdr)));
  39130. tcphdr = (struct tcp_hdr *)p->payload;
  39131. 802d534: 6844 ldr r4, [r0, #4]
  39132. tcphdr->src = htons(local_port);
  39133. 802d536: 4658 mov r0, fp
  39134. 802d538: f7fc fd4c bl 8029fd4 <lwip_htons>
  39135. 802d53c: 8020 strh r0, [r4, #0]
  39136. tcphdr->dest = htons(remote_port);
  39137. 802d53e: 4650 mov r0, sl
  39138. 802d540: f7fc fd48 bl 8029fd4 <lwip_htons>
  39139. 802d544: 8060 strh r0, [r4, #2]
  39140. tcphdr->seqno = htonl(seqno);
  39141. 802d546: 4648 mov r0, r9
  39142. 802d548: f7fc fd4e bl 8029fe8 <lwip_htonl>
  39143. 802d54c: 6060 str r0, [r4, #4]
  39144. tcphdr->ackno = htonl(ackno);
  39145. 802d54e: 4628 mov r0, r5
  39146. 802d550: f7fc fd4a bl 8029fe8 <lwip_htonl>
  39147. 802d554: 60a0 str r0, [r4, #8]
  39148. TCPH_HDRLEN_FLAGS_SET(tcphdr, TCP_HLEN/4, TCP_RST | TCP_ACK);
  39149. 802d556: f245 0014 movw r0, #20500 ; 0x5014
  39150. 802d55a: f7fc fd3b bl 8029fd4 <lwip_htons>
  39151. tcphdr->wnd = PP_HTONS(TCP_WND);
  39152. 802d55e: 2316 movs r3, #22
  39153. 802d560: 2500 movs r5, #0
  39154. 802d562: 73a3 strb r3, [r4, #14]
  39155. 802d564: f06f 032f mvn.w r3, #47 ; 0x2f
  39156. tcphdr = (struct tcp_hdr *)p->payload;
  39157. tcphdr->src = htons(local_port);
  39158. tcphdr->dest = htons(remote_port);
  39159. tcphdr->seqno = htonl(seqno);
  39160. tcphdr->ackno = htonl(ackno);
  39161. TCPH_HDRLEN_FLAGS_SET(tcphdr, TCP_HLEN/4, TCP_RST | TCP_ACK);
  39162. 802d568: 81a0 strh r0, [r4, #12]
  39163. tcphdr->wnd = PP_HTONS(TCP_WND);
  39164. 802d56a: 73e3 strb r3, [r4, #15]
  39165. tcphdr->chksum = 0;
  39166. 802d56c: 7425 strb r5, [r4, #16]
  39167. 802d56e: 7465 strb r5, [r4, #17]
  39168. tcphdr->urgp = 0;
  39169. 802d570: 74a5 strb r5, [r4, #18]
  39170. 802d572: 74e5 strb r5, [r4, #19]
  39171. #if CHECKSUM_GEN_TCP
  39172. tcphdr->chksum = inet_chksum_pseudo(p, local_ip, remote_ip,
  39173. IP_PROTO_TCP, p->tot_len);
  39174. #endif
  39175. TCP_STATS_INC(tcp.xmit);
  39176. snmp_inc_tcpoutrsts();
  39177. 802d574: f002 fc64 bl 802fe40 <snmp_inc_tcpoutrsts>
  39178. /* Send output with hardcoded TTL since we have no access to the pcb */
  39179. ip_output(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP);
  39180. 802d578: 2306 movs r3, #6
  39181. 802d57a: 9301 str r3, [sp, #4]
  39182. 802d57c: 9500 str r5, [sp, #0]
  39183. 802d57e: 4630 mov r0, r6
  39184. 802d580: 4641 mov r1, r8
  39185. 802d582: 463a mov r2, r7
  39186. 802d584: 23ff movs r3, #255 ; 0xff
  39187. 802d586: f000 ff41 bl 802e40c <ip_output>
  39188. pbuf_free(p);
  39189. 802d58a: 4630 mov r0, r6
  39190. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno));
  39191. }
  39192. 802d58c: b003 add sp, #12
  39193. 802d58e: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  39194. #endif
  39195. TCP_STATS_INC(tcp.xmit);
  39196. snmp_inc_tcpoutrsts();
  39197. /* Send output with hardcoded TTL since we have no access to the pcb */
  39198. ip_output(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP);
  39199. pbuf_free(p);
  39200. 802d592: f7fd be5d b.w 802b250 <pbuf_free>
  39201. LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno));
  39202. }
  39203. 802d596: b003 add sp, #12
  39204. 802d598: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  39205. 0802d59c <tcp_rexmit_rto>:
  39206. void
  39207. tcp_rexmit_rto(struct tcp_pcb *pcb)
  39208. {
  39209. struct tcp_seg *seg;
  39210. if (pcb->unacked == NULL) {
  39211. 802d59c: 6f02 ldr r2, [r0, #112] ; 0x70
  39212. *
  39213. * @param pcb the tcp_pcb for which to re-enqueue all unacked segments
  39214. */
  39215. void
  39216. tcp_rexmit_rto(struct tcp_pcb *pcb)
  39217. {
  39218. 802d59e: b510 push {r4, lr}
  39219. struct tcp_seg *seg;
  39220. if (pcb->unacked == NULL) {
  39221. 802d5a0: b19a cbz r2, 802d5ca <tcp_rexmit_rto+0x2e>
  39222. 802d5a2: 4611 mov r1, r2
  39223. 802d5a4: e000 b.n 802d5a8 <tcp_rexmit_rto+0xc>
  39224. return;
  39225. }
  39226. /* Move all unacked segments to the head of the unsent queue */
  39227. for (seg = pcb->unacked; seg->next != NULL; seg = seg->next);
  39228. 802d5a6: 4619 mov r1, r3
  39229. 802d5a8: 680b ldr r3, [r1, #0]
  39230. 802d5aa: 2b00 cmp r3, #0
  39231. 802d5ac: d1fb bne.n 802d5a6 <tcp_rexmit_rto+0xa>
  39232. /* concatenate unsent queue after unacked queue */
  39233. seg->next = pcb->unsent;
  39234. 802d5ae: 6ec4 ldr r4, [r0, #108] ; 0x6c
  39235. 802d5b0: 600c str r4, [r1, #0]
  39236. /* unsent queue is the concatenated queue (of unacked, unsent) */
  39237. pcb->unsent = pcb->unacked;
  39238. 802d5b2: 66c2 str r2, [r0, #108] ; 0x6c
  39239. /* unacked queue is now empty */
  39240. pcb->unacked = NULL;
  39241. /* last unsent hasn't changed, no need to reset unsent_oversize */
  39242. /* increment number of retransmissions */
  39243. ++pcb->nrtx;
  39244. 802d5b4: f890 2046 ldrb.w r2, [r0, #70] ; 0x46
  39245. /* concatenate unsent queue after unacked queue */
  39246. seg->next = pcb->unsent;
  39247. /* unsent queue is the concatenated queue (of unacked, unsent) */
  39248. pcb->unsent = pcb->unacked;
  39249. /* unacked queue is now empty */
  39250. pcb->unacked = NULL;
  39251. 802d5b8: 6703 str r3, [r0, #112] ; 0x70
  39252. /* last unsent hasn't changed, no need to reset unsent_oversize */
  39253. /* increment number of retransmissions */
  39254. ++pcb->nrtx;
  39255. 802d5ba: 3201 adds r2, #1
  39256. 802d5bc: f880 2046 strb.w r2, [r0, #70] ; 0x46
  39257. /* Don't take any RTT measurements after retransmitting. */
  39258. pcb->rttest = 0;
  39259. 802d5c0: 6383 str r3, [r0, #56] ; 0x38
  39260. /* Do the actual retransmission */
  39261. tcp_output(pcb);
  39262. }
  39263. 802d5c2: e8bd 4010 ldmia.w sp!, {r4, lr}
  39264. /* Don't take any RTT measurements after retransmitting. */
  39265. pcb->rttest = 0;
  39266. /* Do the actual retransmission */
  39267. tcp_output(pcb);
  39268. 802d5c6: f7ff be7f b.w 802d2c8 <tcp_output>
  39269. 802d5ca: bd10 pop {r4, pc}
  39270. 0802d5cc <tcp_rexmit>:
  39271. *
  39272. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  39273. */
  39274. void
  39275. tcp_rexmit(struct tcp_pcb *pcb)
  39276. {
  39277. 802d5cc: b5f8 push {r3, r4, r5, r6, r7, lr}
  39278. struct tcp_seg *seg;
  39279. struct tcp_seg **cur_seg;
  39280. if (pcb->unacked == NULL) {
  39281. 802d5ce: 6f05 ldr r5, [r0, #112] ; 0x70
  39282. *
  39283. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  39284. */
  39285. void
  39286. tcp_rexmit(struct tcp_pcb *pcb)
  39287. {
  39288. 802d5d0: 4604 mov r4, r0
  39289. struct tcp_seg *seg;
  39290. struct tcp_seg **cur_seg;
  39291. if (pcb->unacked == NULL) {
  39292. 802d5d2: 2d00 cmp r5, #0
  39293. 802d5d4: d027 beq.n 802d626 <tcp_rexmit+0x5a>
  39294. }
  39295. /* Move the first unacked segment to the unsent queue */
  39296. /* Keep the unsent queue sorted. */
  39297. seg = pcb->unacked;
  39298. pcb->unacked = seg->next;
  39299. 802d5d6: 682b ldr r3, [r5, #0]
  39300. cur_seg = &(pcb->unsent);
  39301. 802d5d8: f100 066c add.w r6, r0, #108 ; 0x6c
  39302. }
  39303. /* Move the first unacked segment to the unsent queue */
  39304. /* Keep the unsent queue sorted. */
  39305. seg = pcb->unacked;
  39306. pcb->unacked = seg->next;
  39307. 802d5dc: 6703 str r3, [r0, #112] ; 0x70
  39308. cur_seg = &(pcb->unsent);
  39309. while (*cur_seg &&
  39310. 802d5de: e000 b.n 802d5e2 <tcp_rexmit+0x16>
  39311. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  39312. cur_seg = &((*cur_seg)->next );
  39313. 802d5e0: 6836 ldr r6, [r6, #0]
  39314. /* Keep the unsent queue sorted. */
  39315. seg = pcb->unacked;
  39316. pcb->unacked = seg->next;
  39317. cur_seg = &(pcb->unsent);
  39318. while (*cur_seg &&
  39319. 802d5e2: 6833 ldr r3, [r6, #0]
  39320. 802d5e4: b92b cbnz r3, 802d5f2 <tcp_rexmit+0x26>
  39321. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  39322. cur_seg = &((*cur_seg)->next );
  39323. }
  39324. seg->next = *cur_seg;
  39325. 802d5e6: 6833 ldr r3, [r6, #0]
  39326. 802d5e8: 602b str r3, [r5, #0]
  39327. *cur_seg = seg;
  39328. 802d5ea: 6035 str r5, [r6, #0]
  39329. #if TCP_OVERSIZE
  39330. if (seg->next == NULL) {
  39331. 802d5ec: 682b ldr r3, [r5, #0]
  39332. 802d5ee: b97b cbnz r3, 802d610 <tcp_rexmit+0x44>
  39333. 802d5f0: e00c b.n 802d60c <tcp_rexmit+0x40>
  39334. seg = pcb->unacked;
  39335. pcb->unacked = seg->next;
  39336. cur_seg = &(pcb->unsent);
  39337. while (*cur_seg &&
  39338. TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
  39339. 802d5f2: 68db ldr r3, [r3, #12]
  39340. 802d5f4: 6858 ldr r0, [r3, #4]
  39341. 802d5f6: f7fc fcf9 bl 8029fec <lwip_ntohl>
  39342. 802d5fa: 68eb ldr r3, [r5, #12]
  39343. 802d5fc: 4607 mov r7, r0
  39344. 802d5fe: 6858 ldr r0, [r3, #4]
  39345. 802d600: f7fc fcf4 bl 8029fec <lwip_ntohl>
  39346. 802d604: 1a38 subs r0, r7, r0
  39347. /* Keep the unsent queue sorted. */
  39348. seg = pcb->unacked;
  39349. pcb->unacked = seg->next;
  39350. cur_seg = &(pcb->unsent);
  39351. while (*cur_seg &&
  39352. 802d606: 2800 cmp r0, #0
  39353. 802d608: dbea blt.n 802d5e0 <tcp_rexmit+0x14>
  39354. 802d60a: e7ec b.n 802d5e6 <tcp_rexmit+0x1a>
  39355. seg->next = *cur_seg;
  39356. *cur_seg = seg;
  39357. #if TCP_OVERSIZE
  39358. if (seg->next == NULL) {
  39359. /* the retransmitted segment is last in unsent, so reset unsent_oversize */
  39360. pcb->unsent_oversize = 0;
  39361. 802d60c: f8a4 306a strh.w r3, [r4, #106] ; 0x6a
  39362. }
  39363. #endif /* TCP_OVERSIZE */
  39364. ++pcb->nrtx;
  39365. 802d610: f894 3046 ldrb.w r3, [r4, #70] ; 0x46
  39366. 802d614: 3301 adds r3, #1
  39367. 802d616: f884 3046 strb.w r3, [r4, #70] ; 0x46
  39368. /* Don't take any rtt measurements after retransmitting. */
  39369. pcb->rttest = 0;
  39370. 802d61a: 2300 movs r3, #0
  39371. 802d61c: 63a3 str r3, [r4, #56] ; 0x38
  39372. /* Do the actual retransmission. */
  39373. snmp_inc_tcpretranssegs();
  39374. /* No need to call tcp_output: we are always called from tcp_input()
  39375. and thus tcp_output directly returns. */
  39376. }
  39377. 802d61e: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr}
  39378. /* Don't take any rtt measurements after retransmitting. */
  39379. pcb->rttest = 0;
  39380. /* Do the actual retransmission. */
  39381. snmp_inc_tcpretranssegs();
  39382. 802d622: f002 bbfd b.w 802fe20 <snmp_inc_tcpretranssegs>
  39383. 802d626: bdf8 pop {r3, r4, r5, r6, r7, pc}
  39384. 0802d628 <tcp_rexmit_fast>:
  39385. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  39386. */
  39387. void
  39388. tcp_rexmit_fast(struct tcp_pcb *pcb)
  39389. {
  39390. if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) {
  39391. 802d628: 6f03 ldr r3, [r0, #112] ; 0x70
  39392. *
  39393. * @param pcb the tcp_pcb for which to retransmit the first unacked segment
  39394. */
  39395. void
  39396. tcp_rexmit_fast(struct tcp_pcb *pcb)
  39397. {
  39398. 802d62a: b510 push {r4, lr}
  39399. 802d62c: 4604 mov r4, r0
  39400. if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) {
  39401. 802d62e: b333 cbz r3, 802d67e <tcp_rexmit_fast+0x56>
  39402. 802d630: 7f83 ldrb r3, [r0, #30]
  39403. 802d632: f003 0304 and.w r3, r3, #4
  39404. 802d636: b2db uxtb r3, r3
  39405. 802d638: bb0b cbnz r3, 802d67e <tcp_rexmit_fast+0x56>
  39406. LWIP_DEBUGF(TCP_FR_DEBUG,
  39407. ("tcp_receive: dupacks %"U16_F" (%"U32_F
  39408. "), fast retransmit %"U32_F"\n",
  39409. (u16_t)pcb->dupacks, pcb->lastack,
  39410. ntohl(pcb->unacked->tcphdr->seqno)));
  39411. tcp_rexmit(pcb);
  39412. 802d63a: f7ff ffc7 bl 802d5cc <tcp_rexmit>
  39413. /* Set ssthresh to half of the minimum of the current
  39414. * cwnd and the advertised window */
  39415. if (pcb->cwnd > pcb->snd_wnd) {
  39416. 802d63e: f8b4 304c ldrh.w r3, [r4, #76] ; 0x4c
  39417. 802d642: f8b4 2060 ldrh.w r2, [r4, #96] ; 0x60
  39418. 802d646: 4293 cmp r3, r2
  39419. 802d648: d903 bls.n 802d652 <tcp_rexmit_fast+0x2a>
  39420. pcb->ssthresh = pcb->snd_wnd / 2;
  39421. 802d64a: 0852 lsrs r2, r2, #1
  39422. 802d64c: f8a4 204e strh.w r2, [r4, #78] ; 0x4e
  39423. 802d650: e002 b.n 802d658 <tcp_rexmit_fast+0x30>
  39424. } else {
  39425. pcb->ssthresh = pcb->cwnd / 2;
  39426. 802d652: 085b lsrs r3, r3, #1
  39427. 802d654: f8a4 304e strh.w r3, [r4, #78] ; 0x4e
  39428. }
  39429. /* The minimum value for ssthresh should be 2 MSS */
  39430. if (pcb->ssthresh < 2*pcb->mss) {
  39431. 802d658: 8ee3 ldrh r3, [r4, #54] ; 0x36
  39432. 802d65a: f8b4 104e ldrh.w r1, [r4, #78] ; 0x4e
  39433. 802d65e: 005a lsls r2, r3, #1
  39434. 802d660: 4291 cmp r1, r2
  39435. LWIP_DEBUGF(TCP_FR_DEBUG,
  39436. ("tcp_receive: The minimum value for ssthresh %"U16_F
  39437. " should be min 2 mss %"U16_F"...\n",
  39438. pcb->ssthresh, 2*pcb->mss));
  39439. pcb->ssthresh = 2*pcb->mss;
  39440. 802d662: bfb8 it lt
  39441. 802d664: f8a4 204e strhlt.w r2, [r4, #78] ; 0x4e
  39442. }
  39443. pcb->cwnd = pcb->ssthresh + 3 * pcb->mss;
  39444. 802d668: f8b4 204e ldrh.w r2, [r4, #78] ; 0x4e
  39445. 802d66c: 2103 movs r1, #3
  39446. 802d66e: fb01 2303 mla r3, r1, r3, r2
  39447. 802d672: f8a4 304c strh.w r3, [r4, #76] ; 0x4c
  39448. pcb->flags |= TF_INFR;
  39449. 802d676: 7fa3 ldrb r3, [r4, #30]
  39450. 802d678: f043 0304 orr.w r3, r3, #4
  39451. 802d67c: 77a3 strb r3, [r4, #30]
  39452. 802d67e: bd10 pop {r4, pc}
  39453. 0802d680 <tcp_keepalive>:
  39454. *
  39455. * @param pcb the tcp_pcb for which to send a keepalive packet
  39456. */
  39457. void
  39458. tcp_keepalive(struct tcp_pcb *pcb)
  39459. {
  39460. 802d680: b537 push {r0, r1, r2, r4, r5, lr}
  39461. 802d682: 4604 mov r4, r0
  39462. ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip)));
  39463. LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %"U32_F" pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
  39464. tcp_ticks, pcb->tmr, pcb->keep_cnt_sent));
  39465. p = tcp_output_alloc_header(pcb, 0, 0, htonl(pcb->snd_nxt - 1));
  39466. 802d684: 6d00 ldr r0, [r0, #80] ; 0x50
  39467. 802d686: 3801 subs r0, #1
  39468. 802d688: f7fc fcae bl 8029fe8 <lwip_htonl>
  39469. 802d68c: 2100 movs r1, #0
  39470. 802d68e: 4602 mov r2, r0
  39471. 802d690: 4620 mov r0, r4
  39472. 802d692: f7ff fbd9 bl 802ce48 <tcp_output_alloc_header.constprop.0>
  39473. if(p == NULL) {
  39474. 802d696: 4605 mov r5, r0
  39475. 802d698: b178 cbz r0, 802d6ba <tcp_keepalive+0x3a>
  39476. /* Send output to IP */
  39477. #if LWIP_NETIF_HWADDRHINT
  39478. ip_output_hinted(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP,
  39479. &(pcb->addr_hint));
  39480. #else /* LWIP_NETIF_HWADDRHINT*/
  39481. ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);
  39482. 802d69a: 2200 movs r2, #0
  39483. 802d69c: f04f 0e06 mov.w lr, #6
  39484. 802d6a0: e88d 4004 stmia.w sp, {r2, lr}
  39485. 802d6a4: 7aa3 ldrb r3, [r4, #10]
  39486. 802d6a6: 4621 mov r1, r4
  39487. 802d6a8: 1d22 adds r2, r4, #4
  39488. 802d6aa: f000 feaf bl 802e40c <ip_output>
  39489. #endif /* LWIP_NETIF_HWADDRHINT*/
  39490. pbuf_free(p);
  39491. 802d6ae: 4628 mov r0, r5
  39492. LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F".\n",
  39493. pcb->snd_nxt - 1, pcb->rcv_nxt));
  39494. }
  39495. 802d6b0: b003 add sp, #12
  39496. 802d6b2: e8bd 4030 ldmia.w sp!, {r4, r5, lr}
  39497. &(pcb->addr_hint));
  39498. #else /* LWIP_NETIF_HWADDRHINT*/
  39499. ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);
  39500. #endif /* LWIP_NETIF_HWADDRHINT*/
  39501. pbuf_free(p);
  39502. 802d6b6: f7fd bdcb b.w 802b250 <pbuf_free>
  39503. LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F".\n",
  39504. pcb->snd_nxt - 1, pcb->rcv_nxt));
  39505. }
  39506. 802d6ba: b003 add sp, #12
  39507. 802d6bc: bd30 pop {r4, r5, pc}
  39508. 0802d6be <tcp_zero_window_probe>:
  39509. *
  39510. * @param pcb the tcp_pcb for which to send a zero-window probe packet
  39511. */
  39512. void
  39513. tcp_zero_window_probe(struct tcp_pcb *pcb)
  39514. {
  39515. 802d6be: e92d 41f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, lr}
  39516. LWIP_DEBUGF(TCP_DEBUG,
  39517. ("tcp_zero_window_probe: tcp_ticks %"U32_F
  39518. " pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
  39519. tcp_ticks, pcb->tmr, pcb->keep_cnt_sent));
  39520. seg = pcb->unacked;
  39521. 802d6c2: 6f04 ldr r4, [r0, #112] ; 0x70
  39522. *
  39523. * @param pcb the tcp_pcb for which to send a zero-window probe packet
  39524. */
  39525. void
  39526. tcp_zero_window_probe(struct tcp_pcb *pcb)
  39527. {
  39528. 802d6c4: 4605 mov r5, r0
  39529. " pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
  39530. tcp_ticks, pcb->tmr, pcb->keep_cnt_sent));
  39531. seg = pcb->unacked;
  39532. if(seg == NULL) {
  39533. 802d6c6: b914 cbnz r4, 802d6ce <tcp_zero_window_probe+0x10>
  39534. seg = pcb->unsent;
  39535. 802d6c8: 6ec4 ldr r4, [r0, #108] ; 0x6c
  39536. }
  39537. if(seg == NULL) {
  39538. 802d6ca: 2c00 cmp r4, #0
  39539. 802d6cc: d042 beq.n 802d754 <tcp_zero_window_probe+0x96>
  39540. return;
  39541. }
  39542. is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0);
  39543. 802d6ce: 68e3 ldr r3, [r4, #12]
  39544. 802d6d0: 8998 ldrh r0, [r3, #12]
  39545. 802d6d2: f7fc fc84 bl 8029fde <lwip_ntohs>
  39546. 802d6d6: f010 0001 ands.w r0, r0, #1
  39547. 802d6da: d005 beq.n 802d6e8 <tcp_zero_window_probe+0x2a>
  39548. 802d6dc: 8921 ldrh r1, [r4, #8]
  39549. 802d6de: f1d1 0101 rsbs r1, r1, #1
  39550. 802d6e2: bf38 it cc
  39551. 802d6e4: 2100 movcc r1, #0
  39552. 802d6e6: e000 b.n 802d6ea <tcp_zero_window_probe+0x2c>
  39553. 802d6e8: 4601 mov r1, r0
  39554. /* we want to send one seqno: either FIN or data (no options) */
  39555. len = is_fin ? 0 : 1;
  39556. p = tcp_output_alloc_header(pcb, 0, len, seg->tcphdr->seqno);
  39557. 802d6ea: 68e3 ldr r3, [r4, #12]
  39558. }
  39559. if(seg == NULL) {
  39560. return;
  39561. }
  39562. is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0);
  39563. 802d6ec: fa5f f881 uxtb.w r8, r1
  39564. /* we want to send one seqno: either FIN or data (no options) */
  39565. len = is_fin ? 0 : 1;
  39566. p = tcp_output_alloc_header(pcb, 0, len, seg->tcphdr->seqno);
  39567. 802d6f0: 4628 mov r0, r5
  39568. 802d6f2: f081 0101 eor.w r1, r1, #1
  39569. 802d6f6: 685a ldr r2, [r3, #4]
  39570. 802d6f8: f7ff fba6 bl 802ce48 <tcp_output_alloc_header.constprop.0>
  39571. if(p == NULL) {
  39572. 802d6fc: 4606 mov r6, r0
  39573. 802d6fe: 2800 cmp r0, #0
  39574. 802d700: d028 beq.n 802d754 <tcp_zero_window_probe+0x96>
  39575. LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: no memory for pbuf\n"));
  39576. return;
  39577. }
  39578. tcphdr = (struct tcp_hdr *)p->payload;
  39579. 802d702: 6847 ldr r7, [r0, #4]
  39580. if (is_fin) {
  39581. 802d704: f1b8 0f00 cmp.w r8, #0
  39582. 802d708: d009 beq.n 802d71e <tcp_zero_window_probe+0x60>
  39583. /* FIN segment, no data */
  39584. TCPH_FLAGS_SET(tcphdr, TCP_ACK | TCP_FIN);
  39585. 802d70a: 89bc ldrh r4, [r7, #12]
  39586. 802d70c: 2011 movs r0, #17
  39587. 802d70e: f7fc fc61 bl 8029fd4 <lwip_htons>
  39588. 802d712: f424 547c bic.w r4, r4, #16128 ; 0x3f00
  39589. 802d716: b2a4 uxth r4, r4
  39590. 802d718: 4320 orrs r0, r4
  39591. 802d71a: 81b8 strh r0, [r7, #12]
  39592. 802d71c: e009 b.n 802d732 <tcp_zero_window_probe+0x74>
  39593. /* Data segment, copy in one byte from the head of the unacked queue */
  39594. char *d = ((char *)p->payload + TCP_HLEN);
  39595. /* Depending on whether the segment has already been sent (unacked) or not
  39596. (unsent), seg->p->payload points to the IP header or TCP header.
  39597. Ensure we copy the first TCP data byte: */
  39598. pbuf_copy_partial(seg->p, d, 1, seg->p->tot_len - seg->len);
  39599. 802d71e: 6860 ldr r0, [r4, #4]
  39600. 802d720: 8923 ldrh r3, [r4, #8]
  39601. 802d722: 8902 ldrh r2, [r0, #8]
  39602. 802d724: 1ad3 subs r3, r2, r3
  39603. 802d726: f107 0114 add.w r1, r7, #20
  39604. 802d72a: 2201 movs r2, #1
  39605. 802d72c: b29b uxth r3, r3
  39606. 802d72e: f7fd fedd bl 802b4ec <pbuf_copy_partial>
  39607. /* Send output to IP */
  39608. #if LWIP_NETIF_HWADDRHINT
  39609. ip_output_hinted(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP,
  39610. &(pcb->addr_hint));
  39611. #else /* LWIP_NETIF_HWADDRHINT*/
  39612. ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);
  39613. 802d732: 2200 movs r2, #0
  39614. 802d734: f04f 0c06 mov.w ip, #6
  39615. 802d738: e88d 1004 stmia.w sp, {r2, ip}
  39616. 802d73c: 7aab ldrb r3, [r5, #10]
  39617. 802d73e: 4630 mov r0, r6
  39618. 802d740: 4629 mov r1, r5
  39619. 802d742: 1d2a adds r2, r5, #4
  39620. 802d744: f000 fe62 bl 802e40c <ip_output>
  39621. #endif /* LWIP_NETIF_HWADDRHINT*/
  39622. pbuf_free(p);
  39623. 802d748: 4630 mov r0, r6
  39624. LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F
  39625. " ackno %"U32_F".\n",
  39626. pcb->snd_nxt - 1, pcb->rcv_nxt));
  39627. }
  39628. 802d74a: b002 add sp, #8
  39629. 802d74c: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  39630. &(pcb->addr_hint));
  39631. #else /* LWIP_NETIF_HWADDRHINT*/
  39632. ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);
  39633. #endif /* LWIP_NETIF_HWADDRHINT*/
  39634. pbuf_free(p);
  39635. 802d750: f7fd bd7e b.w 802b250 <pbuf_free>
  39636. LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F
  39637. " ackno %"U32_F".\n",
  39638. pcb->snd_nxt - 1, pcb->rcv_nxt));
  39639. }
  39640. 802d754: b002 add sp, #8
  39641. 802d756: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  39642. 802d75a: 0000 movs r0, r0
  39643. 0802d75c <sys_timeout>:
  39644. sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name)
  39645. #else /* LWIP_DEBUG_TIMERNAMES */
  39646. void
  39647. sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg)
  39648. #endif /* LWIP_DEBUG_TIMERNAMES */
  39649. {
  39650. 802d75c: b570 push {r4, r5, r6, lr}
  39651. 802d75e: 4604 mov r4, r0
  39652. struct sys_timeo *timeout, *t;
  39653. timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);
  39654. 802d760: 2009 movs r0, #9
  39655. sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name)
  39656. #else /* LWIP_DEBUG_TIMERNAMES */
  39657. void
  39658. sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg)
  39659. #endif /* LWIP_DEBUG_TIMERNAMES */
  39660. {
  39661. 802d762: 460d mov r5, r1
  39662. 802d764: 4616 mov r6, r2
  39663. struct sys_timeo *timeout, *t;
  39664. timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);
  39665. 802d766: f7fd fc53 bl 802b010 <memp_malloc>
  39666. if (timeout == NULL) {
  39667. 802d76a: 4603 mov r3, r0
  39668. 802d76c: b308 cbz r0, 802d7b2 <sys_timeout+0x56>
  39669. timeout->handler_name = handler_name;
  39670. LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" handler=%s arg=%p\n",
  39671. (void *)timeout, msecs, handler_name, (void *)arg));
  39672. #endif /* LWIP_DEBUG_TIMERNAMES */
  39673. if (next_timeout == NULL) {
  39674. 802d76e: 4911 ldr r1, [pc, #68] ; (802d7b4 <sys_timeout+0x58>)
  39675. timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);
  39676. if (timeout == NULL) {
  39677. LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL);
  39678. return;
  39679. }
  39680. timeout->next = NULL;
  39681. 802d770: 2200 movs r2, #0
  39682. timeout->h = handler;
  39683. timeout->arg = arg;
  39684. timeout->time = msecs;
  39685. 802d772: e880 0074 stmia.w r0, {r2, r4, r5, r6}
  39686. timeout->handler_name = handler_name;
  39687. LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" handler=%s arg=%p\n",
  39688. (void *)timeout, msecs, handler_name, (void *)arg));
  39689. #endif /* LWIP_DEBUG_TIMERNAMES */
  39690. if (next_timeout == NULL) {
  39691. 802d776: 680a ldr r2, [r1, #0]
  39692. 802d778: b902 cbnz r2, 802d77c <sys_timeout+0x20>
  39693. 802d77a: e005 b.n 802d788 <sys_timeout+0x2c>
  39694. next_timeout = timeout;
  39695. return;
  39696. }
  39697. if (next_timeout->time > msecs) {
  39698. 802d77c: 6850 ldr r0, [r2, #4]
  39699. 802d77e: 42a0 cmp r0, r4
  39700. 802d780: d90c bls.n 802d79c <sys_timeout+0x40>
  39701. next_timeout->time -= msecs;
  39702. 802d782: 1b04 subs r4, r0, r4
  39703. 802d784: 6054 str r4, [r2, #4]
  39704. timeout->next = next_timeout;
  39705. 802d786: 601a str r2, [r3, #0]
  39706. next_timeout = timeout;
  39707. 802d788: 600b str r3, [r1, #0]
  39708. 802d78a: bd70 pop {r4, r5, r6, pc}
  39709. } else {
  39710. for(t = next_timeout; t != NULL; t = t->next) {
  39711. timeout->time -= t->time;
  39712. if (t->next == NULL || t->next->time > timeout->time) {
  39713. 802d78c: 684c ldr r4, [r1, #4]
  39714. 802d78e: 4284 cmp r4, r0
  39715. 802d790: d80c bhi.n 802d7ac <sys_timeout+0x50>
  39716. 802d792: 460a mov r2, r1
  39717. 802d794: e002 b.n 802d79c <sys_timeout+0x40>
  39718. if (t->next != NULL) {
  39719. t->next->time -= timeout->time;
  39720. }
  39721. timeout->next = t->next;
  39722. 802d796: 6019 str r1, [r3, #0]
  39723. t->next = timeout;
  39724. 802d798: 6013 str r3, [r2, #0]
  39725. break;
  39726. 802d79a: bd70 pop {r4, r5, r6, pc}
  39727. next_timeout->time -= msecs;
  39728. timeout->next = next_timeout;
  39729. next_timeout = timeout;
  39730. } else {
  39731. for(t = next_timeout; t != NULL; t = t->next) {
  39732. timeout->time -= t->time;
  39733. 802d79c: 6851 ldr r1, [r2, #4]
  39734. 802d79e: 6858 ldr r0, [r3, #4]
  39735. 802d7a0: 1a40 subs r0, r0, r1
  39736. if (t->next == NULL || t->next->time > timeout->time) {
  39737. 802d7a2: 6811 ldr r1, [r2, #0]
  39738. next_timeout->time -= msecs;
  39739. timeout->next = next_timeout;
  39740. next_timeout = timeout;
  39741. } else {
  39742. for(t = next_timeout; t != NULL; t = t->next) {
  39743. timeout->time -= t->time;
  39744. 802d7a4: 6058 str r0, [r3, #4]
  39745. if (t->next == NULL || t->next->time > timeout->time) {
  39746. 802d7a6: 2900 cmp r1, #0
  39747. 802d7a8: d1f0 bne.n 802d78c <sys_timeout+0x30>
  39748. 802d7aa: e7f4 b.n 802d796 <sys_timeout+0x3a>
  39749. if (t->next != NULL) {
  39750. t->next->time -= timeout->time;
  39751. 802d7ac: 1a20 subs r0, r4, r0
  39752. 802d7ae: 6048 str r0, [r1, #4]
  39753. 802d7b0: e7f1 b.n 802d796 <sys_timeout+0x3a>
  39754. 802d7b2: bd70 pop {r4, r5, r6, pc}
  39755. 802d7b4: 2000e0d4 .word 0x2000e0d4
  39756. 0802d7b8 <sys_timeouts_init>:
  39757. }
  39758. #endif /* LWIP_DNS */
  39759. /** Initialize this module */
  39760. void sys_timeouts_init(void)
  39761. {
  39762. 802d7b8: b508 push {r3, lr}
  39763. #if IP_REASSEMBLY
  39764. sys_timeout(IP_TMR_INTERVAL, ip_reass_timer, NULL);
  39765. #endif /* IP_REASSEMBLY */
  39766. #if LWIP_ARP
  39767. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  39768. 802d7ba: 2200 movs r2, #0
  39769. 802d7bc: f241 3088 movw r0, #5000 ; 0x1388
  39770. 802d7c0: 4908 ldr r1, [pc, #32] ; (802d7e4 <sys_timeouts_init+0x2c>)
  39771. 802d7c2: f7ff ffcb bl 802d75c <sys_timeout>
  39772. #endif /* LWIP_ARP */
  39773. #if LWIP_DHCP
  39774. sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
  39775. 802d7c6: 2200 movs r2, #0
  39776. 802d7c8: f64e 2060 movw r0, #60000 ; 0xea60
  39777. 802d7cc: 4906 ldr r1, [pc, #24] ; (802d7e8 <sys_timeouts_init+0x30>)
  39778. 802d7ce: f7ff ffc5 bl 802d75c <sys_timeout>
  39779. sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
  39780. 802d7d2: 4906 ldr r1, [pc, #24] ; (802d7ec <sys_timeouts_init+0x34>)
  39781. 802d7d4: f44f 70fa mov.w r0, #500 ; 0x1f4
  39782. 802d7d8: 2200 movs r2, #0
  39783. #if NO_SYS
  39784. /* Initialise timestamp for sys_check_timeouts */
  39785. timeouts_last_time = sys_now();
  39786. #endif
  39787. }
  39788. 802d7da: e8bd 4008 ldmia.w sp!, {r3, lr}
  39789. #if LWIP_ARP
  39790. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  39791. #endif /* LWIP_ARP */
  39792. #if LWIP_DHCP
  39793. sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
  39794. sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
  39795. 802d7de: f7ff bfbd b.w 802d75c <sys_timeout>
  39796. 802d7e2: bf00 nop
  39797. 802d7e4: 0802d829 .word 0x0802d829
  39798. 802d7e8: 0802d80d .word 0x0802d80d
  39799. 802d7ec: 0802d7f1 .word 0x0802d7f1
  39800. 0802d7f0 <dhcp_timer_fine>:
  39801. *
  39802. * @param arg unused argument
  39803. */
  39804. static void
  39805. dhcp_timer_fine(void *arg)
  39806. {
  39807. 802d7f0: b508 push {r3, lr}
  39808. LWIP_UNUSED_ARG(arg);
  39809. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_fine_tmr()\n"));
  39810. dhcp_fine_tmr();
  39811. 802d7f2: f7fd f9c9 bl 802ab88 <dhcp_fine_tmr>
  39812. sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
  39813. 802d7f6: 4904 ldr r1, [pc, #16] ; (802d808 <dhcp_timer_fine+0x18>)
  39814. 802d7f8: f44f 70fa mov.w r0, #500 ; 0x1f4
  39815. 802d7fc: 2200 movs r2, #0
  39816. }
  39817. 802d7fe: e8bd 4008 ldmia.w sp!, {r3, lr}
  39818. dhcp_timer_fine(void *arg)
  39819. {
  39820. LWIP_UNUSED_ARG(arg);
  39821. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_fine_tmr()\n"));
  39822. dhcp_fine_tmr();
  39823. sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
  39824. 802d802: f7ff bfab b.w 802d75c <sys_timeout>
  39825. 802d806: bf00 nop
  39826. 802d808: 0802d7f1 .word 0x0802d7f1
  39827. 0802d80c <dhcp_timer_coarse>:
  39828. *
  39829. * @param arg unused argument
  39830. */
  39831. static void
  39832. dhcp_timer_coarse(void *arg)
  39833. {
  39834. 802d80c: b508 push {r3, lr}
  39835. LWIP_UNUSED_ARG(arg);
  39836. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_coarse_tmr()\n"));
  39837. dhcp_coarse_tmr();
  39838. 802d80e: f7fd f939 bl 802aa84 <dhcp_coarse_tmr>
  39839. sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
  39840. 802d812: 4904 ldr r1, [pc, #16] ; (802d824 <dhcp_timer_coarse+0x18>)
  39841. 802d814: f64e 2060 movw r0, #60000 ; 0xea60
  39842. 802d818: 2200 movs r2, #0
  39843. }
  39844. 802d81a: e8bd 4008 ldmia.w sp!, {r3, lr}
  39845. dhcp_timer_coarse(void *arg)
  39846. {
  39847. LWIP_UNUSED_ARG(arg);
  39848. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_coarse_tmr()\n"));
  39849. dhcp_coarse_tmr();
  39850. sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
  39851. 802d81e: f7ff bf9d b.w 802d75c <sys_timeout>
  39852. 802d822: bf00 nop
  39853. 802d824: 0802d80d .word 0x0802d80d
  39854. 0802d828 <arp_timer>:
  39855. *
  39856. * @param arg unused argument
  39857. */
  39858. static void
  39859. arp_timer(void *arg)
  39860. {
  39861. 802d828: b508 push {r3, lr}
  39862. LWIP_UNUSED_ARG(arg);
  39863. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: etharp_tmr()\n"));
  39864. etharp_tmr();
  39865. 802d82a: f004 fcfb bl 8032224 <etharp_tmr>
  39866. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  39867. 802d82e: 4904 ldr r1, [pc, #16] ; (802d840 <arp_timer+0x18>)
  39868. 802d830: f241 3088 movw r0, #5000 ; 0x1388
  39869. 802d834: 2200 movs r2, #0
  39870. }
  39871. 802d836: e8bd 4008 ldmia.w sp!, {r3, lr}
  39872. arp_timer(void *arg)
  39873. {
  39874. LWIP_UNUSED_ARG(arg);
  39875. LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: etharp_tmr()\n"));
  39876. etharp_tmr();
  39877. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  39878. 802d83a: f7ff bf8f b.w 802d75c <sys_timeout>
  39879. 802d83e: bf00 nop
  39880. 802d840: 0802d829 .word 0x0802d829
  39881. 0802d844 <tcp_timer_needed>:
  39882. */
  39883. void
  39884. tcp_timer_needed(void)
  39885. {
  39886. /* timer is off but needed again? */
  39887. if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
  39888. 802d844: 4b08 ldr r3, [pc, #32] ; (802d868 <tcp_timer_needed+0x24>)
  39889. 802d846: 681b ldr r3, [r3, #0]
  39890. 802d848: b96b cbnz r3, 802d866 <tcp_timer_needed+0x22>
  39891. 802d84a: 4b08 ldr r3, [pc, #32] ; (802d86c <tcp_timer_needed+0x28>)
  39892. 802d84c: 681b ldr r3, [r3, #0]
  39893. 802d84e: b913 cbnz r3, 802d856 <tcp_timer_needed+0x12>
  39894. 802d850: 4b07 ldr r3, [pc, #28] ; (802d870 <tcp_timer_needed+0x2c>)
  39895. 802d852: 681b ldr r3, [r3, #0]
  39896. 802d854: b13b cbz r3, 802d866 <tcp_timer_needed+0x22>
  39897. /* enable and start timer */
  39898. tcpip_tcp_timer_active = 1;
  39899. 802d856: 4b04 ldr r3, [pc, #16] ; (802d868 <tcp_timer_needed+0x24>)
  39900. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  39901. 802d858: 4906 ldr r1, [pc, #24] ; (802d874 <tcp_timer_needed+0x30>)
  39902. tcp_timer_needed(void)
  39903. {
  39904. /* timer is off but needed again? */
  39905. if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
  39906. /* enable and start timer */
  39907. tcpip_tcp_timer_active = 1;
  39908. 802d85a: 2201 movs r2, #1
  39909. 802d85c: 601a str r2, [r3, #0]
  39910. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  39911. 802d85e: 20fa movs r0, #250 ; 0xfa
  39912. 802d860: 2200 movs r2, #0
  39913. 802d862: f7ff bf7b b.w 802d75c <sys_timeout>
  39914. 802d866: 4770 bx lr
  39915. 802d868: 2000e0d0 .word 0x2000e0d0
  39916. 802d86c: 20010d78 .word 0x20010d78
  39917. 802d870: 20010d8c .word 0x20010d8c
  39918. 802d874: 0802d879 .word 0x0802d879
  39919. 0802d878 <tcpip_tcp_timer>:
  39920. *
  39921. * @param arg unused argument
  39922. */
  39923. static void
  39924. tcpip_tcp_timer(void *arg)
  39925. {
  39926. 802d878: b508 push {r3, lr}
  39927. LWIP_UNUSED_ARG(arg);
  39928. /* call TCP timer handler */
  39929. tcp_tmr();
  39930. 802d87a: f7fe fad3 bl 802be24 <tcp_tmr>
  39931. /* timer still needed? */
  39932. if (tcp_active_pcbs || tcp_tw_pcbs) {
  39933. 802d87e: 4b08 ldr r3, [pc, #32] ; (802d8a0 <tcpip_tcp_timer+0x28>)
  39934. 802d880: 681b ldr r3, [r3, #0]
  39935. 802d882: b913 cbnz r3, 802d88a <tcpip_tcp_timer+0x12>
  39936. 802d884: 4b07 ldr r3, [pc, #28] ; (802d8a4 <tcpip_tcp_timer+0x2c>)
  39937. 802d886: 681b ldr r3, [r3, #0]
  39938. 802d888: b133 cbz r3, 802d898 <tcpip_tcp_timer+0x20>
  39939. /* restart timer */
  39940. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  39941. 802d88a: 4907 ldr r1, [pc, #28] ; (802d8a8 <tcpip_tcp_timer+0x30>)
  39942. 802d88c: 20fa movs r0, #250 ; 0xfa
  39943. 802d88e: 2200 movs r2, #0
  39944. } else {
  39945. /* disable timer */
  39946. tcpip_tcp_timer_active = 0;
  39947. }
  39948. }
  39949. 802d890: e8bd 4008 ldmia.w sp!, {r3, lr}
  39950. /* call TCP timer handler */
  39951. tcp_tmr();
  39952. /* timer still needed? */
  39953. if (tcp_active_pcbs || tcp_tw_pcbs) {
  39954. /* restart timer */
  39955. sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  39956. 802d894: f7ff bf62 b.w 802d75c <sys_timeout>
  39957. } else {
  39958. /* disable timer */
  39959. tcpip_tcp_timer_active = 0;
  39960. 802d898: 4a04 ldr r2, [pc, #16] ; (802d8ac <tcpip_tcp_timer+0x34>)
  39961. 802d89a: 6013 str r3, [r2, #0]
  39962. 802d89c: bd08 pop {r3, pc}
  39963. 802d89e: bf00 nop
  39964. 802d8a0: 20010d78 .word 0x20010d78
  39965. 802d8a4: 20010d8c .word 0x20010d8c
  39966. 802d8a8: 0802d879 .word 0x0802d879
  39967. 802d8ac: 2000e0d0 .word 0x2000e0d0
  39968. 0802d8b0 <sys_untimeout>:
  39969. void
  39970. sys_untimeout(sys_timeout_handler handler, void *arg)
  39971. {
  39972. struct sys_timeo *prev_t, *t;
  39973. if (next_timeout == NULL) {
  39974. 802d8b0: 4b10 ldr r3, [pc, #64] ; (802d8f4 <sys_untimeout+0x44>)
  39975. 802d8b2: 681b ldr r3, [r3, #0]
  39976. * @param handler callback function that would be called by the timeout
  39977. * @param arg callback argument that would be passed to handler
  39978. */
  39979. void
  39980. sys_untimeout(sys_timeout_handler handler, void *arg)
  39981. {
  39982. 802d8b4: b510 push {r4, lr}
  39983. struct sys_timeo *prev_t, *t;
  39984. if (next_timeout == NULL) {
  39985. 802d8b6: b1e3 cbz r3, 802d8f2 <sys_untimeout+0x42>
  39986. 802d8b8: 2200 movs r2, #0
  39987. 802d8ba: e000 b.n 802d8be <sys_untimeout+0xe>
  39988. return;
  39989. }
  39990. for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next) {
  39991. 802d8bc: 4623 mov r3, r4
  39992. if ((t->h == handler) && (t->arg == arg)) {
  39993. 802d8be: 689c ldr r4, [r3, #8]
  39994. 802d8c0: 4284 cmp r4, r0
  39995. 802d8c2: d112 bne.n 802d8ea <sys_untimeout+0x3a>
  39996. 802d8c4: 68dc ldr r4, [r3, #12]
  39997. 802d8c6: 428c cmp r4, r1
  39998. 802d8c8: d10f bne.n 802d8ea <sys_untimeout+0x3a>
  39999. 802d8ca: 6819 ldr r1, [r3, #0]
  40000. /* We have a match */
  40001. /* Unlink from previous in list */
  40002. if (prev_t == NULL) {
  40003. 802d8cc: b902 cbnz r2, 802d8d0 <sys_untimeout+0x20>
  40004. next_timeout = t->next;
  40005. 802d8ce: 4a09 ldr r2, [pc, #36] ; (802d8f4 <sys_untimeout+0x44>)
  40006. } else {
  40007. prev_t->next = t->next;
  40008. 802d8d0: 6011 str r1, [r2, #0]
  40009. }
  40010. /* If not the last one, add time of this one back to next */
  40011. if (t->next != NULL) {
  40012. 802d8d2: 681a ldr r2, [r3, #0]
  40013. 802d8d4: b11a cbz r2, 802d8de <sys_untimeout+0x2e>
  40014. t->next->time += t->time;
  40015. 802d8d6: 6850 ldr r0, [r2, #4]
  40016. 802d8d8: 6859 ldr r1, [r3, #4]
  40017. 802d8da: 1841 adds r1, r0, r1
  40018. 802d8dc: 6051 str r1, [r2, #4]
  40019. }
  40020. memp_free(MEMP_SYS_TIMEOUT, t);
  40021. 802d8de: 2009 movs r0, #9
  40022. 802d8e0: 4619 mov r1, r3
  40023. return;
  40024. }
  40025. }
  40026. return;
  40027. }
  40028. 802d8e2: e8bd 4010 ldmia.w sp!, {r4, lr}
  40029. }
  40030. /* If not the last one, add time of this one back to next */
  40031. if (t->next != NULL) {
  40032. t->next->time += t->time;
  40033. }
  40034. memp_free(MEMP_SYS_TIMEOUT, t);
  40035. 802d8e6: f7fd bba9 b.w 802b03c <memp_free>
  40036. if (next_timeout == NULL) {
  40037. return;
  40038. }
  40039. for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next) {
  40040. 802d8ea: 681c ldr r4, [r3, #0]
  40041. 802d8ec: 461a mov r2, r3
  40042. 802d8ee: 2c00 cmp r4, #0
  40043. 802d8f0: d1e4 bne.n 802d8bc <sys_untimeout+0xc>
  40044. 802d8f2: bd10 pop {r4, pc}
  40045. 802d8f4: 2000e0d4 .word 0x2000e0d4
  40046. 0802d8f8 <sys_timeouts_mbox_fetch>:
  40047. * @param mbox the mbox to fetch the message from
  40048. * @param msg the place to store the message
  40049. */
  40050. void
  40051. sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg)
  40052. {
  40053. 802d8f8: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  40054. struct sys_timeo *tmptimeout;
  40055. sys_timeout_handler handler;
  40056. void *arg;
  40057. again:
  40058. if (!next_timeout) {
  40059. 802d8fc: 4e18 ldr r6, [pc, #96] ; (802d960 <sys_timeouts_mbox_fetch+0x68>)
  40060. * @param mbox the mbox to fetch the message from
  40061. * @param msg the place to store the message
  40062. */
  40063. void
  40064. sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg)
  40065. {
  40066. 802d8fe: 4604 mov r4, r0
  40067. 802d900: 460d mov r5, r1
  40068. 802d902: 4637 mov r7, r6
  40069. struct sys_timeo *tmptimeout;
  40070. sys_timeout_handler handler;
  40071. void *arg;
  40072. again:
  40073. if (!next_timeout) {
  40074. 802d904: 6832 ldr r2, [r6, #0]
  40075. 802d906: b92a cbnz r2, 802d914 <sys_timeouts_mbox_fetch+0x1c>
  40076. time_needed = sys_arch_mbox_fetch(mbox, msg, 0);
  40077. 802d908: 4620 mov r0, r4
  40078. 802d90a: 4629 mov r1, r5
  40079. } else {
  40080. next_timeout->time = 0;
  40081. }
  40082. }
  40083. }
  40084. }
  40085. 802d90c: e8bd 43f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  40086. sys_timeout_handler handler;
  40087. void *arg;
  40088. again:
  40089. if (!next_timeout) {
  40090. time_needed = sys_arch_mbox_fetch(mbox, msg, 0);
  40091. 802d910: f005 b8b4 b.w 8032a7c <sys_arch_mbox_fetch>
  40092. } else {
  40093. if (next_timeout->time > 0) {
  40094. 802d914: 6852 ldr r2, [r2, #4]
  40095. 802d916: b96a cbnz r2, 802d934 <sys_timeouts_mbox_fetch+0x3c>
  40096. if (time_needed == SYS_ARCH_TIMEOUT) {
  40097. /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
  40098. could be fetched. We should now call the timeout handler and
  40099. deallocate the memory allocated for the timeout. */
  40100. tmptimeout = next_timeout;
  40101. 802d918: 6839 ldr r1, [r7, #0]
  40102. next_timeout = tmptimeout->next;
  40103. 802d91a: 680a ldr r2, [r1, #0]
  40104. handler = tmptimeout->h;
  40105. 802d91c: f8d1 8008 ldr.w r8, [r1, #8]
  40106. if (time_needed == SYS_ARCH_TIMEOUT) {
  40107. /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
  40108. could be fetched. We should now call the timeout handler and
  40109. deallocate the memory allocated for the timeout. */
  40110. tmptimeout = next_timeout;
  40111. next_timeout = tmptimeout->next;
  40112. 802d920: 603a str r2, [r7, #0]
  40113. if (handler != NULL) {
  40114. LWIP_DEBUGF(TIMERS_DEBUG, ("stmf calling h=%s arg=%p\n",
  40115. tmptimeout->handler_name, arg));
  40116. }
  40117. #endif /* LWIP_DEBUG_TIMERNAMES */
  40118. memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
  40119. 802d922: 2009 movs r0, #9
  40120. could be fetched. We should now call the timeout handler and
  40121. deallocate the memory allocated for the timeout. */
  40122. tmptimeout = next_timeout;
  40123. next_timeout = tmptimeout->next;
  40124. handler = tmptimeout->h;
  40125. arg = tmptimeout->arg;
  40126. 802d924: f8d1 900c ldr.w r9, [r1, #12]
  40127. if (handler != NULL) {
  40128. LWIP_DEBUGF(TIMERS_DEBUG, ("stmf calling h=%s arg=%p\n",
  40129. tmptimeout->handler_name, arg));
  40130. }
  40131. #endif /* LWIP_DEBUG_TIMERNAMES */
  40132. memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
  40133. 802d928: f7fd fb88 bl 802b03c <memp_free>
  40134. if (handler != NULL) {
  40135. 802d92c: f1b8 0f00 cmp.w r8, #0
  40136. 802d930: d0e8 beq.n 802d904 <sys_timeouts_mbox_fetch+0xc>
  40137. 802d932: e006 b.n 802d942 <sys_timeouts_mbox_fetch+0x4a>
  40138. again:
  40139. if (!next_timeout) {
  40140. time_needed = sys_arch_mbox_fetch(mbox, msg, 0);
  40141. } else {
  40142. if (next_timeout->time > 0) {
  40143. time_needed = sys_arch_mbox_fetch(mbox, msg, next_timeout->time);
  40144. 802d934: 4620 mov r0, r4
  40145. 802d936: 4629 mov r1, r5
  40146. 802d938: f005 f8a0 bl 8032a7c <sys_arch_mbox_fetch>
  40147. } else {
  40148. time_needed = SYS_ARCH_TIMEOUT;
  40149. }
  40150. if (time_needed == SYS_ARCH_TIMEOUT) {
  40151. 802d93c: 1c43 adds r3, r0, #1
  40152. 802d93e: d0eb beq.n 802d918 <sys_timeouts_mbox_fetch+0x20>
  40153. 802d940: e002 b.n 802d948 <sys_timeouts_mbox_fetch+0x50>
  40154. memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
  40155. if (handler != NULL) {
  40156. /* For LWIP_TCPIP_CORE_LOCKING, lock the core before calling the
  40157. timeout handler function. */
  40158. LOCK_TCPIP_CORE();
  40159. handler(arg);
  40160. 802d942: 4648 mov r0, r9
  40161. 802d944: 47c0 blx r8
  40162. 802d946: e7dd b.n 802d904 <sys_timeouts_mbox_fetch+0xc>
  40163. goto again;
  40164. } else {
  40165. /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout
  40166. occured. The time variable is set to the number of
  40167. milliseconds we waited for the message. */
  40168. if (time_needed < next_timeout->time) {
  40169. 802d948: 4b05 ldr r3, [pc, #20] ; (802d960 <sys_timeouts_mbox_fetch+0x68>)
  40170. 802d94a: 681b ldr r3, [r3, #0]
  40171. 802d94c: 6859 ldr r1, [r3, #4]
  40172. 802d94e: 4288 cmp r0, r1
  40173. next_timeout->time -= time_needed;
  40174. 802d950: bf34 ite cc
  40175. 802d952: ebc0 0201 rsbcc r2, r0, r1
  40176. } else {
  40177. next_timeout->time = 0;
  40178. 802d956: 2200 movcs r2, #0
  40179. 802d958: 605a str r2, [r3, #4]
  40180. 802d95a: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  40181. 802d95e: bf00 nop
  40182. 802d960: 2000e0d4 .word 0x2000e0d4
  40183. 0802d964 <udp_init>:
  40184. /**
  40185. * Initialize this module.
  40186. */
  40187. void
  40188. udp_init(void)
  40189. {
  40190. 802d964: 4770 bx lr
  40191. 802d966: 0000 movs r0, r0
  40192. 0802d968 <udp_input>:
  40193. * @param inp network interface on which the datagram was received.
  40194. *
  40195. */
  40196. void
  40197. udp_input(struct pbuf *p, struct netif *inp)
  40198. {
  40199. 802d968: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  40200. PERF_START;
  40201. UDP_STATS_INC(udp.recv);
  40202. iphdr = (struct ip_hdr *)p->payload;
  40203. 802d96c: f8d0 9004 ldr.w r9, [r0, #4]
  40204. /* Check minimum length (IP header + UDP header)
  40205. * and move payload pointer to UDP header */
  40206. if (p->tot_len < (IPH_HL(iphdr) * 4 + UDP_HLEN) || pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4))) {
  40207. 802d970: 8903 ldrh r3, [r0, #8]
  40208. * @param inp network interface on which the datagram was received.
  40209. *
  40210. */
  40211. void
  40212. udp_input(struct pbuf *p, struct netif *inp)
  40213. {
  40214. 802d972: 460e mov r6, r1
  40215. iphdr = (struct ip_hdr *)p->payload;
  40216. /* Check minimum length (IP header + UDP header)
  40217. * and move payload pointer to UDP header */
  40218. if (p->tot_len < (IPH_HL(iphdr) * 4 + UDP_HLEN) || pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4))) {
  40219. 802d974: f899 1000 ldrb.w r1, [r9]
  40220. 802d978: f001 010f and.w r1, r1, #15
  40221. 802d97c: 1c8a adds r2, r1, #2
  40222. 802d97e: ebb3 0f82 cmp.w r3, r2, lsl #2
  40223. * @param inp network interface on which the datagram was received.
  40224. *
  40225. */
  40226. void
  40227. udp_input(struct pbuf *p, struct netif *inp)
  40228. {
  40229. 802d982: b085 sub sp, #20
  40230. 802d984: 4605 mov r5, r0
  40231. iphdr = (struct ip_hdr *)p->payload;
  40232. /* Check minimum length (IP header + UDP header)
  40233. * and move payload pointer to UDP header */
  40234. if (p->tot_len < (IPH_HL(iphdr) * 4 + UDP_HLEN) || pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4))) {
  40235. 802d986: db05 blt.n 802d994 <udp_input+0x2c>
  40236. 802d988: 0089 lsls r1, r1, #2
  40237. 802d98a: 4249 negs r1, r1
  40238. 802d98c: f7fd fc35 bl 802b1fa <pbuf_header>
  40239. 802d990: 4683 mov fp, r0
  40240. 802d992: b110 cbz r0, 802d99a <udp_input+0x32>
  40241. /* drop short packets */
  40242. LWIP_DEBUGF(UDP_DEBUG,
  40243. ("udp_input: short UDP datagram (%"U16_F" bytes) discarded\n", p->tot_len));
  40244. UDP_STATS_INC(udp.lenerr);
  40245. UDP_STATS_INC(udp.drop);
  40246. snmp_inc_udpinerrors();
  40247. 802d994: f002 fa6c bl 802fe70 <snmp_inc_udpinerrors>
  40248. 802d998: e096 b.n 802dac8 <udp_input+0x160>
  40249. }
  40250. udphdr = (struct udp_hdr *)p->payload;
  40251. /* is broadcast packet ? */
  40252. broadcast = ip_addr_isbroadcast(&current_iphdr_dest, inp);
  40253. 802d99a: f8df a150 ldr.w sl, [pc, #336] ; 802daec <udp_input+0x184>
  40254. snmp_inc_udpinerrors();
  40255. pbuf_free(p);
  40256. goto end;
  40257. }
  40258. udphdr = (struct udp_hdr *)p->payload;
  40259. 802d99e: 686c ldr r4, [r5, #4]
  40260. /* is broadcast packet ? */
  40261. broadcast = ip_addr_isbroadcast(&current_iphdr_dest, inp);
  40262. 802d9a0: f8da 0000 ldr.w r0, [sl]
  40263. 802d9a4: 4631 mov r1, r6
  40264. 802d9a6: f000 faed bl 802df84 <ip4_addr_isbroadcast>
  40265. 802d9aa: 4680 mov r8, r0
  40266. LWIP_DEBUGF(UDP_DEBUG, ("udp_input: received datagram of length %"U16_F"\n", p->tot_len));
  40267. /* convert src and dest ports to host byte order */
  40268. src = ntohs(udphdr->src);
  40269. 802d9ac: 8820 ldrh r0, [r4, #0]
  40270. 802d9ae: f7fc fb16 bl 8029fde <lwip_ntohs>
  40271. 802d9b2: 4607 mov r7, r0
  40272. dest = ntohs(udphdr->dest);
  40273. 802d9b4: 8860 ldrh r0, [r4, #2]
  40274. 802d9b6: f7fc fb12 bl 8029fde <lwip_ntohs>
  40275. #if LWIP_DHCP
  40276. pcb = NULL;
  40277. /* when LWIP_DHCP is active, packets to DHCP_CLIENT_PORT may only be processed by
  40278. the dhcp module, no other UDP pcb may use the local UDP port DHCP_CLIENT_PORT */
  40279. if (dest == DHCP_CLIENT_PORT) {
  40280. 802d9ba: 2844 cmp r0, #68 ; 0x44
  40281. 802d9bc: d10f bne.n 802d9de <udp_input+0x76>
  40282. /* all packets for DHCP_CLIENT_PORT not coming from DHCP_SERVER_PORT are dropped! */
  40283. if (src == DHCP_SERVER_PORT) {
  40284. 802d9be: 2f43 cmp r7, #67 ; 0x43
  40285. 802d9c0: d14f bne.n 802da62 <udp_input+0xfa>
  40286. if ((inp->dhcp != NULL) && (inp->dhcp->pcb != NULL)) {
  40287. 802d9c2: 6a33 ldr r3, [r6, #32]
  40288. 802d9c4: 2b00 cmp r3, #0
  40289. 802d9c6: d04c beq.n 802da62 <udp_input+0xfa>
  40290. 802d9c8: 685c ldr r4, [r3, #4]
  40291. 802d9ca: 2c00 cmp r4, #0
  40292. 802d9cc: d049 beq.n 802da62 <udp_input+0xfa>
  40293. /* accept the packe if
  40294. (- broadcast or directed to us) -> DHCP is link-layer-addressed, local ip is always ANY!
  40295. - inp->dhcp->pcb->remote == ANY or iphdr->src */
  40296. if ((ip_addr_isany(&inp->dhcp->pcb->remote_ip) ||
  40297. 802d9ce: 6863 ldr r3, [r4, #4]
  40298. 802d9d0: 2b00 cmp r3, #0
  40299. 802d9d2: d04e beq.n 802da72 <udp_input+0x10a>
  40300. ip_addr_cmp(&(inp->dhcp->pcb->remote_ip), &current_iphdr_src))) {
  40301. 802d9d4: 4a43 ldr r2, [pc, #268] ; (802dae4 <udp_input+0x17c>)
  40302. if (src == DHCP_SERVER_PORT) {
  40303. if ((inp->dhcp != NULL) && (inp->dhcp->pcb != NULL)) {
  40304. /* accept the packe if
  40305. (- broadcast or directed to us) -> DHCP is link-layer-addressed, local ip is always ANY!
  40306. - inp->dhcp->pcb->remote == ANY or iphdr->src */
  40307. if ((ip_addr_isany(&inp->dhcp->pcb->remote_ip) ||
  40308. 802d9d6: 6812 ldr r2, [r2, #0]
  40309. 802d9d8: 4293 cmp r3, r2
  40310. 802d9da: d142 bne.n 802da62 <udp_input+0xfa>
  40311. 802d9dc: e049 b.n 802da72 <udp_input+0x10a>
  40312. uncon_pcb = NULL;
  40313. /* Iterate through the UDP pcb list for a matching pcb.
  40314. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  40315. * preferred. If no perfect match is found, the first unconnected pcb that
  40316. * matches the local port and ip address gets the datagram. */
  40317. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  40318. 802d9de: 4b42 ldr r3, [pc, #264] ; (802dae8 <udp_input+0x180>)
  40319. /* compare PCB local addr+port to UDP destination addr+port */
  40320. if (pcb->local_port == dest) {
  40321. if (
  40322. (!broadcast && ip_addr_isany(&pcb->local_ip)) ||
  40323. ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest) ||
  40324. 802d9e0: f8da a000 ldr.w sl, [sl]
  40325. uncon_pcb = NULL;
  40326. /* Iterate through the UDP pcb list for a matching pcb.
  40327. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  40328. * preferred. If no perfect match is found, the first unconnected pcb that
  40329. * matches the local port and ip address gets the datagram. */
  40330. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  40331. 802d9e4: f8d3 c000 ldr.w ip, [r3]
  40332. }
  40333. /* compare PCB remote addr+port to UDP source addr+port */
  40334. if ((local_match != 0) &&
  40335. (pcb->remote_port == src) &&
  40336. (ip_addr_isany(&pcb->remote_ip) ||
  40337. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src))) {
  40338. 802d9e8: 4b3e ldr r3, [pc, #248] ; (802dae4 <udp_input+0x17c>)
  40339. 802d9ea: 681b ldr r3, [r3, #0]
  40340. uncon_pcb = NULL;
  40341. /* Iterate through the UDP pcb list for a matching pcb.
  40342. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  40343. * preferred. If no perfect match is found, the first unconnected pcb that
  40344. * matches the local port and ip address gets the datagram. */
  40345. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  40346. 802d9ec: 4664 mov r4, ip
  40347. }
  40348. /* compare PCB remote addr+port to UDP source addr+port */
  40349. if ((local_match != 0) &&
  40350. (pcb->remote_port == src) &&
  40351. (ip_addr_isany(&pcb->remote_ip) ||
  40352. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src))) {
  40353. 802d9ee: 9303 str r3, [sp, #12]
  40354. }
  40355. }
  40356. } else
  40357. #endif /* LWIP_DHCP */
  40358. {
  40359. prev = NULL;
  40360. 802d9f0: 4659 mov r1, fp
  40361. local_match = 0;
  40362. uncon_pcb = NULL;
  40363. 802d9f2: 465b mov r3, fp
  40364. /* Iterate through the UDP pcb list for a matching pcb.
  40365. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  40366. * preferred. If no perfect match is found, the first unconnected pcb that
  40367. * matches the local port and ip address gets the datagram. */
  40368. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  40369. 802d9f4: e032 b.n 802da5c <udp_input+0xf4>
  40370. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip), pcb->local_port,
  40371. ip4_addr1_16(&pcb->remote_ip), ip4_addr2_16(&pcb->remote_ip),
  40372. ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip), pcb->remote_port));
  40373. /* compare PCB local addr+port to UDP destination addr+port */
  40374. if (pcb->local_port == dest) {
  40375. 802d9f6: 8a62 ldrh r2, [r4, #18]
  40376. 802d9f8: 4282 cmp r2, r0
  40377. 802d9fa: d12d bne.n 802da58 <udp_input+0xf0>
  40378. 802d9fc: 6822 ldr r2, [r4, #0]
  40379. if (
  40380. 802d9fe: f1b8 0f00 cmp.w r8, #0
  40381. 802da02: d100 bne.n 802da06 <udp_input+0x9e>
  40382. (!broadcast && ip_addr_isany(&pcb->local_ip)) ||
  40383. 802da04: b15a cbz r2, 802da1e <udp_input+0xb6>
  40384. 802da06: 4552 cmp r2, sl
  40385. 802da08: d009 beq.n 802da1e <udp_input+0xb6>
  40386. ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest) ||
  40387. 802da0a: f1b8 0f00 cmp.w r8, #0
  40388. 802da0e: d023 beq.n 802da58 <udp_input+0xf0>
  40389. (broadcast && ip_get_option(pcb, SOF_BROADCAST) &&
  40390. (ip_addr_isany(&pcb->local_ip) ||
  40391. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  40392. #else /* IP_SOF_BROADCAST_RECV */
  40393. (broadcast &&
  40394. (ip_addr_isany(&pcb->local_ip) ||
  40395. 802da10: b12a cbz r2, 802da1e <udp_input+0xb6>
  40396. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  40397. 802da12: ea8a 0b02 eor.w fp, sl, r2
  40398. 802da16: 68b2 ldr r2, [r6, #8]
  40399. (broadcast && ip_get_option(pcb, SOF_BROADCAST) &&
  40400. (ip_addr_isany(&pcb->local_ip) ||
  40401. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  40402. #else /* IP_SOF_BROADCAST_RECV */
  40403. (broadcast &&
  40404. (ip_addr_isany(&pcb->local_ip) ||
  40405. 802da18: ea1b 0f02 tst.w fp, r2
  40406. 802da1c: d11c bne.n 802da58 <udp_input+0xf0>
  40407. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  40408. #endif /* IP_SOF_BROADCAST_RECV */
  40409. local_match = 1;
  40410. if ((uncon_pcb == NULL) &&
  40411. 802da1e: 2b00 cmp r3, #0
  40412. 802da20: d158 bne.n 802dad4 <udp_input+0x16c>
  40413. ((pcb->flags & UDP_FLAGS_CONNECTED) == 0)) {
  40414. 802da22: 7c23 ldrb r3, [r4, #16]
  40415. (broadcast &&
  40416. (ip_addr_isany(&pcb->local_ip) ||
  40417. ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
  40418. #endif /* IP_SOF_BROADCAST_RECV */
  40419. local_match = 1;
  40420. if ((uncon_pcb == NULL) &&
  40421. 802da24: f003 0304 and.w r3, r3, #4
  40422. 802da28: b2db uxtb r3, r3
  40423. 802da2a: 2b00 cmp r3, #0
  40424. 802da2c: bf0c ite eq
  40425. 802da2e: 4623 moveq r3, r4
  40426. 802da30: 2300 movne r3, #0
  40427. 802da32: e04f b.n 802dad4 <udp_input+0x16c>
  40428. }
  40429. }
  40430. /* compare PCB remote addr+port to UDP source addr+port */
  40431. if ((local_match != 0) &&
  40432. (pcb->remote_port == src) &&
  40433. (ip_addr_isany(&pcb->remote_ip) ||
  40434. 802da34: f8d4 b004 ldr.w fp, [r4, #4]
  40435. 802da38: f1bb 0f00 cmp.w fp, #0
  40436. 802da3c: d101 bne.n 802da42 <udp_input+0xda>
  40437. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src))) {
  40438. /* the first fully matching PCB */
  40439. if (prev != NULL) {
  40440. 802da3e: b921 cbnz r1, 802da4a <udp_input+0xe2>
  40441. 802da40: e017 b.n 802da72 <udp_input+0x10a>
  40442. }
  40443. }
  40444. /* compare PCB remote addr+port to UDP source addr+port */
  40445. if ((local_match != 0) &&
  40446. (pcb->remote_port == src) &&
  40447. (ip_addr_isany(&pcb->remote_ip) ||
  40448. 802da42: 9a03 ldr r2, [sp, #12]
  40449. 802da44: 4593 cmp fp, r2
  40450. 802da46: d107 bne.n 802da58 <udp_input+0xf0>
  40451. 802da48: e7f9 b.n 802da3e <udp_input+0xd6>
  40452. ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src))) {
  40453. /* the first fully matching PCB */
  40454. if (prev != NULL) {
  40455. /* move the pcb to the front of udp_pcbs so that is
  40456. found faster next time */
  40457. prev->next = pcb->next;
  40458. 802da4a: 68e3 ldr r3, [r4, #12]
  40459. 802da4c: 60cb str r3, [r1, #12]
  40460. pcb->next = udp_pcbs;
  40461. udp_pcbs = pcb;
  40462. 802da4e: 4b26 ldr r3, [pc, #152] ; (802dae8 <udp_input+0x180>)
  40463. /* the first fully matching PCB */
  40464. if (prev != NULL) {
  40465. /* move the pcb to the front of udp_pcbs so that is
  40466. found faster next time */
  40467. prev->next = pcb->next;
  40468. pcb->next = udp_pcbs;
  40469. 802da50: f8c4 c00c str.w ip, [r4, #12]
  40470. udp_pcbs = pcb;
  40471. 802da54: 601c str r4, [r3, #0]
  40472. 802da56: e00c b.n 802da72 <udp_input+0x10a>
  40473. 802da58: 4621 mov r1, r4
  40474. uncon_pcb = NULL;
  40475. /* Iterate through the UDP pcb list for a matching pcb.
  40476. * 'Perfect match' pcbs (connected to the remote port & ip address) are
  40477. * preferred. If no perfect match is found, the first unconnected pcb that
  40478. * matches the local port and ip address gets the datagram. */
  40479. for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  40480. 802da5a: 68e4 ldr r4, [r4, #12]
  40481. 802da5c: 2c00 cmp r4, #0
  40482. 802da5e: d1ca bne.n 802d9f6 <udp_input+0x8e>
  40483. pcb = uncon_pcb;
  40484. }
  40485. }
  40486. /* Check checksum if this is a match or if it was directed at us. */
  40487. if (pcb != NULL || ip_addr_cmp(&inp->ip_addr, &current_iphdr_dest)) {
  40488. 802da60: b933 cbnz r3, 802da70 <udp_input+0x108>
  40489. 802da62: 4b22 ldr r3, [pc, #136] ; (802daec <udp_input+0x184>)
  40490. 802da64: 6872 ldr r2, [r6, #4]
  40491. 802da66: 681b ldr r3, [r3, #0]
  40492. 802da68: 429a cmp r2, r3
  40493. 802da6a: d12d bne.n 802dac8 <udp_input+0x160>
  40494. 802da6c: 2400 movs r4, #0
  40495. 802da6e: e000 b.n 802da72 <udp_input+0x10a>
  40496. 802da70: 461c mov r4, r3
  40497. goto end;
  40498. }
  40499. }
  40500. #endif /* CHECKSUM_CHECK_UDP */
  40501. }
  40502. if(pbuf_header(p, -UDP_HLEN)) {
  40503. 802da72: 4628 mov r0, r5
  40504. 802da74: f06f 0107 mvn.w r1, #7
  40505. 802da78: f7fd fbbf bl 802b1fa <pbuf_header>
  40506. 802da7c: 2800 cmp r0, #0
  40507. 802da7e: d189 bne.n 802d994 <udp_input+0x2c>
  40508. UDP_STATS_INC(udp.drop);
  40509. snmp_inc_udpinerrors();
  40510. pbuf_free(p);
  40511. goto end;
  40512. }
  40513. if (pcb != NULL) {
  40514. 802da80: b154 cbz r4, 802da98 <udp_input+0x130>
  40515. snmp_inc_udpindatagrams();
  40516. 802da82: f002 f9e5 bl 802fe50 <snmp_inc_udpindatagrams>
  40517. pbuf_header(p, -(s16_t)((IPH_HL(iphdr) * 4) + UDP_HLEN));
  40518. }
  40519. }
  40520. #endif /* SO_REUSE && SO_REUSE_RXTOALL */
  40521. /* callback */
  40522. if (pcb->recv != NULL) {
  40523. 802da86: 69a6 ldr r6, [r4, #24]
  40524. 802da88: b1f6 cbz r6, 802dac8 <udp_input+0x160>
  40525. /* now the recv function is responsible for freeing p */
  40526. pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src);
  40527. 802da8a: 9700 str r7, [sp, #0]
  40528. 802da8c: 69e0 ldr r0, [r4, #28]
  40529. 802da8e: 4b15 ldr r3, [pc, #84] ; (802dae4 <udp_input+0x17c>)
  40530. 802da90: 4621 mov r1, r4
  40531. 802da92: 462a mov r2, r5
  40532. 802da94: 47b0 blx r6
  40533. 802da96: e021 b.n 802dadc <udp_input+0x174>
  40534. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n"));
  40535. #if LWIP_ICMP
  40536. /* No match was found, send ICMP destination port unreachable unless
  40537. destination address was broadcast/multicast. */
  40538. if (!broadcast &&
  40539. 802da98: f1b8 0f00 cmp.w r8, #0
  40540. 802da9c: d112 bne.n 802dac4 <udp_input+0x15c>
  40541. !ip_addr_ismulticast(&current_iphdr_dest)) {
  40542. 802da9e: 4b13 ldr r3, [pc, #76] ; (802daec <udp_input+0x184>)
  40543. 802daa0: 681b ldr r3, [r3, #0]
  40544. 802daa2: f003 03f0 and.w r3, r3, #240 ; 0xf0
  40545. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n"));
  40546. #if LWIP_ICMP
  40547. /* No match was found, send ICMP destination port unreachable unless
  40548. destination address was broadcast/multicast. */
  40549. if (!broadcast &&
  40550. 802daa6: 2be0 cmp r3, #224 ; 0xe0
  40551. 802daa8: d00c beq.n 802dac4 <udp_input+0x15c>
  40552. !ip_addr_ismulticast(&current_iphdr_dest)) {
  40553. /* move payload pointer back to ip header */
  40554. pbuf_header(p, (IPH_HL(iphdr) * 4) + UDP_HLEN);
  40555. 802daaa: f899 1000 ldrb.w r1, [r9]
  40556. 802daae: f001 010f and.w r1, r1, #15
  40557. 802dab2: 3102 adds r1, #2
  40558. 802dab4: 0089 lsls r1, r1, #2
  40559. 802dab6: 4628 mov r0, r5
  40560. 802dab8: f7fd fb9f bl 802b1fa <pbuf_header>
  40561. LWIP_ASSERT("p->payload == iphdr", (p->payload == iphdr));
  40562. icmp_dest_unreach(p, ICMP_DUR_PORT);
  40563. 802dabc: 4628 mov r0, r5
  40564. 802dabe: 2103 movs r1, #3
  40565. 802dac0: f000 f9d2 bl 802de68 <icmp_dest_unreach>
  40566. }
  40567. #endif /* LWIP_ICMP */
  40568. UDP_STATS_INC(udp.proterr);
  40569. UDP_STATS_INC(udp.drop);
  40570. snmp_inc_udpnoports();
  40571. 802dac4: f002 f9cc bl 802fe60 <snmp_inc_udpnoports>
  40572. pbuf_free(p);
  40573. 802dac8: 4628 mov r0, r5
  40574. } else {
  40575. pbuf_free(p);
  40576. }
  40577. end:
  40578. PERF_STOP("udp_input");
  40579. }
  40580. 802daca: b005 add sp, #20
  40581. 802dacc: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  40582. }
  40583. #endif /* LWIP_ICMP */
  40584. UDP_STATS_INC(udp.proterr);
  40585. UDP_STATS_INC(udp.drop);
  40586. snmp_inc_udpnoports();
  40587. pbuf_free(p);
  40588. 802dad0: f7fd bbbe b.w 802b250 <pbuf_free>
  40589. uncon_pcb = pcb;
  40590. }
  40591. }
  40592. }
  40593. /* compare PCB remote addr+port to UDP source addr+port */
  40594. if ((local_match != 0) &&
  40595. 802dad4: 8aa2 ldrh r2, [r4, #20]
  40596. 802dad6: 42ba cmp r2, r7
  40597. 802dad8: d1be bne.n 802da58 <udp_input+0xf0>
  40598. 802dada: e7ab b.n 802da34 <udp_input+0xcc>
  40599. } else {
  40600. pbuf_free(p);
  40601. }
  40602. end:
  40603. PERF_STOP("udp_input");
  40604. }
  40605. 802dadc: b005 add sp, #20
  40606. 802dade: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  40607. 802dae2: bf00 nop
  40608. 802dae4: 20010d98 .word 0x20010d98
  40609. 802dae8: 20010d94 .word 0x20010d94
  40610. 802daec: 20010da0 .word 0x20010da0
  40611. 0802daf0 <udp_bind>:
  40612. *
  40613. * @see udp_disconnect()
  40614. */
  40615. err_t
  40616. udp_bind(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  40617. {
  40618. 802daf0: b5f8 push {r3, r4, r5, r6, r7, lr}
  40619. ip_addr_debug_print(UDP_DEBUG, ipaddr);
  40620. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
  40621. rebind = 0;
  40622. /* Check for double bind and rebind of the same pcb */
  40623. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  40624. 802daf2: 4b25 ldr r3, [pc, #148] ; (802db88 <udp_bind+0x98>)
  40625. *
  40626. * @see udp_disconnect()
  40627. */
  40628. err_t
  40629. udp_bind(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  40630. {
  40631. 802daf4: 4604 mov r4, r0
  40632. ip_addr_debug_print(UDP_DEBUG, ipaddr);
  40633. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
  40634. rebind = 0;
  40635. /* Check for double bind and rebind of the same pcb */
  40636. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  40637. 802daf6: 6818 ldr r0, [r3, #0]
  40638. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_bind(ipaddr = "));
  40639. ip_addr_debug_print(UDP_DEBUG, ipaddr);
  40640. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
  40641. rebind = 0;
  40642. 802daf8: 2500 movs r5, #0
  40643. /* Check for double bind and rebind of the same pcb */
  40644. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  40645. 802dafa: 4603 mov r3, r0
  40646. 802dafc: e012 b.n 802db24 <udp_bind+0x34>
  40647. /* is this UDP PCB already on active list? */
  40648. if (pcb == ipcb) {
  40649. 802dafe: 429c cmp r4, r3
  40650. 802db00: d00e beq.n 802db20 <udp_bind+0x30>
  40651. !ip_get_option(ipcb, SOF_REUSEADDR)) {
  40652. #else /* SO_REUSE */
  40653. /* port matches that of PCB in list and REUSEADDR not set -> reject */
  40654. else {
  40655. #endif /* SO_REUSE */
  40656. if ((ipcb->local_port == port) &&
  40657. 802db02: 8a5e ldrh r6, [r3, #18]
  40658. 802db04: 4296 cmp r6, r2
  40659. 802db06: d10c bne.n 802db22 <udp_bind+0x32>
  40660. /* IP address matches, or one is IP_ADDR_ANY? */
  40661. (ip_addr_isany(&(ipcb->local_ip)) ||
  40662. 802db08: 681f ldr r7, [r3, #0]
  40663. 802db0a: b90f cbnz r7, 802db10 <udp_bind+0x20>
  40664. ip_addr_isany(ipaddr) ||
  40665. ip_addr_cmp(&(ipcb->local_ip), ipaddr))) {
  40666. /* other PCB already binds to this local IP and port */
  40667. LWIP_DEBUGF(UDP_DEBUG,
  40668. ("udp_bind: local port %"U16_F" already bound by another pcb\n", port));
  40669. return ERR_USE;
  40670. 802db0c: 20f8 movs r0, #248 ; 0xf8
  40671. 802db0e: e039 b.n 802db84 <udp_bind+0x94>
  40672. /* port matches that of PCB in list and REUSEADDR not set -> reject */
  40673. else {
  40674. #endif /* SO_REUSE */
  40675. if ((ipcb->local_port == port) &&
  40676. /* IP address matches, or one is IP_ADDR_ANY? */
  40677. (ip_addr_isany(&(ipcb->local_ip)) ||
  40678. 802db10: 2900 cmp r1, #0
  40679. 802db12: d0fb beq.n 802db0c <udp_bind+0x1c>
  40680. ip_addr_isany(ipaddr) ||
  40681. 802db14: 680e ldr r6, [r1, #0]
  40682. 802db16: 2e00 cmp r6, #0
  40683. 802db18: d0f8 beq.n 802db0c <udp_bind+0x1c>
  40684. 802db1a: 42b7 cmp r7, r6
  40685. 802db1c: d101 bne.n 802db22 <udp_bind+0x32>
  40686. 802db1e: e7f5 b.n 802db0c <udp_bind+0x1c>
  40687. /* is this UDP PCB already on active list? */
  40688. if (pcb == ipcb) {
  40689. /* pcb may occur at most once in active list */
  40690. LWIP_ASSERT("rebind == 0", rebind == 0);
  40691. /* pcb already in list, just rebind */
  40692. rebind = 1;
  40693. 802db20: 2501 movs r5, #1
  40694. ip_addr_debug_print(UDP_DEBUG, ipaddr);
  40695. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
  40696. rebind = 0;
  40697. /* Check for double bind and rebind of the same pcb */
  40698. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  40699. 802db22: 68db ldr r3, [r3, #12]
  40700. 802db24: 2b00 cmp r3, #0
  40701. 802db26: d1ea bne.n 802dafe <udp_bind+0xe>
  40702. return ERR_USE;
  40703. }
  40704. }
  40705. }
  40706. ip_addr_set(&pcb->local_ip, ipaddr);
  40707. 802db28: b101 cbz r1, 802db2c <udp_bind+0x3c>
  40708. 802db2a: 6809 ldr r1, [r1, #0]
  40709. 802db2c: 6021 str r1, [r4, #0]
  40710. /* no port specified? */
  40711. if (port == 0) {
  40712. 802db2e: b9fa cbnz r2, 802db70 <udp_bind+0x80>
  40713. 802db30: 4b16 ldr r3, [pc, #88] ; (802db8c <udp_bind+0x9c>)
  40714. 802db32: 881a ldrh r2, [r3, #0]
  40715. 802db34: f44f 4180 mov.w r1, #16384 ; 0x4000
  40716. {
  40717. u16_t n = 0;
  40718. struct udp_pcb *pcb;
  40719. again:
  40720. if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) {
  40721. 802db38: f64f 76ff movw r6, #65535 ; 0xffff
  40722. 802db3c: 42b2 cmp r2, r6
  40723. 802db3e: d002 beq.n 802db46 <udp_bind+0x56>
  40724. 802db40: 3201 adds r2, #1
  40725. 802db42: b292 uxth r2, r2
  40726. 802db44: e001 b.n 802db4a <udp_bind+0x5a>
  40727. udp_port = UDP_LOCAL_PORT_RANGE_START;
  40728. 802db46: f44f 4240 mov.w r2, #49152 ; 0xc000
  40729. }
  40730. /* Check all PCBs. */
  40731. for(pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  40732. 802db4a: 4603 mov r3, r0
  40733. 802db4c: e00a b.n 802db64 <udp_bind+0x74>
  40734. if (pcb->local_port == udp_port) {
  40735. 802db4e: 8a5f ldrh r7, [r3, #18]
  40736. 802db50: 4297 cmp r7, r2
  40737. 802db52: d106 bne.n 802db62 <udp_bind+0x72>
  40738. 802db54: 3901 subs r1, #1
  40739. 802db56: b289 uxth r1, r1
  40740. if (++n > (UDP_LOCAL_PORT_RANGE_END - UDP_LOCAL_PORT_RANGE_START)) {
  40741. 802db58: 2900 cmp r1, #0
  40742. 802db5a: d1ef bne.n 802db3c <udp_bind+0x4c>
  40743. 802db5c: 4b0b ldr r3, [pc, #44] ; (802db8c <udp_bind+0x9c>)
  40744. 802db5e: 801a strh r2, [r3, #0]
  40745. 802db60: e7d4 b.n 802db0c <udp_bind+0x1c>
  40746. again:
  40747. if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) {
  40748. udp_port = UDP_LOCAL_PORT_RANGE_START;
  40749. }
  40750. /* Check all PCBs. */
  40751. for(pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
  40752. 802db62: 68db ldr r3, [r3, #12]
  40753. 802db64: 2b00 cmp r3, #0
  40754. 802db66: d1f2 bne.n 802db4e <udp_bind+0x5e>
  40755. 802db68: 4b08 ldr r3, [pc, #32] ; (802db8c <udp_bind+0x9c>)
  40756. 802db6a: 801a strh r2, [r3, #0]
  40757. ip_addr_set(&pcb->local_ip, ipaddr);
  40758. /* no port specified? */
  40759. if (port == 0) {
  40760. port = udp_new_port();
  40761. if (port == 0) {
  40762. 802db6c: 2a00 cmp r2, #0
  40763. 802db6e: d0cd beq.n 802db0c <udp_bind+0x1c>
  40764. /* no more ports available in local range */
  40765. LWIP_DEBUGF(UDP_DEBUG, ("udp_bind: out of free UDP ports\n"));
  40766. return ERR_USE;
  40767. }
  40768. }
  40769. pcb->local_port = port;
  40770. 802db70: 8262 strh r2, [r4, #18]
  40771. snmp_insert_udpidx_tree(pcb);
  40772. 802db72: 4620 mov r0, r4
  40773. 802db74: f002 f98c bl 802fe90 <snmp_insert_udpidx_tree>
  40774. /* pcb not active yet? */
  40775. if (rebind == 0) {
  40776. 802db78: b91d cbnz r5, 802db82 <udp_bind+0x92>
  40777. /* place the PCB on the active list if not already there */
  40778. pcb->next = udp_pcbs;
  40779. 802db7a: 4b03 ldr r3, [pc, #12] ; (802db88 <udp_bind+0x98>)
  40780. 802db7c: 681a ldr r2, [r3, #0]
  40781. udp_pcbs = pcb;
  40782. 802db7e: 601c str r4, [r3, #0]
  40783. pcb->local_port = port;
  40784. snmp_insert_udpidx_tree(pcb);
  40785. /* pcb not active yet? */
  40786. if (rebind == 0) {
  40787. /* place the PCB on the active list if not already there */
  40788. pcb->next = udp_pcbs;
  40789. 802db80: 60e2 str r2, [r4, #12]
  40790. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
  40791. ("udp_bind: bound to %"U16_F".%"U16_F".%"U16_F".%"U16_F", port %"U16_F"\n",
  40792. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  40793. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  40794. pcb->local_port));
  40795. return ERR_OK;
  40796. 802db82: 2000 movs r0, #0
  40797. }
  40798. 802db84: b240 sxtb r0, r0
  40799. 802db86: bdf8 pop {r3, r4, r5, r6, r7, pc}
  40800. 802db88: 20010d94 .word 0x20010d94
  40801. 802db8c: 200015e6 .word 0x200015e6
  40802. 0802db90 <udp_sendto_if>:
  40803. * @see udp_disconnect() udp_send()
  40804. */
  40805. err_t
  40806. udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p,
  40807. ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif)
  40808. {
  40809. 802db90: e92d 47ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, lr}
  40810. 802db94: 4692 mov sl, r2
  40811. return ERR_VAL;
  40812. }
  40813. #endif /* IP_SOF_BROADCAST */
  40814. /* if the PCB is not yet bound to a port, bind it here */
  40815. if (pcb->local_port == 0) {
  40816. 802db96: 8a42 ldrh r2, [r0, #18]
  40817. * @see udp_disconnect() udp_send()
  40818. */
  40819. err_t
  40820. udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p,
  40821. ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif)
  40822. {
  40823. 802db98: f8dd 8030 ldr.w r8, [sp, #48] ; 0x30
  40824. 802db9c: 4605 mov r5, r0
  40825. 802db9e: 460e mov r6, r1
  40826. 802dba0: 4699 mov r9, r3
  40827. return ERR_VAL;
  40828. }
  40829. #endif /* IP_SOF_BROADCAST */
  40830. /* if the PCB is not yet bound to a port, bind it here */
  40831. if (pcb->local_port == 0) {
  40832. 802dba2: b132 cbz r2, 802dbb2 <udp_sendto_if+0x22>
  40833. return err;
  40834. }
  40835. }
  40836. /* not enough space to add an UDP header to first pbuf in given p chain? */
  40837. if (pbuf_header(p, UDP_HLEN)) {
  40838. 802dba4: 4630 mov r0, r6
  40839. 802dba6: 2108 movs r1, #8
  40840. 802dba8: f7fd fb27 bl 802b1fa <pbuf_header>
  40841. 802dbac: b940 cbnz r0, 802dbc0 <udp_sendto_if+0x30>
  40842. 802dbae: 4634 mov r4, r6
  40843. 802dbb0: e013 b.n 802dbda <udp_sendto_if+0x4a>
  40844. #endif /* IP_SOF_BROADCAST */
  40845. /* if the PCB is not yet bound to a port, bind it here */
  40846. if (pcb->local_port == 0) {
  40847. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send: not yet bound to a port, binding now\n"));
  40848. err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
  40849. 802dbb2: 4601 mov r1, r0
  40850. 802dbb4: f7ff ff9c bl 802daf0 <udp_bind>
  40851. if (err != ERR_OK) {
  40852. 802dbb8: 4607 mov r7, r0
  40853. 802dbba: 2800 cmp r0, #0
  40854. 802dbbc: d0f2 beq.n 802dba4 <udp_sendto_if+0x14>
  40855. 802dbbe: e044 b.n 802dc4a <udp_sendto_if+0xba>
  40856. }
  40857. /* not enough space to add an UDP header to first pbuf in given p chain? */
  40858. if (pbuf_header(p, UDP_HLEN)) {
  40859. /* allocate header in a separate new pbuf */
  40860. q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM);
  40861. 802dbc0: 2001 movs r0, #1
  40862. 802dbc2: 2108 movs r1, #8
  40863. 802dbc4: 2200 movs r2, #0
  40864. 802dbc6: f7fd fb90 bl 802b2ea <pbuf_alloc>
  40865. /* new header pbuf could not be allocated? */
  40866. if (q == NULL) {
  40867. 802dbca: 4604 mov r4, r0
  40868. 802dbcc: 2800 cmp r0, #0
  40869. 802dbce: d039 beq.n 802dc44 <udp_sendto_if+0xb4>
  40870. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: could not allocate header\n"));
  40871. return ERR_MEM;
  40872. }
  40873. if (p->tot_len != 0) {
  40874. 802dbd0: 8933 ldrh r3, [r6, #8]
  40875. 802dbd2: b113 cbz r3, 802dbda <udp_sendto_if+0x4a>
  40876. /* chain header q in front of given pbuf p (only if p contains data) */
  40877. pbuf_chain(q, p);
  40878. 802dbd4: 4631 mov r1, r6
  40879. 802dbd6: f7fd fc36 bl 802b446 <pbuf_chain>
  40880. }
  40881. LWIP_ASSERT("check that first pbuf can hold struct udp_hdr",
  40882. (q->len >= sizeof(struct udp_hdr)));
  40883. /* q now represents the packet to be sent */
  40884. udphdr = (struct udp_hdr *)q->payload;
  40885. udphdr->src = htons(pcb->local_port);
  40886. 802dbda: 8a68 ldrh r0, [r5, #18]
  40887. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header in given pbuf %p\n", (void *)p));
  40888. }
  40889. LWIP_ASSERT("check that first pbuf can hold struct udp_hdr",
  40890. (q->len >= sizeof(struct udp_hdr)));
  40891. /* q now represents the packet to be sent */
  40892. udphdr = (struct udp_hdr *)q->payload;
  40893. 802dbdc: 6867 ldr r7, [r4, #4]
  40894. udphdr->src = htons(pcb->local_port);
  40895. 802dbde: f7fc f9f9 bl 8029fd4 <lwip_htons>
  40896. 802dbe2: 8038 strh r0, [r7, #0]
  40897. udphdr->dest = htons(dst_port);
  40898. 802dbe4: 4648 mov r0, r9
  40899. 802dbe6: f7fc f9f5 bl 8029fd4 <lwip_htons>
  40900. /* in UDP, 0 checksum means 'no checksum' */
  40901. udphdr->chksum = 0x0000;
  40902. 802dbea: 2300 movs r3, #0
  40903. LWIP_ASSERT("check that first pbuf can hold struct udp_hdr",
  40904. (q->len >= sizeof(struct udp_hdr)));
  40905. /* q now represents the packet to be sent */
  40906. udphdr = (struct udp_hdr *)q->payload;
  40907. udphdr->src = htons(pcb->local_port);
  40908. udphdr->dest = htons(dst_port);
  40909. 802dbec: 8078 strh r0, [r7, #2]
  40910. /* in UDP, 0 checksum means 'no checksum' */
  40911. udphdr->chksum = 0x0000;
  40912. 802dbee: 71bb strb r3, [r7, #6]
  40913. 802dbf0: 71fb strb r3, [r7, #7]
  40914. }
  40915. #endif /* LWIP_IGMP */
  40916. /* PCB local address is IP_ANY_ADDR? */
  40917. if (ip_addr_isany(&pcb->local_ip)) {
  40918. 802dbf2: 682b ldr r3, [r5, #0]
  40919. 802dbf4: b913 cbnz r3, 802dbfc <udp_sendto_if+0x6c>
  40920. /* use outgoing network interface IP address as source address */
  40921. src_ip = &(netif->ip_addr);
  40922. 802dbf6: f108 0904 add.w r9, r8, #4
  40923. 802dbfa: e00a b.n 802dc12 <udp_sendto_if+0x82>
  40924. } else {
  40925. /* check if UDP PCB local IP address is correct
  40926. * this could be an old address if netif->ip_addr has changed */
  40927. if (!ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))) {
  40928. 802dbfc: f8d8 2004 ldr.w r2, [r8, #4]
  40929. 802dc00: 4293 cmp r3, r2
  40930. 802dc02: d005 beq.n 802dc10 <udp_sendto_if+0x80>
  40931. /* local_ip doesn't match, drop the packet */
  40932. if (q != p) {
  40933. 802dc04: 42b4 cmp r4, r6
  40934. 802dc06: d01f beq.n 802dc48 <udp_sendto_if+0xb8>
  40935. /* free the header pbuf */
  40936. pbuf_free(q);
  40937. 802dc08: 4620 mov r0, r4
  40938. 802dc0a: f7fd fb21 bl 802b250 <pbuf_free>
  40939. 802dc0e: e01b b.n 802dc48 <udp_sendto_if+0xb8>
  40940. }
  40941. #endif /* LWIP_IGMP */
  40942. /* PCB local address is IP_ANY_ADDR? */
  40943. if (ip_addr_isany(&pcb->local_ip)) {
  40944. 802dc10: 46a9 mov r9, r5
  40945. NETIF_SET_HWADDRHINT(netif, NULL);
  40946. } else
  40947. #endif /* LWIP_UDPLITE */
  40948. { /* UDP */
  40949. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP packet length %"U16_F"\n", q->tot_len));
  40950. udphdr->len = htons(q->tot_len);
  40951. 802dc12: 8920 ldrh r0, [r4, #8]
  40952. 802dc14: f7fc f9de bl 8029fd4 <lwip_htons>
  40953. 802dc18: 80b8 strh r0, [r7, #4]
  40954. #endif /* CHECKSUM_GEN_UDP */
  40955. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP checksum 0x%04"X16_F"\n", udphdr->chksum));
  40956. LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDP,)\n"));
  40957. /* output to IP */
  40958. NETIF_SET_HWADDRHINT(netif, &pcb->addr_hint);
  40959. err = ip_output_if(q, src_ip, dst_ip, pcb->ttl, pcb->tos, IP_PROTO_UDP, netif);
  40960. 802dc1a: 7a6a ldrb r2, [r5, #9]
  40961. 802dc1c: 7aab ldrb r3, [r5, #10]
  40962. 802dc1e: 9200 str r2, [sp, #0]
  40963. 802dc20: 2211 movs r2, #17
  40964. 802dc22: 9201 str r2, [sp, #4]
  40965. 802dc24: 4649 mov r1, r9
  40966. 802dc26: 4652 mov r2, sl
  40967. 802dc28: f8cd 8008 str.w r8, [sp, #8]
  40968. 802dc2c: 4620 mov r0, r4
  40969. 802dc2e: f000 fb9d bl 802e36c <ip_output_if>
  40970. 802dc32: 4607 mov r7, r0
  40971. NETIF_SET_HWADDRHINT(netif, NULL);
  40972. }
  40973. /* TODO: must this be increased even if error occured? */
  40974. snmp_inc_udpoutdatagrams();
  40975. 802dc34: f002 f924 bl 802fe80 <snmp_inc_udpoutdatagrams>
  40976. /* did we chain a separate header pbuf earlier? */
  40977. if (q != p) {
  40978. 802dc38: 42b4 cmp r4, r6
  40979. 802dc3a: d006 beq.n 802dc4a <udp_sendto_if+0xba>
  40980. /* free the header pbuf */
  40981. pbuf_free(q);
  40982. 802dc3c: 4620 mov r0, r4
  40983. 802dc3e: f7fd fb07 bl 802b250 <pbuf_free>
  40984. 802dc42: e002 b.n 802dc4a <udp_sendto_if+0xba>
  40985. /* allocate header in a separate new pbuf */
  40986. q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM);
  40987. /* new header pbuf could not be allocated? */
  40988. if (q == NULL) {
  40989. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: could not allocate header\n"));
  40990. return ERR_MEM;
  40991. 802dc44: 27ff movs r7, #255 ; 0xff
  40992. 802dc46: e000 b.n 802dc4a <udp_sendto_if+0xba>
  40993. /* free the header pbuf */
  40994. pbuf_free(q);
  40995. q = NULL;
  40996. /* p is still referenced by the caller, and will live on */
  40997. }
  40998. return ERR_VAL;
  40999. 802dc48: 27fa movs r7, #250 ; 0xfa
  41000. /* p is still referenced by the caller, and will live on */
  41001. }
  41002. UDP_STATS_INC(udp.xmit);
  41003. return err;
  41004. }
  41005. 802dc4a: b278 sxtb r0, r7
  41006. 802dc4c: b004 add sp, #16
  41007. 802dc4e: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  41008. 0802dc52 <udp_sendto>:
  41009. * @see udp_disconnect() udp_send()
  41010. */
  41011. err_t
  41012. udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
  41013. ip_addr_t *dst_ip, u16_t dst_port)
  41014. {
  41015. 802dc52: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
  41016. 802dc54: 4605 mov r5, r0
  41017. /* find the outgoing network interface for this packet */
  41018. #if LWIP_IGMP
  41019. netif = ip_route((ip_addr_ismulticast(dst_ip))?(&(pcb->multicast_ip)):(dst_ip));
  41020. #else
  41021. netif = ip_route(dst_ip);
  41022. 802dc56: 4610 mov r0, r2
  41023. * @see udp_disconnect() udp_send()
  41024. */
  41025. err_t
  41026. udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
  41027. ip_addr_t *dst_ip, u16_t dst_port)
  41028. {
  41029. 802dc58: 460f mov r7, r1
  41030. 802dc5a: 4614 mov r4, r2
  41031. 802dc5c: 461e mov r6, r3
  41032. /* find the outgoing network interface for this packet */
  41033. #if LWIP_IGMP
  41034. netif = ip_route((ip_addr_ismulticast(dst_ip))?(&(pcb->multicast_ip)):(dst_ip));
  41035. #else
  41036. netif = ip_route(dst_ip);
  41037. 802dc5e: f000 fa81 bl 802e164 <ip_route>
  41038. #endif /* LWIP_IGMP */
  41039. /* no outgoing network interface could be found? */
  41040. if (netif == NULL) {
  41041. 802dc62: b138 cbz r0, 802dc74 <udp_sendto+0x22>
  41042. return ERR_RTE;
  41043. }
  41044. #if LWIP_CHECKSUM_ON_COPY
  41045. return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum);
  41046. #else /* LWIP_CHECKSUM_ON_COPY */
  41047. return udp_sendto_if(pcb, p, dst_ip, dst_port, netif);
  41048. 802dc64: 9000 str r0, [sp, #0]
  41049. 802dc66: 4639 mov r1, r7
  41050. 802dc68: 4628 mov r0, r5
  41051. 802dc6a: 4622 mov r2, r4
  41052. 802dc6c: 4633 mov r3, r6
  41053. 802dc6e: f7ff ff8f bl 802db90 <udp_sendto_if>
  41054. 802dc72: e000 b.n 802dc76 <udp_sendto+0x24>
  41055. /* no outgoing network interface could be found? */
  41056. if (netif == NULL) {
  41057. LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
  41058. ip4_addr1_16(dst_ip), ip4_addr2_16(dst_ip), ip4_addr3_16(dst_ip), ip4_addr4_16(dst_ip)));
  41059. UDP_STATS_INC(udp.rterr);
  41060. return ERR_RTE;
  41061. 802dc74: 20fc movs r0, #252 ; 0xfc
  41062. #if LWIP_CHECKSUM_ON_COPY
  41063. return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum);
  41064. #else /* LWIP_CHECKSUM_ON_COPY */
  41065. return udp_sendto_if(pcb, p, dst_ip, dst_port, netif);
  41066. #endif /* LWIP_CHECKSUM_ON_COPY */
  41067. }
  41068. 802dc76: b240 sxtb r0, r0
  41069. 802dc78: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc}
  41070. 0802dc7a <udp_send>:
  41071. */
  41072. err_t
  41073. udp_send(struct udp_pcb *pcb, struct pbuf *p)
  41074. {
  41075. /* send to the packet using remote ip and port stored in the pcb */
  41076. return udp_sendto(pcb, p, &pcb->remote_ip, pcb->remote_port);
  41077. 802dc7a: 8a83 ldrh r3, [r0, #20]
  41078. 802dc7c: 1d02 adds r2, r0, #4
  41079. 802dc7e: f7ff bfe8 b.w 802dc52 <udp_sendto>
  41080. 802dc82: 0000 movs r0, r0
  41081. 0802dc84 <udp_connect>:
  41082. *
  41083. * @see udp_disconnect()
  41084. */
  41085. err_t
  41086. udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  41087. {
  41088. 802dc84: b570 push {r4, r5, r6, lr}
  41089. 802dc86: 4616 mov r6, r2
  41090. struct udp_pcb *ipcb;
  41091. if (pcb->local_port == 0) {
  41092. 802dc88: 8a42 ldrh r2, [r0, #18]
  41093. *
  41094. * @see udp_disconnect()
  41095. */
  41096. err_t
  41097. udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  41098. {
  41099. 802dc8a: 4604 mov r4, r0
  41100. 802dc8c: 460d mov r5, r1
  41101. struct udp_pcb *ipcb;
  41102. if (pcb->local_port == 0) {
  41103. 802dc8e: b10a cbz r2, 802dc94 <udp_connect+0x10>
  41104. if (err != ERR_OK) {
  41105. return err;
  41106. }
  41107. }
  41108. ip_addr_set(&pcb->remote_ip, ipaddr);
  41109. 802dc90: b935 cbnz r5, 802dca0 <udp_connect+0x1c>
  41110. 802dc92: e006 b.n 802dca2 <udp_connect+0x1e>
  41111. udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
  41112. {
  41113. struct udp_pcb *ipcb;
  41114. if (pcb->local_port == 0) {
  41115. err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
  41116. 802dc94: 4601 mov r1, r0
  41117. 802dc96: f7ff ff2b bl 802daf0 <udp_bind>
  41118. if (err != ERR_OK) {
  41119. 802dc9a: 2800 cmp r0, #0
  41120. 802dc9c: d0f8 beq.n 802dc90 <udp_connect+0xc>
  41121. 802dc9e: e013 b.n 802dcc8 <udp_connect+0x44>
  41122. return err;
  41123. }
  41124. }
  41125. ip_addr_set(&pcb->remote_ip, ipaddr);
  41126. 802dca0: 682d ldr r5, [r5, #0]
  41127. pcb->remote_port = port;
  41128. pcb->flags |= UDP_FLAGS_CONNECTED;
  41129. 802dca2: 7c23 ldrb r3, [r4, #16]
  41130. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  41131. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  41132. pcb->local_port));
  41133. /* Insert UDP PCB into the list of active UDP PCBs. */
  41134. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  41135. 802dca4: 4a09 ldr r2, [pc, #36] ; (802dccc <udp_connect+0x48>)
  41136. if (err != ERR_OK) {
  41137. return err;
  41138. }
  41139. }
  41140. ip_addr_set(&pcb->remote_ip, ipaddr);
  41141. 802dca6: 6065 str r5, [r4, #4]
  41142. pcb->remote_port = port;
  41143. pcb->flags |= UDP_FLAGS_CONNECTED;
  41144. 802dca8: f043 0304 orr.w r3, r3, #4
  41145. 802dcac: 7423 strb r3, [r4, #16]
  41146. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  41147. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  41148. pcb->local_port));
  41149. /* Insert UDP PCB into the list of active UDP PCBs. */
  41150. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  41151. 802dcae: 6813 ldr r3, [r2, #0]
  41152. return err;
  41153. }
  41154. }
  41155. ip_addr_set(&pcb->remote_ip, ipaddr);
  41156. pcb->remote_port = port;
  41157. 802dcb0: 82a6 strh r6, [r4, #20]
  41158. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  41159. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  41160. pcb->local_port));
  41161. /* Insert UDP PCB into the list of active UDP PCBs. */
  41162. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  41163. 802dcb2: 4618 mov r0, r3
  41164. 802dcb4: e002 b.n 802dcbc <udp_connect+0x38>
  41165. if (pcb == ipcb) {
  41166. 802dcb6: 4284 cmp r4, r0
  41167. 802dcb8: d005 beq.n 802dcc6 <udp_connect+0x42>
  41168. ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip),
  41169. ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip),
  41170. pcb->local_port));
  41171. /* Insert UDP PCB into the list of active UDP PCBs. */
  41172. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  41173. 802dcba: 68c0 ldr r0, [r0, #12]
  41174. 802dcbc: 2800 cmp r0, #0
  41175. 802dcbe: d1fa bne.n 802dcb6 <udp_connect+0x32>
  41176. /* already on the list, just return */
  41177. return ERR_OK;
  41178. }
  41179. }
  41180. /* PCB not yet on the list, add PCB now */
  41181. pcb->next = udp_pcbs;
  41182. 802dcc0: 60e3 str r3, [r4, #12]
  41183. udp_pcbs = pcb;
  41184. 802dcc2: 6014 str r4, [r2, #0]
  41185. return ERR_OK;
  41186. 802dcc4: e000 b.n 802dcc8 <udp_connect+0x44>
  41187. /* Insert UDP PCB into the list of active UDP PCBs. */
  41188. for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
  41189. if (pcb == ipcb) {
  41190. /* already on the list, just return */
  41191. return ERR_OK;
  41192. 802dcc6: 2000 movs r0, #0
  41193. }
  41194. /* PCB not yet on the list, add PCB now */
  41195. pcb->next = udp_pcbs;
  41196. udp_pcbs = pcb;
  41197. return ERR_OK;
  41198. }
  41199. 802dcc8: b240 sxtb r0, r0
  41200. 802dcca: bd70 pop {r4, r5, r6, pc}
  41201. 802dccc: 20010d94 .word 0x20010d94
  41202. 0802dcd0 <udp_disconnect>:
  41203. */
  41204. void
  41205. udp_disconnect(struct udp_pcb *pcb)
  41206. {
  41207. /* reset remote address association */
  41208. ip_addr_set_any(&pcb->remote_ip);
  41209. 802dcd0: 2300 movs r3, #0
  41210. 802dcd2: 6043 str r3, [r0, #4]
  41211. pcb->remote_port = 0;
  41212. 802dcd4: 8283 strh r3, [r0, #20]
  41213. /* mark PCB as unconnected */
  41214. pcb->flags &= ~UDP_FLAGS_CONNECTED;
  41215. 802dcd6: 7c03 ldrb r3, [r0, #16]
  41216. 802dcd8: f023 0304 bic.w r3, r3, #4
  41217. 802dcdc: 7403 strb r3, [r0, #16]
  41218. 802dcde: 4770 bx lr
  41219. 0802dce0 <udp_recv>:
  41220. */
  41221. void
  41222. udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg)
  41223. {
  41224. /* remember recv() callback and user data */
  41225. pcb->recv = recv;
  41226. 802dce0: 6181 str r1, [r0, #24]
  41227. pcb->recv_arg = recv_arg;
  41228. 802dce2: 61c2 str r2, [r0, #28]
  41229. 802dce4: 4770 bx lr
  41230. 802dce6: 0000 movs r0, r0
  41231. 0802dce8 <udp_remove>:
  41232. *
  41233. * @see udp_new()
  41234. */
  41235. void
  41236. udp_remove(struct udp_pcb *pcb)
  41237. {
  41238. 802dce8: b510 push {r4, lr}
  41239. 802dcea: 4604 mov r4, r0
  41240. struct udp_pcb *pcb2;
  41241. snmp_delete_udpidx_tree(pcb);
  41242. 802dcec: f002 f914 bl 802ff18 <snmp_delete_udpidx_tree>
  41243. /* pcb to be removed is first in list? */
  41244. if (udp_pcbs == pcb) {
  41245. 802dcf0: 4a0a ldr r2, [pc, #40] ; (802dd1c <udp_remove+0x34>)
  41246. 802dcf2: 6813 ldr r3, [r2, #0]
  41247. 802dcf4: 42a3 cmp r3, r4
  41248. 802dcf6: d109 bne.n 802dd0c <udp_remove+0x24>
  41249. /* make list start at 2nd pcb */
  41250. udp_pcbs = udp_pcbs->next;
  41251. 802dcf8: 68e3 ldr r3, [r4, #12]
  41252. 802dcfa: 6013 str r3, [r2, #0]
  41253. 802dcfc: e008 b.n 802dd10 <udp_remove+0x28>
  41254. /* pcb not 1st in list */
  41255. } else {
  41256. for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {
  41257. /* find pcb in udp_pcbs list */
  41258. if (pcb2->next != NULL && pcb2->next == pcb) {
  41259. 802dcfe: 68da ldr r2, [r3, #12]
  41260. 802dd00: b11a cbz r2, 802dd0a <udp_remove+0x22>
  41261. 802dd02: 42a2 cmp r2, r4
  41262. /* remove pcb from list */
  41263. pcb2->next = pcb->next;
  41264. 802dd04: bf04 itt eq
  41265. 802dd06: 68e2 ldreq r2, [r4, #12]
  41266. 802dd08: 60da streq r2, [r3, #12]
  41267. if (udp_pcbs == pcb) {
  41268. /* make list start at 2nd pcb */
  41269. udp_pcbs = udp_pcbs->next;
  41270. /* pcb not 1st in list */
  41271. } else {
  41272. for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {
  41273. 802dd0a: 68db ldr r3, [r3, #12]
  41274. 802dd0c: 2b00 cmp r3, #0
  41275. 802dd0e: d1f6 bne.n 802dcfe <udp_remove+0x16>
  41276. /* remove pcb from list */
  41277. pcb2->next = pcb->next;
  41278. }
  41279. }
  41280. }
  41281. memp_free(MEMP_UDP_PCB, pcb);
  41282. 802dd10: 2001 movs r0, #1
  41283. 802dd12: 4621 mov r1, r4
  41284. }
  41285. 802dd14: e8bd 4010 ldmia.w sp!, {r4, lr}
  41286. /* remove pcb from list */
  41287. pcb2->next = pcb->next;
  41288. }
  41289. }
  41290. }
  41291. memp_free(MEMP_UDP_PCB, pcb);
  41292. 802dd18: f7fd b990 b.w 802b03c <memp_free>
  41293. 802dd1c: 20010d94 .word 0x20010d94
  41294. 0802dd20 <udp_new>:
  41295. *
  41296. * @see udp_remove()
  41297. */
  41298. struct udp_pcb *
  41299. udp_new(void)
  41300. {
  41301. 802dd20: b510 push {r4, lr}
  41302. struct udp_pcb *pcb;
  41303. pcb = (struct udp_pcb *)memp_malloc(MEMP_UDP_PCB);
  41304. 802dd22: 2001 movs r0, #1
  41305. 802dd24: f7fd f974 bl 802b010 <memp_malloc>
  41306. /* could allocate UDP PCB? */
  41307. if (pcb != NULL) {
  41308. 802dd28: 4604 mov r4, r0
  41309. 802dd2a: b128 cbz r0, 802dd38 <udp_new+0x18>
  41310. /* UDP Lite: by initializing to all zeroes, chksum_len is set to 0
  41311. * which means checksum is generated over the whole datagram per default
  41312. * (recommended as default by RFC 3828). */
  41313. /* initialize PCB to all zeroes */
  41314. memset(pcb, 0, sizeof(struct udp_pcb));
  41315. 802dd2c: 2100 movs r1, #0
  41316. 802dd2e: 2220 movs r2, #32
  41317. 802dd30: f7f3 fd42 bl 80217b8 <memset>
  41318. pcb->ttl = UDP_TTL;
  41319. 802dd34: 23ff movs r3, #255 ; 0xff
  41320. 802dd36: 72a3 strb r3, [r4, #10]
  41321. }
  41322. return pcb;
  41323. }
  41324. 802dd38: 4620 mov r0, r4
  41325. 802dd3a: bd10 pop {r4, pc}
  41326. 0802dd3c <icmp_input>:
  41327. * @param p the icmp echo request packet, p->payload pointing to the ip header
  41328. * @param inp the netif on which this packet was received
  41329. */
  41330. void
  41331. icmp_input(struct pbuf *p, struct netif *inp)
  41332. {
  41333. 802dd3c: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  41334. 802dd40: 4604 mov r4, r0
  41335. 802dd42: b085 sub sp, #20
  41336. 802dd44: 460f mov r7, r1
  41337. struct icmp_echo_hdr *iecho;
  41338. struct ip_hdr *iphdr;
  41339. s16_t hlen;
  41340. ICMP_STATS_INC(icmp.recv);
  41341. snmp_inc_icmpinmsgs();
  41342. 802dd46: f002 f81b bl 802fd80 <snmp_inc_icmpinmsgs>
  41343. iphdr = (struct ip_hdr *)p->payload;
  41344. 802dd4a: 6865 ldr r5, [r4, #4]
  41345. hlen = IPH_HL(iphdr) * 4;
  41346. 802dd4c: f895 8000 ldrb.w r8, [r5]
  41347. 802dd50: f008 080f and.w r8, r8, #15
  41348. 802dd54: ea4f 0888 mov.w r8, r8, lsl #2
  41349. if (pbuf_header(p, -hlen) || (p->tot_len < sizeof(u16_t)*2)) {
  41350. 802dd58: f1c8 0900 rsb r9, r8, #0
  41351. 802dd5c: 4620 mov r0, r4
  41352. 802dd5e: fa0f f189 sxth.w r1, r9
  41353. 802dd62: f7fd fa4a bl 802b1fa <pbuf_header>
  41354. 802dd66: 2800 cmp r0, #0
  41355. 802dd68: d172 bne.n 802de50 <icmp_input+0x114>
  41356. 802dd6a: 8923 ldrh r3, [r4, #8]
  41357. 802dd6c: 2b03 cmp r3, #3
  41358. 802dd6e: d96f bls.n 802de50 <icmp_input+0x114>
  41359. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short ICMP (%"U16_F" bytes) received\n", p->tot_len));
  41360. goto lenerr;
  41361. }
  41362. type = *((u8_t *)p->payload);
  41363. 802dd70: 6863 ldr r3, [r4, #4]
  41364. #ifdef LWIP_DEBUG
  41365. code = *(((u8_t *)p->payload)+1);
  41366. #endif /* LWIP_DEBUG */
  41367. switch (type) {
  41368. 802dd72: 781b ldrb r3, [r3, #0]
  41369. 802dd74: 2b08 cmp r3, #8
  41370. 802dd76: d165 bne.n 802de44 <icmp_input+0x108>
  41371. #if !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING
  41372. {
  41373. int accepted = 1;
  41374. #if !LWIP_MULTICAST_PING
  41375. /* multicast destination address? */
  41376. if (ip_addr_ismulticast(&current_iphdr_dest)) {
  41377. 802dd78: 4b39 ldr r3, [pc, #228] ; (802de60 <icmp_input+0x124>)
  41378. 802dd7a: 681e ldr r6, [r3, #0]
  41379. accepted = 0;
  41380. }
  41381. #endif /* LWIP_MULTICAST_PING */
  41382. #if !LWIP_BROADCAST_PING
  41383. /* broadcast destination address? */
  41384. if (ip_addr_isbroadcast(&current_iphdr_dest, inp)) {
  41385. 802dd7c: 4639 mov r1, r7
  41386. 802dd7e: 4630 mov r0, r6
  41387. 802dd80: f000 f900 bl 802df84 <ip4_addr_isbroadcast>
  41388. 802dd84: 2800 cmp r0, #0
  41389. 802dd86: d15d bne.n 802de44 <icmp_input+0x108>
  41390. #if !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING
  41391. {
  41392. int accepted = 1;
  41393. #if !LWIP_MULTICAST_PING
  41394. /* multicast destination address? */
  41395. if (ip_addr_ismulticast(&current_iphdr_dest)) {
  41396. 802dd88: f006 06f0 and.w r6, r6, #240 ; 0xf0
  41397. if (ip_addr_isbroadcast(&current_iphdr_dest, inp)) {
  41398. accepted = 0;
  41399. }
  41400. #endif /* LWIP_BROADCAST_PING */
  41401. /* broadcast or multicast destination address not acceptd? */
  41402. if (!accepted) {
  41403. 802dd8c: 2ee0 cmp r6, #224 ; 0xe0
  41404. 802dd8e: d100 bne.n 802dd92 <icmp_input+0x56>
  41405. 802dd90: e058 b.n 802de44 <icmp_input+0x108>
  41406. return;
  41407. }
  41408. }
  41409. #endif /* !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING */
  41410. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n"));
  41411. if (p->tot_len < sizeof(struct icmp_echo_hdr)) {
  41412. 802dd92: 8923 ldrh r3, [r4, #8]
  41413. 802dd94: 2b07 cmp r3, #7
  41414. 802dd96: d95b bls.n 802de50 <icmp_input+0x114>
  41415. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n"));
  41416. goto lenerr;
  41417. }
  41418. if (inet_chksum_pbuf(p) != 0) {
  41419. 802dd98: 4620 mov r0, r4
  41420. 802dd9a: f000 f8cf bl 802df3c <inet_chksum_pbuf>
  41421. 802dd9e: b100 cbz r0, 802dda2 <icmp_input+0x66>
  41422. 802dda0: e056 b.n 802de50 <icmp_input+0x114>
  41423. ICMP_STATS_INC(icmp.chkerr);
  41424. snmp_inc_icmpinerrors();
  41425. return;
  41426. }
  41427. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
  41428. if (pbuf_header(p, (PBUF_IP_HLEN + PBUF_LINK_HLEN))) {
  41429. 802dda2: 4620 mov r0, r4
  41430. 802dda4: 2122 movs r1, #34 ; 0x22
  41431. ICMP_STATS_INC(icmp.recv);
  41432. snmp_inc_icmpinmsgs();
  41433. iphdr = (struct ip_hdr *)p->payload;
  41434. hlen = IPH_HL(iphdr) * 4;
  41435. 802dda6: fa1f f888 uxth.w r8, r8
  41436. ICMP_STATS_INC(icmp.chkerr);
  41437. snmp_inc_icmpinerrors();
  41438. return;
  41439. }
  41440. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
  41441. if (pbuf_header(p, (PBUF_IP_HLEN + PBUF_LINK_HLEN))) {
  41442. 802ddaa: f7fd fa26 bl 802b1fa <pbuf_header>
  41443. 802ddae: b1f8 cbz r0, 802ddf0 <icmp_input+0xb4>
  41444. /* p is not big enough to contain link headers
  41445. * allocate a new one and copy p into it
  41446. */
  41447. struct pbuf *r;
  41448. /* switch p->payload to ip header */
  41449. if (pbuf_header(p, hlen)) {
  41450. 802ddb0: 4620 mov r0, r4
  41451. 802ddb2: 4641 mov r1, r8
  41452. 802ddb4: f7fd fa21 bl 802b1fa <pbuf_header>
  41453. 802ddb8: 4602 mov r2, r0
  41454. 802ddba: 2800 cmp r0, #0
  41455. 802ddbc: d148 bne.n 802de50 <icmp_input+0x114>
  41456. LWIP_ASSERT("icmp_input: moving p->payload to ip header failed\n", 0);
  41457. goto memerr;
  41458. }
  41459. /* allocate new packet buffer with space for link headers */
  41460. r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM);
  41461. 802ddbe: 2002 movs r0, #2
  41462. 802ddc0: 8921 ldrh r1, [r4, #8]
  41463. 802ddc2: f7fd fa92 bl 802b2ea <pbuf_alloc>
  41464. if (r == NULL) {
  41465. 802ddc6: 4606 mov r6, r0
  41466. 802ddc8: 2800 cmp r0, #0
  41467. 802ddca: d041 beq.n 802de50 <icmp_input+0x114>
  41468. goto memerr;
  41469. }
  41470. LWIP_ASSERT("check that first pbuf can hold struct the ICMP header",
  41471. (r->len >= hlen + sizeof(struct icmp_echo_hdr)));
  41472. /* copy the whole packet including ip header */
  41473. if (pbuf_copy(r, p) != ERR_OK) {
  41474. 802ddcc: 4621 mov r1, r4
  41475. 802ddce: f7fd fb43 bl 802b458 <pbuf_copy>
  41476. 802ddd2: 2800 cmp r0, #0
  41477. 802ddd4: d13c bne.n 802de50 <icmp_input+0x114>
  41478. LWIP_ASSERT("icmp_input: copying to new pbuf failed\n", 0);
  41479. goto memerr;
  41480. }
  41481. iphdr = (struct ip_hdr *)r->payload;
  41482. /* switch r->payload back to icmp header */
  41483. if (pbuf_header(r, -hlen)) {
  41484. 802ddd6: 4630 mov r0, r6
  41485. 802ddd8: fa0f f189 sxth.w r1, r9
  41486. /* copy the whole packet including ip header */
  41487. if (pbuf_copy(r, p) != ERR_OK) {
  41488. LWIP_ASSERT("icmp_input: copying to new pbuf failed\n", 0);
  41489. goto memerr;
  41490. }
  41491. iphdr = (struct ip_hdr *)r->payload;
  41492. 802dddc: 6875 ldr r5, [r6, #4]
  41493. /* switch r->payload back to icmp header */
  41494. if (pbuf_header(r, -hlen)) {
  41495. 802ddde: f7fd fa0c bl 802b1fa <pbuf_header>
  41496. 802dde2: 2800 cmp r0, #0
  41497. 802dde4: d134 bne.n 802de50 <icmp_input+0x114>
  41498. LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0);
  41499. goto memerr;
  41500. }
  41501. /* free the original p */
  41502. pbuf_free(p);
  41503. 802dde6: 4620 mov r0, r4
  41504. 802dde8: f7fd fa32 bl 802b250 <pbuf_free>
  41505. 802ddec: 4634 mov r4, r6
  41506. 802ddee: e006 b.n 802ddfe <icmp_input+0xc2>
  41507. /* we now have an identical copy of p that has room for link headers */
  41508. p = r;
  41509. } else {
  41510. /* restore p->payload to point to icmp header */
  41511. if (pbuf_header(p, -(s16_t)(PBUF_IP_HLEN + PBUF_LINK_HLEN))) {
  41512. 802ddf0: 4620 mov r0, r4
  41513. 802ddf2: f06f 0121 mvn.w r1, #33 ; 0x21
  41514. 802ddf6: f7fd fa00 bl 802b1fa <pbuf_header>
  41515. 802ddfa: 2800 cmp r0, #0
  41516. 802ddfc: d128 bne.n 802de50 <icmp_input+0x114>
  41517. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
  41518. /* At this point, all checks are OK. */
  41519. /* We generate an answer by switching the dest and src ip addresses,
  41520. * setting the icmp type to ECHO_RESPONSE and updating the checksum. */
  41521. iecho = (struct icmp_echo_hdr *)p->payload;
  41522. ip_addr_copy(iphdr->src, *ip_current_dest_addr());
  41523. 802ddfe: f8df 9060 ldr.w r9, [pc, #96] ; 802de60 <icmp_input+0x124>
  41524. }
  41525. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
  41526. /* At this point, all checks are OK. */
  41527. /* We generate an answer by switching the dest and src ip addresses,
  41528. * setting the icmp type to ECHO_RESPONSE and updating the checksum. */
  41529. iecho = (struct icmp_echo_hdr *)p->payload;
  41530. 802de02: 6863 ldr r3, [r4, #4]
  41531. ip_addr_copy(iphdr->src, *ip_current_dest_addr());
  41532. 802de04: f8d9 2000 ldr.w r2, [r9]
  41533. 802de08: 60ea str r2, [r5, #12]
  41534. ip_addr_copy(iphdr->dest, *ip_current_src_addr());
  41535. 802de0a: 4a16 ldr r2, [pc, #88] ; (802de64 <icmp_input+0x128>)
  41536. 802de0c: 6812 ldr r2, [r2, #0]
  41537. #else // CHECKSUM_GEN_ICMP
  41538. iecho->chksum = 0;
  41539. #endif // CHECKSUM_GEN_ICMP
  41540. */
  41541. /* Set the correct TTL and recalculate the header checksum. */
  41542. IPH_TTL_SET(iphdr, ICMP_TTL);
  41543. 802de0e: 26ff movs r6, #255 ; 0xff
  41544. /* At this point, all checks are OK. */
  41545. /* We generate an answer by switching the dest and src ip addresses,
  41546. * setting the icmp type to ECHO_RESPONSE and updating the checksum. */
  41547. iecho = (struct icmp_echo_hdr *)p->payload;
  41548. ip_addr_copy(iphdr->src, *ip_current_dest_addr());
  41549. ip_addr_copy(iphdr->dest, *ip_current_src_addr());
  41550. 802de10: 612a str r2, [r5, #16]
  41551. ICMPH_TYPE_SET(iecho, ICMP_ER);
  41552. 802de12: 2200 movs r2, #0
  41553. 802de14: 701a strb r2, [r3, #0]
  41554. //-----------------------------------------------------------
  41555. // Добавил фикс 15.08.15.
  41556. // Фикс исправляет баг с пингом.
  41557. #ifdef CHECKSUM_BY_HARDWARE
  41558. iecho->chksum = 0;
  41559. 802de16: 709a strb r2, [r3, #2]
  41560. 802de18: 70da strb r2, [r3, #3]
  41561. iecho->chksum = 0;
  41562. #endif // CHECKSUM_GEN_ICMP
  41563. */
  41564. /* Set the correct TTL and recalculate the header checksum. */
  41565. IPH_TTL_SET(iphdr, ICMP_TTL);
  41566. IPH_CHKSUM_SET(iphdr, 0);
  41567. 802de1a: 72aa strb r2, [r5, #10]
  41568. 802de1c: 72ea strb r2, [r5, #11]
  41569. #else // CHECKSUM_GEN_ICMP
  41570. iecho->chksum = 0;
  41571. #endif // CHECKSUM_GEN_ICMP
  41572. */
  41573. /* Set the correct TTL and recalculate the header checksum. */
  41574. IPH_TTL_SET(iphdr, ICMP_TTL);
  41575. 802de1e: 722e strb r6, [r5, #8]
  41576. IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN));
  41577. #endif /* CHECKSUM_GEN_IP */
  41578. ICMP_STATS_INC(icmp.xmit);
  41579. /* increase number of messages attempted to send */
  41580. snmp_inc_icmpoutmsgs();
  41581. 802de20: f001 ffbe bl 802fda0 <snmp_inc_icmpoutmsgs>
  41582. /* increase number of echo replies attempted to send */
  41583. snmp_inc_icmpoutechoreps();
  41584. 802de24: f001 ffcc bl 802fdc0 <snmp_inc_icmpoutechoreps>
  41585. if(pbuf_header(p, hlen)) {
  41586. 802de28: 4620 mov r0, r4
  41587. 802de2a: 4641 mov r1, r8
  41588. 802de2c: f7fd f9e5 bl 802b1fa <pbuf_header>
  41589. 802de30: 4602 mov r2, r0
  41590. 802de32: b938 cbnz r0, 802de44 <icmp_input+0x108>
  41591. LWIP_ASSERT("Can't move over header in packet", 0);
  41592. } else {
  41593. err_t ret;
  41594. /* send an ICMP packet, src addr is the dest addr of the curren packet */
  41595. ret = ip_output_if(p, ip_current_dest_addr(), IP_HDRINCL,
  41596. 802de34: 2301 movs r3, #1
  41597. 802de36: e88d 0089 stmia.w sp, {r0, r3, r7}
  41598. 802de3a: 4620 mov r0, r4
  41599. 802de3c: 4649 mov r1, r9
  41600. 802de3e: 4633 mov r3, r6
  41601. 802de40: f000 fa94 bl 802e36c <ip_output_if>
  41602. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n",
  41603. (s16_t)type, (s16_t)code));
  41604. ICMP_STATS_INC(icmp.proterr);
  41605. ICMP_STATS_INC(icmp.drop);
  41606. }
  41607. pbuf_free(p);
  41608. 802de44: 4620 mov r0, r4
  41609. pbuf_free(p);
  41610. ICMP_STATS_INC(icmp.err);
  41611. snmp_inc_icmpinerrors();
  41612. return;
  41613. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
  41614. }
  41615. 802de46: b005 add sp, #20
  41616. 802de48: e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr}
  41617. LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n",
  41618. (s16_t)type, (s16_t)code));
  41619. ICMP_STATS_INC(icmp.proterr);
  41620. ICMP_STATS_INC(icmp.drop);
  41621. }
  41622. pbuf_free(p);
  41623. 802de4c: f7fd ba00 b.w 802b250 <pbuf_free>
  41624. ICMP_STATS_INC(icmp.lenerr);
  41625. snmp_inc_icmpinerrors();
  41626. return;
  41627. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
  41628. memerr:
  41629. pbuf_free(p);
  41630. 802de50: 4620 mov r0, r4
  41631. 802de52: f7fd f9fd bl 802b250 <pbuf_free>
  41632. ICMP_STATS_INC(icmp.err);
  41633. snmp_inc_icmpinerrors();
  41634. return;
  41635. #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */
  41636. }
  41637. 802de56: b005 add sp, #20
  41638. 802de58: e8bd 43f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, lr}
  41639. return;
  41640. #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
  41641. memerr:
  41642. pbuf_free(p);
  41643. ICMP_STATS_INC(icmp.err);
  41644. snmp_inc_icmpinerrors();
  41645. 802de5c: f001 bf98 b.w 802fd90 <snmp_inc_icmpinerrors>
  41646. 802de60: 20010da0 .word 0x20010da0
  41647. 802de64: 20010d98 .word 0x20010d98
  41648. 0802de68 <icmp_dest_unreach>:
  41649. * p->payload pointing to the IP header
  41650. * @param t type of the 'unreachable' packet
  41651. */
  41652. void
  41653. icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)
  41654. {
  41655. 802de68: e92d 41ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, lr}
  41656. 802de6c: 4607 mov r7, r0
  41657. 802de6e: 460d mov r5, r1
  41658. /* we can use the echo header here */
  41659. struct icmp_echo_hdr *icmphdr;
  41660. ip_addr_t iphdr_src;
  41661. /* ICMP header + IP header + 8 bytes of data */
  41662. q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE,
  41663. 802de70: 2001 movs r0, #1
  41664. 802de72: 2124 movs r1, #36 ; 0x24
  41665. 802de74: 2200 movs r2, #0
  41666. 802de76: f7fd fa38 bl 802b2ea <pbuf_alloc>
  41667. PBUF_RAM);
  41668. if (q == NULL) {
  41669. 802de7a: 4606 mov r6, r0
  41670. 802de7c: b358 cbz r0, 802ded6 <icmp_dest_unreach+0x6e>
  41671. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->src));
  41672. LWIP_DEBUGF(ICMP_DEBUG, (" to "));
  41673. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest));
  41674. LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
  41675. icmphdr = (struct icmp_echo_hdr *)q->payload;
  41676. 802de7e: 6844 ldr r4, [r0, #4]
  41677. return;
  41678. }
  41679. LWIP_ASSERT("check that first pbuf can hold icmp message",
  41680. (q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE)));
  41681. iphdr = (struct ip_hdr *)p->payload;
  41682. 802de80: f8d7 8004 ldr.w r8, [r7, #4]
  41683. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest));
  41684. LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
  41685. icmphdr = (struct icmp_echo_hdr *)q->payload;
  41686. icmphdr->type = type;
  41687. icmphdr->code = code;
  41688. 802de84: 7065 strb r5, [r4, #1]
  41689. LWIP_DEBUGF(ICMP_DEBUG, (" to "));
  41690. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest));
  41691. LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
  41692. icmphdr = (struct icmp_echo_hdr *)q->payload;
  41693. icmphdr->type = type;
  41694. 802de86: 2303 movs r3, #3
  41695. icmphdr->code = code;
  41696. icmphdr->id = 0;
  41697. 802de88: 2500 movs r5, #0
  41698. LWIP_DEBUGF(ICMP_DEBUG, (" to "));
  41699. ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest));
  41700. LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
  41701. icmphdr = (struct icmp_echo_hdr *)q->payload;
  41702. icmphdr->type = type;
  41703. 802de8a: 7023 strb r3, [r4, #0]
  41704. icmphdr->code = code;
  41705. icmphdr->id = 0;
  41706. 802de8c: 7125 strb r5, [r4, #4]
  41707. 802de8e: 7165 strb r5, [r4, #5]
  41708. icmphdr->seqno = 0;
  41709. 802de90: 71a5 strb r5, [r4, #6]
  41710. 802de92: 71e5 strb r5, [r4, #7]
  41711. /* copy fields from original packet */
  41712. SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload,
  41713. 802de94: 6840 ldr r0, [r0, #4]
  41714. 802de96: 6879 ldr r1, [r7, #4]
  41715. 802de98: 221c movs r2, #28
  41716. 802de9a: 3008 adds r0, #8
  41717. 802de9c: f7f3 fbd2 bl 8021644 <memcpy>
  41718. IP_HLEN + ICMP_DEST_UNREACH_DATASIZE);
  41719. /* calculate checksum */
  41720. icmphdr->chksum = 0;
  41721. 802dea0: 70a5 strb r5, [r4, #2]
  41722. 802dea2: 70e5 strb r5, [r4, #3]
  41723. icmphdr->chksum = inet_chksum(icmphdr, q->len);
  41724. 802dea4: 8971 ldrh r1, [r6, #10]
  41725. 802dea6: 4620 mov r0, r4
  41726. 802dea8: f000 f842 bl 802df30 <inet_chksum>
  41727. 802deac: 8060 strh r0, [r4, #2]
  41728. ICMP_STATS_INC(icmp.xmit);
  41729. /* increase number of messages attempted to send */
  41730. snmp_inc_icmpoutmsgs();
  41731. 802deae: f001 ff77 bl 802fda0 <snmp_inc_icmpoutmsgs>
  41732. /* increase number of destination unreachable messages attempted to send */
  41733. snmp_inc_icmpouttimeexcds();
  41734. 802deb2: f001 ff7d bl 802fdb0 <snmp_inc_icmpouttimeexcds>
  41735. ip_addr_copy(iphdr_src, iphdr->src);
  41736. 802deb6: f8d8 300c ldr.w r3, [r8, #12]
  41737. 802deba: aa04 add r2, sp, #16
  41738. ip_output(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP);
  41739. 802debc: 4630 mov r0, r6
  41740. ICMP_STATS_INC(icmp.xmit);
  41741. /* increase number of messages attempted to send */
  41742. snmp_inc_icmpoutmsgs();
  41743. /* increase number of destination unreachable messages attempted to send */
  41744. snmp_inc_icmpouttimeexcds();
  41745. ip_addr_copy(iphdr_src, iphdr->src);
  41746. 802debe: f842 3d04 str.w r3, [r2, #-4]!
  41747. ip_output(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP);
  41748. 802dec2: 2301 movs r3, #1
  41749. 802dec4: 9301 str r3, [sp, #4]
  41750. 802dec6: 9500 str r5, [sp, #0]
  41751. 802dec8: 4629 mov r1, r5
  41752. 802deca: 23ff movs r3, #255 ; 0xff
  41753. 802decc: f000 fa9e bl 802e40c <ip_output>
  41754. pbuf_free(q);
  41755. 802ded0: 4630 mov r0, r6
  41756. 802ded2: f7fd f9bd bl 802b250 <pbuf_free>
  41757. */
  41758. void
  41759. icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)
  41760. {
  41761. icmp_send_response(p, ICMP_DUR, t);
  41762. }
  41763. 802ded6: e8bd 81ff ldmia.w sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, pc}
  41764. 0802deda <lwip_standard_chksum>:
  41765. * @return host order (!) lwip checksum (non-inverted Internet sum)
  41766. */
  41767. static u16_t
  41768. lwip_standard_chksum(void *dataptr, int len)
  41769. {
  41770. 802deda: b513 push {r0, r1, r4, lr}
  41771. u8_t *pb = (u8_t *)dataptr;
  41772. u16_t *ps, t = 0;
  41773. 802dedc: 2300 movs r3, #0
  41774. u32_t sum = 0;
  41775. int odd = ((mem_ptr_t)pb & 1);
  41776. /* Get aligned to u16_t */
  41777. if (odd && len > 0) {
  41778. 802dede: f010 0201 ands.w r2, r0, #1
  41779. static u16_t
  41780. lwip_standard_chksum(void *dataptr, int len)
  41781. {
  41782. u8_t *pb = (u8_t *)dataptr;
  41783. u16_t *ps, t = 0;
  41784. 802dee2: f8ad 3006 strh.w r3, [sp, #6]
  41785. u32_t sum = 0;
  41786. int odd = ((mem_ptr_t)pb & 1);
  41787. /* Get aligned to u16_t */
  41788. if (odd && len > 0) {
  41789. 802dee6: d006 beq.n 802def6 <lwip_standard_chksum+0x1c>
  41790. 802dee8: 4299 cmp r1, r3
  41791. 802deea: dd04 ble.n 802def6 <lwip_standard_chksum+0x1c>
  41792. ((u8_t *)&t)[1] = *pb++;
  41793. 802deec: f810 3b01 ldrb.w r3, [r0], #1
  41794. len--;
  41795. 802def0: 3901 subs r1, #1
  41796. u32_t sum = 0;
  41797. int odd = ((mem_ptr_t)pb & 1);
  41798. /* Get aligned to u16_t */
  41799. if (odd && len > 0) {
  41800. ((u8_t *)&t)[1] = *pb++;
  41801. 802def2: f88d 3007 strb.w r3, [sp, #7]
  41802. static u16_t
  41803. lwip_standard_chksum(void *dataptr, int len)
  41804. {
  41805. u8_t *pb = (u8_t *)dataptr;
  41806. u16_t *ps, t = 0;
  41807. u32_t sum = 0;
  41808. 802def6: 2300 movs r3, #0
  41809. len--;
  41810. }
  41811. /* Add the bulk of the data */
  41812. ps = (u16_t *)(void *)pb;
  41813. while (len > 1) {
  41814. 802def8: e003 b.n 802df02 <lwip_standard_chksum+0x28>
  41815. sum += *ps++;
  41816. 802defa: f830 4b02 ldrh.w r4, [r0], #2
  41817. len -= 2;
  41818. 802defe: 3902 subs r1, #2
  41819. }
  41820. /* Add the bulk of the data */
  41821. ps = (u16_t *)(void *)pb;
  41822. while (len > 1) {
  41823. sum += *ps++;
  41824. 802df00: 191b adds r3, r3, r4
  41825. len--;
  41826. }
  41827. /* Add the bulk of the data */
  41828. ps = (u16_t *)(void *)pb;
  41829. while (len > 1) {
  41830. 802df02: 2901 cmp r1, #1
  41831. 802df04: dcf9 bgt.n 802defa <lwip_standard_chksum+0x20>
  41832. len -= 2;
  41833. }
  41834. /* Consume left-over byte, if any */
  41835. if (len > 0) {
  41836. ((u8_t *)&t)[0] = *(u8_t *)ps;
  41837. 802df06: bf04 itt eq
  41838. 802df08: 7801 ldrbeq r1, [r0, #0]
  41839. 802df0a: f88d 1006 strbeq.w r1, [sp, #6]
  41840. }
  41841. /* Add end bytes */
  41842. sum += t;
  41843. 802df0e: f8bd 0006 ldrh.w r0, [sp, #6]
  41844. 802df12: 181b adds r3, r3, r0
  41845. /* Fold 32-bit sum to 16 bits
  41846. calling this twice is propably faster than if statements... */
  41847. sum = FOLD_U32T(sum);
  41848. 802df14: b298 uxth r0, r3
  41849. 802df16: eb00 4313 add.w r3, r0, r3, lsr #16
  41850. sum = FOLD_U32T(sum);
  41851. 802df1a: b298 uxth r0, r3
  41852. 802df1c: eb00 4013 add.w r0, r0, r3, lsr #16
  41853. /* Swap if alignment was odd */
  41854. if (odd) {
  41855. 802df20: b122 cbz r2, 802df2c <lwip_standard_chksum+0x52>
  41856. sum = SWAP_BYTES_IN_WORD(sum);
  41857. 802df22: 0603 lsls r3, r0, #24
  41858. 802df24: f3c0 2007 ubfx r0, r0, #8, #8
  41859. 802df28: ea40 4013 orr.w r0, r0, r3, lsr #16
  41860. }
  41861. return (u16_t)sum;
  41862. }
  41863. 802df2c: b280 uxth r0, r0
  41864. 802df2e: bd1c pop {r2, r3, r4, pc}
  41865. 0802df30 <inet_chksum>:
  41866. * @return checksum (as u16_t) to be saved directly in the protocol header
  41867. */
  41868. u16_t
  41869. inet_chksum(void *dataptr, u16_t len)
  41870. {
  41871. 802df30: b508 push {r3, lr}
  41872. return ~LWIP_CHKSUM(dataptr, len);
  41873. 802df32: f7ff ffd2 bl 802deda <lwip_standard_chksum>
  41874. 802df36: 43c0 mvns r0, r0
  41875. }
  41876. 802df38: b280 uxth r0, r0
  41877. 802df3a: bd08 pop {r3, pc}
  41878. 0802df3c <inet_chksum_pbuf>:
  41879. * @param p pbuf chain over that the checksum should be calculated
  41880. * @return checksum (as u16_t) to be saved directly in the protocol header
  41881. */
  41882. u16_t
  41883. inet_chksum_pbuf(struct pbuf *p)
  41884. {
  41885. 802df3c: b570 push {r4, r5, r6, lr}
  41886. u32_t acc;
  41887. struct pbuf *q;
  41888. u8_t swapped;
  41889. acc = 0;
  41890. swapped = 0;
  41891. 802df3e: 2600 movs r6, #0
  41892. * @param p pbuf chain over that the checksum should be calculated
  41893. * @return checksum (as u16_t) to be saved directly in the protocol header
  41894. */
  41895. u16_t
  41896. inet_chksum_pbuf(struct pbuf *p)
  41897. {
  41898. 802df40: 4605 mov r5, r0
  41899. u32_t acc;
  41900. struct pbuf *q;
  41901. u8_t swapped;
  41902. acc = 0;
  41903. 802df42: 4634 mov r4, r6
  41904. swapped = 0;
  41905. for(q = p; q != NULL; q = q->next) {
  41906. 802df44: e013 b.n 802df6e <inet_chksum_pbuf+0x32>
  41907. acc += LWIP_CHKSUM(q->payload, q->len);
  41908. 802df46: 8969 ldrh r1, [r5, #10]
  41909. 802df48: 6868 ldr r0, [r5, #4]
  41910. 802df4a: f7ff ffc6 bl 802deda <lwip_standard_chksum>
  41911. acc = FOLD_U32T(acc);
  41912. if (q->len % 2 != 0) {
  41913. 802df4e: 896b ldrh r3, [r5, #10]
  41914. u8_t swapped;
  41915. acc = 0;
  41916. swapped = 0;
  41917. for(q = p; q != NULL; q = q->next) {
  41918. acc += LWIP_CHKSUM(q->payload, q->len);
  41919. 802df50: 1900 adds r0, r0, r4
  41920. acc = FOLD_U32T(acc);
  41921. 802df52: b284 uxth r4, r0
  41922. if (q->len % 2 != 0) {
  41923. 802df54: 07d9 lsls r1, r3, #31
  41924. acc = 0;
  41925. swapped = 0;
  41926. for(q = p; q != NULL; q = q->next) {
  41927. acc += LWIP_CHKSUM(q->payload, q->len);
  41928. acc = FOLD_U32T(acc);
  41929. 802df56: eb04 4410 add.w r4, r4, r0, lsr #16
  41930. if (q->len % 2 != 0) {
  41931. 802df5a: d507 bpl.n 802df6c <inet_chksum_pbuf+0x30>
  41932. swapped = 1 - swapped;
  41933. acc = SWAP_BYTES_IN_WORD(acc);
  41934. 802df5c: 0623 lsls r3, r4, #24
  41935. swapped = 0;
  41936. for(q = p; q != NULL; q = q->next) {
  41937. acc += LWIP_CHKSUM(q->payload, q->len);
  41938. acc = FOLD_U32T(acc);
  41939. if (q->len % 2 != 0) {
  41940. swapped = 1 - swapped;
  41941. 802df5e: f1c6 0601 rsb r6, r6, #1
  41942. acc = SWAP_BYTES_IN_WORD(acc);
  41943. 802df62: f3c4 2407 ubfx r4, r4, #8, #8
  41944. swapped = 0;
  41945. for(q = p; q != NULL; q = q->next) {
  41946. acc += LWIP_CHKSUM(q->payload, q->len);
  41947. acc = FOLD_U32T(acc);
  41948. if (q->len % 2 != 0) {
  41949. swapped = 1 - swapped;
  41950. 802df66: b2f6 uxtb r6, r6
  41951. acc = SWAP_BYTES_IN_WORD(acc);
  41952. 802df68: ea44 4413 orr.w r4, r4, r3, lsr #16
  41953. struct pbuf *q;
  41954. u8_t swapped;
  41955. acc = 0;
  41956. swapped = 0;
  41957. for(q = p; q != NULL; q = q->next) {
  41958. 802df6c: 682d ldr r5, [r5, #0]
  41959. 802df6e: 2d00 cmp r5, #0
  41960. 802df70: d1e9 bne.n 802df46 <inet_chksum_pbuf+0xa>
  41961. swapped = 1 - swapped;
  41962. acc = SWAP_BYTES_IN_WORD(acc);
  41963. }
  41964. }
  41965. if (swapped) {
  41966. 802df72: b126 cbz r6, 802df7e <inet_chksum_pbuf+0x42>
  41967. acc = SWAP_BYTES_IN_WORD(acc);
  41968. 802df74: 0623 lsls r3, r4, #24
  41969. 802df76: f3c4 2407 ubfx r4, r4, #8, #8
  41970. 802df7a: ea44 4413 orr.w r4, r4, r3, lsr #16
  41971. }
  41972. return (u16_t)~(acc & 0xffffUL);
  41973. 802df7e: 43e0 mvns r0, r4
  41974. }
  41975. 802df80: b280 uxth r0, r0
  41976. 802df82: bd70 pop {r4, r5, r6, pc}
  41977. 0802df84 <ip4_addr_isbroadcast>:
  41978. {
  41979. ip_addr_t ipaddr;
  41980. ip4_addr_set_u32(&ipaddr, addr);
  41981. /* all ones (broadcast) or all zeroes (old skool broadcast) */
  41982. if ((~addr == IPADDR_ANY) ||
  41983. 802df84: 1e43 subs r3, r0, #1
  41984. 802df86: 3303 adds r3, #3
  41985. 802df88: d811 bhi.n 802dfae <ip4_addr_isbroadcast+0x2a>
  41986. (addr == IPADDR_ANY)) {
  41987. return 1;
  41988. /* no broadcast support on this network interface? */
  41989. } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) {
  41990. 802df8a: f891 302d ldrb.w r3, [r1, #45] ; 0x2d
  41991. 802df8e: f003 0302 and.w r3, r3, #2
  41992. 802df92: b2db uxtb r3, r3
  41993. 802df94: b16b cbz r3, 802dfb2 <ip4_addr_isbroadcast+0x2e>
  41994. /* the given address cannot be a broadcast address
  41995. * nor can we check against any broadcast addresses */
  41996. return 0;
  41997. /* address matches network interface address exactly? => no broadcast */
  41998. } else if (addr == ip4_addr_get_u32(&netif->ip_addr)) {
  41999. 802df96: 684a ldr r2, [r1, #4]
  42000. 802df98: 4290 cmp r0, r2
  42001. 802df9a: d00a beq.n 802dfb2 <ip4_addr_isbroadcast+0x2e>
  42002. return 0;
  42003. /* on the same (sub) network... */
  42004. } else if (ip_addr_netcmp(&ipaddr, &(netif->ip_addr), &(netif->netmask))
  42005. 802df9c: 688b ldr r3, [r1, #8]
  42006. 802df9e: 4042 eors r2, r0
  42007. 802dfa0: 421a tst r2, r3
  42008. 802dfa2: d000 beq.n 802dfa6 <ip4_addr_isbroadcast+0x22>
  42009. 802dfa4: e005 b.n 802dfb2 <ip4_addr_isbroadcast+0x2e>
  42010. /* ...and host identifier bits are all ones? =>... */
  42011. && ((addr & ~ip4_addr_get_u32(&netif->netmask)) ==
  42012. 802dfa6: 43db mvns r3, r3
  42013. 802dfa8: 4018 ands r0, r3
  42014. 802dfaa: 4298 cmp r0, r3
  42015. 802dfac: d101 bne.n 802dfb2 <ip4_addr_isbroadcast+0x2e>
  42016. ip4_addr_set_u32(&ipaddr, addr);
  42017. /* all ones (broadcast) or all zeroes (old skool broadcast) */
  42018. if ((~addr == IPADDR_ANY) ||
  42019. (addr == IPADDR_ANY)) {
  42020. return 1;
  42021. 802dfae: 2001 movs r0, #1
  42022. 802dfb0: 4770 bx lr
  42023. /* no broadcast support on this network interface? */
  42024. } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) {
  42025. /* the given address cannot be a broadcast address
  42026. * nor can we check against any broadcast addresses */
  42027. return 0;
  42028. 802dfb2: 2000 movs r0, #0
  42029. /* => network broadcast address */
  42030. return 1;
  42031. } else {
  42032. return 0;
  42033. }
  42034. }
  42035. 802dfb4: 4770 bx lr
  42036. 0802dfb6 <ipaddr_aton>:
  42037. * @param addr pointer to which to save the ip address in network order
  42038. * @return 1 if cp could be converted to addr, 0 on failure
  42039. */
  42040. int
  42041. ipaddr_aton(const char *cp, ip_addr_t *addr)
  42042. {
  42043. 802dfb6: b5f0 push {r4, r5, r6, r7, lr}
  42044. u8_t base;
  42045. char c;
  42046. u32_t parts[4];
  42047. u32_t *pp = parts;
  42048. c = *cp;
  42049. 802dfb8: 7803 ldrb r3, [r0, #0]
  42050. * @param addr pointer to which to save the ip address in network order
  42051. * @return 1 if cp could be converted to addr, 0 on failure
  42052. */
  42053. int
  42054. ipaddr_aton(const char *cp, ip_addr_t *addr)
  42055. {
  42056. 802dfba: b085 sub sp, #20
  42057. 802dfbc: 460e mov r6, r1
  42058. u8_t base;
  42059. char c;
  42060. u32_t parts[4];
  42061. u32_t *pp = parts;
  42062. c = *cp;
  42063. 802dfbe: 2400 movs r4, #0
  42064. * @param cp IP address in ascii represenation (e.g. "127.0.0.1")
  42065. * @param addr pointer to which to save the ip address in network order
  42066. * @return 1 if cp could be converted to addr, 0 on failure
  42067. */
  42068. int
  42069. ipaddr_aton(const char *cp, ip_addr_t *addr)
  42070. 802dfc0: aa00 add r2, sp, #0
  42071. 802dfc2: 18a7 adds r7, r4, r2
  42072. /*
  42073. * Collect number up to ``.''.
  42074. * Values are specified as for C:
  42075. * 0x=hex, 0=octal, 1-9=decimal.
  42076. */
  42077. if (!isdigit(c))
  42078. 802dfc4: f1a3 0230 sub.w r2, r3, #48 ; 0x30
  42079. 802dfc8: 2a09 cmp r2, #9
  42080. 802dfca: d86d bhi.n 802e0a8 <ipaddr_aton+0xf2>
  42081. return (0);
  42082. val = 0;
  42083. base = 10;
  42084. if (c == '0') {
  42085. 802dfcc: 2b30 cmp r3, #48 ; 0x30
  42086. 802dfce: d10b bne.n 802dfe8 <ipaddr_aton+0x32>
  42087. c = *++cp;
  42088. 802dfd0: 7843 ldrb r3, [r0, #1]
  42089. if (c == 'x' || c == 'X') {
  42090. 802dfd2: 2b78 cmp r3, #120 ; 0x78
  42091. 802dfd4: d004 beq.n 802dfe0 <ipaddr_aton+0x2a>
  42092. 802dfd6: 2b58 cmp r3, #88 ; 0x58
  42093. 802dfd8: d002 beq.n 802dfe0 <ipaddr_aton+0x2a>
  42094. if (!isdigit(c))
  42095. return (0);
  42096. val = 0;
  42097. base = 10;
  42098. if (c == '0') {
  42099. c = *++cp;
  42100. 802dfda: 3001 adds r0, #1
  42101. if (c == 'x' || c == 'X') {
  42102. base = 16;
  42103. c = *++cp;
  42104. } else
  42105. base = 8;
  42106. 802dfdc: 2508 movs r5, #8
  42107. 802dfde: e004 b.n 802dfea <ipaddr_aton+0x34>
  42108. base = 10;
  42109. if (c == '0') {
  42110. c = *++cp;
  42111. if (c == 'x' || c == 'X') {
  42112. base = 16;
  42113. c = *++cp;
  42114. 802dfe0: 7883 ldrb r3, [r0, #2]
  42115. val = 0;
  42116. base = 10;
  42117. if (c == '0') {
  42118. c = *++cp;
  42119. if (c == 'x' || c == 'X') {
  42120. base = 16;
  42121. 802dfe2: 2510 movs r5, #16
  42122. c = *++cp;
  42123. 802dfe4: 3002 adds r0, #2
  42124. 802dfe6: e000 b.n 802dfea <ipaddr_aton+0x34>
  42125. * 0x=hex, 0=octal, 1-9=decimal.
  42126. */
  42127. if (!isdigit(c))
  42128. return (0);
  42129. val = 0;
  42130. base = 10;
  42131. 802dfe8: 250a movs r5, #10
  42132. 802dfea: 4602 mov r2, r0
  42133. if (c == '0') {
  42134. c = *++cp;
  42135. if (c == 'x' || c == 'X') {
  42136. base = 16;
  42137. 802dfec: 2000 movs r0, #0
  42138. 802dfee: e000 b.n 802dff2 <ipaddr_aton+0x3c>
  42139. 802dff0: 3201 adds r2, #1
  42140. c = *++cp;
  42141. } else
  42142. base = 8;
  42143. }
  42144. for (;;) {
  42145. if (isdigit(c)) {
  42146. 802dff2: f1a3 0130 sub.w r1, r3, #48 ; 0x30
  42147. 802dff6: 2909 cmp r1, #9
  42148. 802dff8: d803 bhi.n 802e002 <ipaddr_aton+0x4c>
  42149. val = (val * base) + (int)(c - '0');
  42150. 802dffa: fb05 3000 mla r0, r5, r0, r3
  42151. 802dffe: 3830 subs r0, #48 ; 0x30
  42152. 802e000: e013 b.n 802e02a <ipaddr_aton+0x74>
  42153. c = *++cp;
  42154. } else if (base == 16 && isxdigit(c)) {
  42155. 802e002: 2d10 cmp r5, #16
  42156. 802e004: d113 bne.n 802e02e <ipaddr_aton+0x78>
  42157. 802e006: f1a3 0161 sub.w r1, r3, #97 ; 0x61
  42158. 802e00a: b2c9 uxtb r1, r1
  42159. 802e00c: 2905 cmp r1, #5
  42160. 802e00e: d904 bls.n 802e01a <ipaddr_aton+0x64>
  42161. 802e010: f1a3 0c41 sub.w ip, r3, #65 ; 0x41
  42162. 802e014: f1bc 0f05 cmp.w ip, #5
  42163. 802e018: d809 bhi.n 802e02e <ipaddr_aton+0x78>
  42164. val = (val << 4) | (int)(c + 10 - (islower(c) ? 'a' : 'A'));
  42165. 802e01a: 330a adds r3, #10
  42166. 802e01c: 2919 cmp r1, #25
  42167. 802e01e: bf8c ite hi
  42168. 802e020: 2141 movhi r1, #65 ; 0x41
  42169. 802e022: 2161 movls r1, #97 ; 0x61
  42170. 802e024: 1a5b subs r3, r3, r1
  42171. 802e026: ea43 1000 orr.w r0, r3, r0, lsl #4
  42172. c = *++cp;
  42173. 802e02a: 7853 ldrb r3, [r2, #1]
  42174. 802e02c: e7e0 b.n 802dff0 <ipaddr_aton+0x3a>
  42175. } else
  42176. break;
  42177. }
  42178. if (c == '.') {
  42179. 802e02e: 2b2e cmp r3, #46 ; 0x2e
  42180. 802e030: d107 bne.n 802e042 <ipaddr_aton+0x8c>
  42181. * Internet format:
  42182. * a.b.c.d
  42183. * a.b.c (with c treated as 16 bits)
  42184. * a.b (with b treated as 24 bits)
  42185. */
  42186. if (pp >= parts + 3) {
  42187. 802e032: 2c0c cmp r4, #12
  42188. 802e034: d038 beq.n 802e0a8 <ipaddr_aton+0xf2>
  42189. return (0);
  42190. }
  42191. *pp++ = val;
  42192. 802e036: f84d 0004 str.w r0, [sp, r4]
  42193. c = *++cp;
  42194. 802e03a: 7853 ldrb r3, [r2, #1]
  42195. 802e03c: 1c50 adds r0, r2, #1
  42196. 802e03e: 3404 adds r4, #4
  42197. } else
  42198. break;
  42199. }
  42200. 802e040: e7be b.n 802dfc0 <ipaddr_aton+0xa>
  42201. 802e042: 2b0d cmp r3, #13
  42202. 802e044: d803 bhi.n 802e04e <ipaddr_aton+0x98>
  42203. 802e046: 2b09 cmp r3, #9
  42204. 802e048: d203 bcs.n 802e052 <ipaddr_aton+0x9c>
  42205. 802e04a: b113 cbz r3, 802e052 <ipaddr_aton+0x9c>
  42206. 802e04c: e02c b.n 802e0a8 <ipaddr_aton+0xf2>
  42207. 802e04e: 2b20 cmp r3, #32
  42208. 802e050: d12a bne.n 802e0a8 <ipaddr_aton+0xf2>
  42209. }
  42210. /*
  42211. * Concoct the address according to
  42212. * the number of parts specified.
  42213. */
  42214. switch (pp - parts + 1) {
  42215. 802e052: 466b mov r3, sp
  42216. 802e054: 1afb subs r3, r7, r3
  42217. 802e056: 109b asrs r3, r3, #2
  42218. 802e058: 3301 adds r3, #1
  42219. 802e05a: 2b04 cmp r3, #4
  42220. 802e05c: d81f bhi.n 802e09e <ipaddr_aton+0xe8>
  42221. 802e05e: e8df f003 tbb [pc, r3]
  42222. 802e062: 1e23 .short 0x1e23
  42223. 802e064: 0a03 .short 0x0a03
  42224. 802e066: 13 .byte 0x13
  42225. 802e067: 00 .byte 0x00
  42226. case 1: /* a -- 32 bits */
  42227. break;
  42228. case 2: /* a.b -- 8.24 bits */
  42229. if (val > 0xffffffUL) {
  42230. 802e068: f1b0 7f80 cmp.w r0, #16777216 ; 0x1000000
  42231. 802e06c: d21c bcs.n 802e0a8 <ipaddr_aton+0xf2>
  42232. return (0);
  42233. }
  42234. val |= parts[0] << 24;
  42235. 802e06e: 9b00 ldr r3, [sp, #0]
  42236. 802e070: ea40 6003 orr.w r0, r0, r3, lsl #24
  42237. break;
  42238. 802e074: e013 b.n 802e09e <ipaddr_aton+0xe8>
  42239. case 3: /* a.b.c -- 8.8.16 bits */
  42240. if (val > 0xffff) {
  42241. 802e076: f5b0 3f80 cmp.w r0, #65536 ; 0x10000
  42242. 802e07a: d215 bcs.n 802e0a8 <ipaddr_aton+0xf2>
  42243. return (0);
  42244. }
  42245. val |= (parts[0] << 24) | (parts[1] << 16);
  42246. 802e07c: 9b00 ldr r3, [sp, #0]
  42247. 802e07e: 061a lsls r2, r3, #24
  42248. 802e080: 9b01 ldr r3, [sp, #4]
  42249. 802e082: ea42 4303 orr.w r3, r2, r3, lsl #16
  42250. 802e086: e009 b.n 802e09c <ipaddr_aton+0xe6>
  42251. break;
  42252. case 4: /* a.b.c.d -- 8.8.8.8 bits */
  42253. if (val > 0xff) {
  42254. 802e088: 28ff cmp r0, #255 ; 0xff
  42255. 802e08a: d80d bhi.n 802e0a8 <ipaddr_aton+0xf2>
  42256. return (0);
  42257. }
  42258. val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
  42259. 802e08c: 9b00 ldr r3, [sp, #0]
  42260. 802e08e: 061a lsls r2, r3, #24
  42261. 802e090: 9b01 ldr r3, [sp, #4]
  42262. 802e092: ea42 4203 orr.w r2, r2, r3, lsl #16
  42263. 802e096: 9b02 ldr r3, [sp, #8]
  42264. 802e098: ea42 2303 orr.w r3, r2, r3, lsl #8
  42265. 802e09c: 4318 orrs r0, r3
  42266. break;
  42267. default:
  42268. LWIP_ASSERT("unhandled", 0);
  42269. break;
  42270. }
  42271. if (addr) {
  42272. 802e09e: b12e cbz r6, 802e0ac <ipaddr_aton+0xf6>
  42273. ip4_addr_set_u32(addr, htonl(val));
  42274. 802e0a0: f7fb ffa2 bl 8029fe8 <lwip_htonl>
  42275. 802e0a4: 6030 str r0, [r6, #0]
  42276. 802e0a6: e001 b.n 802e0ac <ipaddr_aton+0xf6>
  42277. * Collect number up to ``.''.
  42278. * Values are specified as for C:
  42279. * 0x=hex, 0=octal, 1-9=decimal.
  42280. */
  42281. if (!isdigit(c))
  42282. return (0);
  42283. 802e0a8: 2000 movs r0, #0
  42284. 802e0aa: e000 b.n 802e0ae <ipaddr_aton+0xf8>
  42285. break;
  42286. }
  42287. if (addr) {
  42288. ip4_addr_set_u32(addr, htonl(val));
  42289. }
  42290. return (1);
  42291. 802e0ac: 2001 movs r0, #1
  42292. }
  42293. 802e0ae: b005 add sp, #20
  42294. 802e0b0: bdf0 pop {r4, r5, r6, r7, pc}
  42295. 0802e0b2 <ipaddr_addr>:
  42296. * @param cp IP address in ascii represenation (e.g. "127.0.0.1")
  42297. * @return ip address in network order
  42298. */
  42299. u32_t
  42300. ipaddr_addr(const char *cp)
  42301. {
  42302. 802e0b2: b507 push {r0, r1, r2, lr}
  42303. ip_addr_t val;
  42304. if (ipaddr_aton(cp, &val)) {
  42305. 802e0b4: a901 add r1, sp, #4
  42306. 802e0b6: f7ff ff7e bl 802dfb6 <ipaddr_aton>
  42307. 802e0ba: b108 cbz r0, 802e0c0 <ipaddr_addr+0xe>
  42308. return ip4_addr_get_u32(&val);
  42309. 802e0bc: 9801 ldr r0, [sp, #4]
  42310. 802e0be: e001 b.n 802e0c4 <ipaddr_addr+0x12>
  42311. }
  42312. return (IPADDR_NONE);
  42313. 802e0c0: f04f 30ff mov.w r0, #4294967295
  42314. }
  42315. 802e0c4: bd0e pop {r1, r2, r3, pc}
  42316. 0802e0c6 <ipaddr_ntoa_r>:
  42317. * @param buflen length of buf
  42318. * @return either pointer to buf which now holds the ASCII
  42319. * representation of addr or NULL if buf was too small
  42320. */
  42321. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  42322. {
  42323. 802e0c6: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  42324. u8_t rem;
  42325. u8_t n;
  42326. u8_t i;
  42327. int len = 0;
  42328. s_addr = ip4_addr_get_u32(addr);
  42329. 802e0ca: 6803 ldr r3, [r0, #0]
  42330. 802e0cc: a802 add r0, sp, #8
  42331. * @param buf target buffer where the string is stored
  42332. * @param buflen length of buf
  42333. * @return either pointer to buf which now holds the ASCII
  42334. * representation of addr or NULL if buf was too small
  42335. */
  42336. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  42337. 802e0ce: f10d 0807 add.w r8, sp, #7
  42338. u8_t rem;
  42339. u8_t n;
  42340. u8_t i;
  42341. int len = 0;
  42342. s_addr = ip4_addr_get_u32(addr);
  42343. 802e0d2: f840 3d04 str.w r3, [r0, #-4]!
  42344. rp = buf;
  42345. 802e0d6: 460c mov r4, r1
  42346. * @param buf target buffer where the string is stored
  42347. * @param buflen length of buf
  42348. * @return either pointer to buf which now holds the ASCII
  42349. * representation of addr or NULL if buf was too small
  42350. */
  42351. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  42352. 802e0d8: 3801 subs r0, #1
  42353. char *rp;
  42354. u8_t *ap;
  42355. u8_t rem;
  42356. u8_t n;
  42357. u8_t i;
  42358. int len = 0;
  42359. 802e0da: 2700 movs r7, #0
  42360. rp = buf;
  42361. ap = (u8_t *)&s_addr;
  42362. for(n = 0; n < 4; n++) {
  42363. i = 0;
  42364. do {
  42365. rem = *ap % (u8_t)10;
  42366. 802e0dc: f04f 0c0a mov.w ip, #10
  42367. *rp++ = inv[i];
  42368. }
  42369. if (len++ >= buflen) {
  42370. return NULL;
  42371. }
  42372. *rp++ = '.';
  42373. 802e0e0: f04f 092e mov.w r9, #46 ; 0x2e
  42374. 802e0e4: 7843 ldrb r3, [r0, #1]
  42375. * @param buf target buffer where the string is stored
  42376. * @param buflen length of buf
  42377. * @return either pointer to buf which now holds the ASCII
  42378. * representation of addr or NULL if buf was too small
  42379. */
  42380. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  42381. 802e0e6: 2500 movs r5, #0
  42382. rp = buf;
  42383. ap = (u8_t *)&s_addr;
  42384. for(n = 0; n < 4; n++) {
  42385. i = 0;
  42386. do {
  42387. rem = *ap % (u8_t)10;
  42388. 802e0e8: fbb3 f6fc udiv r6, r3, ip
  42389. *ap /= (u8_t)10;
  42390. inv[i++] = '0' + rem;
  42391. 802e0ec: f10d 0b08 add.w fp, sp, #8
  42392. rp = buf;
  42393. ap = (u8_t *)&s_addr;
  42394. for(n = 0; n < 4; n++) {
  42395. i = 0;
  42396. do {
  42397. rem = *ap % (u8_t)10;
  42398. 802e0f0: fb0c 3a16 mls sl, ip, r6, r3
  42399. *ap /= (u8_t)10;
  42400. inv[i++] = '0' + rem;
  42401. 802e0f4: eb0b 0305 add.w r3, fp, r5
  42402. 802e0f8: f10a 0a30 add.w sl, sl, #48 ; 0x30
  42403. 802e0fc: 3501 adds r5, #1
  42404. 802e0fe: f803 ac08 strb.w sl, [r3, #-8]
  42405. } while(*ap);
  42406. 802e102: f016 03ff ands.w r3, r6, #255 ; 0xff
  42407. for(n = 0; n < 4; n++) {
  42408. i = 0;
  42409. do {
  42410. rem = *ap % (u8_t)10;
  42411. *ap /= (u8_t)10;
  42412. inv[i++] = '0' + rem;
  42413. 802e106: b2ed uxtb r5, r5
  42414. } while(*ap);
  42415. 802e108: d1ee bne.n 802e0e8 <ipaddr_ntoa_r+0x22>
  42416. 802e10a: 3d01 subs r5, #1
  42417. * @param buf target buffer where the string is stored
  42418. * @param buflen length of buf
  42419. * @return either pointer to buf which now holds the ASCII
  42420. * representation of addr or NULL if buf was too small
  42421. */
  42422. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  42423. 802e10c: 1be6 subs r6, r4, r7
  42424. 802e10e: f800 3f01 strb.w r3, [r0, #1]!
  42425. 802e112: b2ed uxtb r5, r5
  42426. 802e114: 463b mov r3, r7
  42427. 802e116: 4637 mov r7, r6
  42428. 802e118: e00b b.n 802e132 <ipaddr_ntoa_r+0x6c>
  42429. 802e11a: 1e6c subs r4, r5, #1
  42430. rem = *ap % (u8_t)10;
  42431. *ap /= (u8_t)10;
  42432. inv[i++] = '0' + rem;
  42433. } while(*ap);
  42434. while(i--) {
  42435. if (len++ >= buflen) {
  42436. 802e11c: 4293 cmp r3, r2
  42437. 802e11e: b2e4 uxtb r4, r4
  42438. 802e120: da16 bge.n 802e150 <ipaddr_ntoa_r+0x8a>
  42439. return NULL;
  42440. }
  42441. *rp++ = inv[i];
  42442. 802e122: f10d 0a08 add.w sl, sp, #8
  42443. 802e126: 4455 add r5, sl
  42444. 802e128: f815 5c08 ldrb.w r5, [r5, #-8]
  42445. 802e12c: 54fd strb r5, [r7, r3]
  42446. 802e12e: 3301 adds r3, #1
  42447. 802e130: 4625 mov r5, r4
  42448. do {
  42449. rem = *ap % (u8_t)10;
  42450. *ap /= (u8_t)10;
  42451. inv[i++] = '0' + rem;
  42452. } while(*ap);
  42453. while(i--) {
  42454. 802e132: 2dff cmp r5, #255 ; 0xff
  42455. * @param buf target buffer where the string is stored
  42456. * @param buflen length of buf
  42457. * @return either pointer to buf which now holds the ASCII
  42458. * representation of addr or NULL if buf was too small
  42459. */
  42460. char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
  42461. 802e134: eb06 0403 add.w r4, r6, r3
  42462. do {
  42463. rem = *ap % (u8_t)10;
  42464. *ap /= (u8_t)10;
  42465. inv[i++] = '0' + rem;
  42466. } while(*ap);
  42467. while(i--) {
  42468. 802e138: d1ef bne.n 802e11a <ipaddr_ntoa_r+0x54>
  42469. if (len++ >= buflen) {
  42470. return NULL;
  42471. }
  42472. *rp++ = inv[i];
  42473. }
  42474. if (len++ >= buflen) {
  42475. 802e13a: 1c5f adds r7, r3, #1
  42476. 802e13c: 4293 cmp r3, r2
  42477. 802e13e: da07 bge.n 802e150 <ipaddr_ntoa_r+0x8a>
  42478. s_addr = ip4_addr_get_u32(addr);
  42479. rp = buf;
  42480. ap = (u8_t *)&s_addr;
  42481. for(n = 0; n < 4; n++) {
  42482. 802e140: 4540 cmp r0, r8
  42483. *rp++ = inv[i];
  42484. }
  42485. if (len++ >= buflen) {
  42486. return NULL;
  42487. }
  42488. *rp++ = '.';
  42489. 802e142: f804 9b01 strb.w r9, [r4], #1
  42490. s_addr = ip4_addr_get_u32(addr);
  42491. rp = buf;
  42492. ap = (u8_t *)&s_addr;
  42493. for(n = 0; n < 4; n++) {
  42494. 802e146: d1cd bne.n 802e0e4 <ipaddr_ntoa_r+0x1e>
  42495. return NULL;
  42496. }
  42497. *rp++ = '.';
  42498. ap++;
  42499. }
  42500. *--rp = 0;
  42501. 802e148: 2300 movs r3, #0
  42502. 802e14a: f804 3c01 strb.w r3, [r4, #-1]
  42503. 802e14e: e000 b.n 802e152 <ipaddr_ntoa_r+0x8c>
  42504. *ap /= (u8_t)10;
  42505. inv[i++] = '0' + rem;
  42506. } while(*ap);
  42507. while(i--) {
  42508. if (len++ >= buflen) {
  42509. return NULL;
  42510. 802e150: 2100 movs r1, #0
  42511. *rp++ = '.';
  42512. ap++;
  42513. }
  42514. *--rp = 0;
  42515. return buf;
  42516. }
  42517. 802e152: 4608 mov r0, r1
  42518. 802e154: e8bd 8ffe ldmia.w sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  42519. 0802e158 <ipaddr_ntoa>:
  42520. */
  42521. char *
  42522. ipaddr_ntoa(const ip_addr_t *addr)
  42523. {
  42524. static char str[16];
  42525. return ipaddr_ntoa_r(addr, str, 16);
  42526. 802e158: 4901 ldr r1, [pc, #4] ; (802e160 <ipaddr_ntoa+0x8>)
  42527. 802e15a: 2210 movs r2, #16
  42528. 802e15c: f7ff bfb3 b.w 802e0c6 <ipaddr_ntoa_r>
  42529. 802e160: 2000e0d8 .word 0x2000e0d8
  42530. 0802e164 <ip_route>:
  42531. return netif;
  42532. }
  42533. #endif
  42534. /* iterate through netifs */
  42535. for (netif = netif_list; netif != NULL; netif = netif->next) {
  42536. 802e164: 4b0f ldr r3, [pc, #60] ; (802e1a4 <ip_route+0x40>)
  42537. * @param dest the destination IP address for which to find the route
  42538. * @return the netif on which to send to reach dest
  42539. */
  42540. struct netif *
  42541. ip_route(ip_addr_t *dest)
  42542. {
  42543. 802e166: b510 push {r4, lr}
  42544. return netif;
  42545. }
  42546. #endif
  42547. /* iterate through netifs */
  42548. for (netif = netif_list; netif != NULL; netif = netif->next) {
  42549. 802e168: 681c ldr r4, [r3, #0]
  42550. 802e16a: e00a b.n 802e182 <ip_route+0x1e>
  42551. /* network mask matches? */
  42552. if (netif_is_up(netif)) {
  42553. 802e16c: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  42554. 802e170: 07d9 lsls r1, r3, #31
  42555. 802e172: d505 bpl.n 802e180 <ip_route+0x1c>
  42556. if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) {
  42557. 802e174: 6803 ldr r3, [r0, #0]
  42558. 802e176: 6862 ldr r2, [r4, #4]
  42559. 802e178: 405a eors r2, r3
  42560. 802e17a: 68a3 ldr r3, [r4, #8]
  42561. 802e17c: 421a tst r2, r3
  42562. 802e17e: d00e beq.n 802e19e <ip_route+0x3a>
  42563. return netif;
  42564. }
  42565. #endif
  42566. /* iterate through netifs */
  42567. for (netif = netif_list; netif != NULL; netif = netif->next) {
  42568. 802e180: 6824 ldr r4, [r4, #0]
  42569. 802e182: 2c00 cmp r4, #0
  42570. 802e184: d1f2 bne.n 802e16c <ip_route+0x8>
  42571. /* return netif on which to forward IP packet */
  42572. return netif;
  42573. }
  42574. }
  42575. }
  42576. if ((netif_default == NULL) || (!netif_is_up(netif_default))) {
  42577. 802e186: 4b08 ldr r3, [pc, #32] ; (802e1a8 <ip_route+0x44>)
  42578. 802e188: 681b ldr r3, [r3, #0]
  42579. 802e18a: b12b cbz r3, 802e198 <ip_route+0x34>
  42580. 802e18c: f893 202d ldrb.w r2, [r3, #45] ; 0x2d
  42581. 802e190: 07d2 lsls r2, r2, #31
  42582. 802e192: bf48 it mi
  42583. 802e194: 461c movmi r4, r3
  42584. 802e196: d402 bmi.n 802e19e <ip_route+0x3a>
  42585. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_route: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
  42586. ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
  42587. IP_STATS_INC(ip.rterr);
  42588. snmp_inc_ipoutnoroutes();
  42589. 802e198: f001 fcbc bl 802fb14 <snmp_inc_ipoutnoroutes>
  42590. return NULL;
  42591. 802e19c: e7ff b.n 802e19e <ip_route+0x3a>
  42592. }
  42593. /* no matching netif found, use default netif */
  42594. return netif_default;
  42595. }
  42596. 802e19e: 4620 mov r0, r4
  42597. 802e1a0: bd10 pop {r4, pc}
  42598. 802e1a2: bf00 nop
  42599. 802e1a4: 20010d6c .word 0x20010d6c
  42600. 802e1a8: 20010d70 .word 0x20010d70
  42601. 0802e1ac <ip_input>:
  42602. * @return ERR_OK if the packet was processed (could return ERR_* if it wasn't
  42603. * processed, but currently always returns ERR_OK)
  42604. */
  42605. err_t
  42606. ip_input(struct pbuf *p, struct netif *inp)
  42607. {
  42608. 802e1ac: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  42609. 802e1b0: 4604 mov r4, r0
  42610. 802e1b2: 460f mov r7, r1
  42611. #if IP_ACCEPT_LINK_LAYER_ADDRESSING
  42612. int check_ip_src=1;
  42613. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  42614. IP_STATS_INC(ip.recv);
  42615. snmp_inc_ipinreceives();
  42616. 802e1b4: f001 fc6e bl 802fa94 <snmp_inc_ipinreceives>
  42617. /* identify the IP header */
  42618. iphdr = (struct ip_hdr *)p->payload;
  42619. 802e1b8: 6866 ldr r6, [r4, #4]
  42620. if (IPH_V(iphdr) != 4) {
  42621. 802e1ba: f896 8000 ldrb.w r8, [r6]
  42622. 802e1be: ea4f 1318 mov.w r3, r8, lsr #4
  42623. 802e1c2: 2b04 cmp r3, #4
  42624. 802e1c4: d005 beq.n 802e1d2 <ip_input+0x26>
  42625. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_WARNING, ("IP packet dropped due to bad version number %"U16_F"\n", IPH_V(iphdr)));
  42626. ip_debug_print(p);
  42627. pbuf_free(p);
  42628. 802e1c6: 4620 mov r0, r4
  42629. 802e1c8: f7fd f842 bl 802b250 <pbuf_free>
  42630. IP_STATS_INC(ip.err);
  42631. IP_STATS_INC(ip.drop);
  42632. snmp_inc_ipinhdrerrors();
  42633. 802e1cc: f001 fc6a bl 802faa4 <snmp_inc_ipinhdrerrors>
  42634. return ERR_OK;
  42635. 802e1d0: e0be b.n 802e350 <ip_input+0x1a4>
  42636. /* obtain IP header length in number of 32-bit words */
  42637. iphdr_hlen = IPH_HL(iphdr);
  42638. /* calculate IP header length in bytes */
  42639. iphdr_hlen *= 4;
  42640. /* obtain ip length in bytes */
  42641. iphdr_len = ntohs(IPH_LEN(iphdr));
  42642. 802e1d2: 8870 ldrh r0, [r6, #2]
  42643. 802e1d4: f7fb ff03 bl 8029fde <lwip_ntohs>
  42644. return ERR_OK;
  42645. }
  42646. #endif
  42647. /* obtain IP header length in number of 32-bit words */
  42648. iphdr_hlen = IPH_HL(iphdr);
  42649. 802e1d8: f008 080f and.w r8, r8, #15
  42650. iphdr_hlen *= 4;
  42651. /* obtain ip length in bytes */
  42652. iphdr_len = ntohs(IPH_LEN(iphdr));
  42653. /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */
  42654. if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) {
  42655. 802e1dc: 8963 ldrh r3, [r4, #10]
  42656. #endif
  42657. /* obtain IP header length in number of 32-bit words */
  42658. iphdr_hlen = IPH_HL(iphdr);
  42659. /* calculate IP header length in bytes */
  42660. iphdr_hlen *= 4;
  42661. 802e1de: ea4f 0888 mov.w r8, r8, lsl #2
  42662. /* obtain ip length in bytes */
  42663. iphdr_len = ntohs(IPH_LEN(iphdr));
  42664. /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */
  42665. if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) {
  42666. 802e1e2: 4543 cmp r3, r8
  42667. /* obtain IP header length in number of 32-bit words */
  42668. iphdr_hlen = IPH_HL(iphdr);
  42669. /* calculate IP header length in bytes */
  42670. iphdr_hlen *= 4;
  42671. /* obtain ip length in bytes */
  42672. iphdr_len = ntohs(IPH_LEN(iphdr));
  42673. 802e1e4: 4601 mov r1, r0
  42674. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
  42675. ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n",
  42676. iphdr_len, p->tot_len));
  42677. }
  42678. /* free (drop) packet pbufs */
  42679. pbuf_free(p);
  42680. 802e1e6: 4620 mov r0, r4
  42681. iphdr_hlen *= 4;
  42682. /* obtain ip length in bytes */
  42683. iphdr_len = ntohs(IPH_LEN(iphdr));
  42684. /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */
  42685. if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) {
  42686. 802e1e8: d302 bcc.n 802e1f0 <ip_input+0x44>
  42687. 802e1ea: 8923 ldrh r3, [r4, #8]
  42688. 802e1ec: 428b cmp r3, r1
  42689. 802e1ee: d202 bcs.n 802e1f6 <ip_input+0x4a>
  42690. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
  42691. ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n",
  42692. iphdr_len, p->tot_len));
  42693. }
  42694. /* free (drop) packet pbufs */
  42695. pbuf_free(p);
  42696. 802e1f0: f7fd f82e bl 802b250 <pbuf_free>
  42697. 802e1f4: e045 b.n 802e282 <ip_input+0xd6>
  42698. }
  42699. #endif
  42700. /* Trim pbuf. This should have been done at the netif layer,
  42701. * but we'll do it anyway just to be sure that its done. */
  42702. pbuf_realloc(p, iphdr_len);
  42703. 802e1f6: f7fd f852 bl 802b29e <pbuf_realloc>
  42704. /* copy IP addresses to aligned ip_addr_t */
  42705. ip_addr_copy(current_iphdr_dest, iphdr->dest);
  42706. 802e1fa: 6932 ldr r2, [r6, #16]
  42707. 802e1fc: 4b56 ldr r3, [pc, #344] ; (802e358 <ip_input+0x1ac>)
  42708. }
  42709. #endif /* LWIP_AUTOIP */
  42710. }
  42711. if (first) {
  42712. first = 0;
  42713. netif = netif_list;
  42714. 802e1fe: f8df b168 ldr.w fp, [pc, #360] ; 802e368 <ip_input+0x1bc>
  42715. /* Trim pbuf. This should have been done at the netif layer,
  42716. * but we'll do it anyway just to be sure that its done. */
  42717. pbuf_realloc(p, iphdr_len);
  42718. /* copy IP addresses to aligned ip_addr_t */
  42719. ip_addr_copy(current_iphdr_dest, iphdr->dest);
  42720. 802e202: 601a str r2, [r3, #0]
  42721. ip_addr_copy(current_iphdr_src, iphdr->src);
  42722. 802e204: 68f1 ldr r1, [r6, #12]
  42723. 802e206: 4a55 ldr r2, [pc, #340] ; (802e35c <ip_input+0x1b0>)
  42724. 802e208: 463d mov r5, r7
  42725. 802e20a: 6011 str r1, [r2, #0]
  42726. #endif /* LWIP_IGMP */
  42727. {
  42728. /* start trying with inp. if that's not acceptable, start walking the
  42729. list of configured netifs.
  42730. 'first' is used as a boolean to mark whether we started walking the list */
  42731. int first = 1;
  42732. 802e20c: f04f 0901 mov.w r9, #1
  42733. ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask)));
  42734. /* interface is up and configured? */
  42735. if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
  42736. /* unicast to this interface address? */
  42737. if (ip_addr_cmp(&current_iphdr_dest, &(netif->ip_addr)) ||
  42738. 802e210: 469a mov sl, r3
  42739. ip4_addr_get_u32(&iphdr->dest) & ip4_addr_get_u32(&netif->netmask),
  42740. ip4_addr_get_u32(&netif->ip_addr) & ip4_addr_get_u32(&netif->netmask),
  42741. ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask)));
  42742. /* interface is up and configured? */
  42743. if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
  42744. 802e212: f895 302d ldrb.w r3, [r5, #45] ; 0x2d
  42745. 802e216: 07d8 lsls r0, r3, #31
  42746. 802e218: d403 bmi.n 802e222 <ip_input+0x76>
  42747. /* break out of for loop */
  42748. break;
  42749. }
  42750. #endif /* LWIP_AUTOIP */
  42751. }
  42752. if (first) {
  42753. 802e21a: f1b9 0f00 cmp.w r9, #0
  42754. 802e21e: d10e bne.n 802e23e <ip_input+0x92>
  42755. 802e220: e010 b.n 802e244 <ip_input+0x98>
  42756. ip4_addr_get_u32(&iphdr->dest) & ip4_addr_get_u32(&netif->netmask),
  42757. ip4_addr_get_u32(&netif->ip_addr) & ip4_addr_get_u32(&netif->netmask),
  42758. ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask)));
  42759. /* interface is up and configured? */
  42760. if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
  42761. 802e222: 686b ldr r3, [r5, #4]
  42762. 802e224: 2b00 cmp r3, #0
  42763. 802e226: d0f8 beq.n 802e21a <ip_input+0x6e>
  42764. /* unicast to this interface address? */
  42765. if (ip_addr_cmp(&current_iphdr_dest, &(netif->ip_addr)) ||
  42766. 802e228: f8da 0000 ldr.w r0, [sl]
  42767. 802e22c: 4298 cmp r0, r3
  42768. 802e22e: f000 8088 beq.w 802e342 <ip_input+0x196>
  42769. /* or broadcast on this interface network address? */
  42770. ip_addr_isbroadcast(&current_iphdr_dest, netif)) {
  42771. 802e232: 4629 mov r1, r5
  42772. 802e234: f7ff fea6 bl 802df84 <ip4_addr_isbroadcast>
  42773. ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask)));
  42774. /* interface is up and configured? */
  42775. if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
  42776. /* unicast to this interface address? */
  42777. if (ip_addr_cmp(&current_iphdr_dest, &(netif->ip_addr)) ||
  42778. 802e238: 2800 cmp r0, #0
  42779. 802e23a: d0ee beq.n 802e21a <ip_input+0x6e>
  42780. 802e23c: e081 b.n 802e342 <ip_input+0x196>
  42781. }
  42782. #endif /* LWIP_AUTOIP */
  42783. }
  42784. if (first) {
  42785. first = 0;
  42786. netif = netif_list;
  42787. 802e23e: f8db 5000 ldr.w r5, [fp]
  42788. 802e242: e000 b.n 802e246 <ip_input+0x9a>
  42789. } else {
  42790. netif = netif->next;
  42791. 802e244: 682d ldr r5, [r5, #0]
  42792. }
  42793. if (netif == inp) {
  42794. 802e246: 42bd cmp r5, r7
  42795. netif = netif->next;
  42796. 802e248: bf08 it eq
  42797. 802e24a: 682d ldreq r5, [r5, #0]
  42798. 802e24c: f04f 0900 mov.w r9, #0
  42799. }
  42800. } while(netif != NULL);
  42801. 802e250: 2d00 cmp r5, #0
  42802. 802e252: d1de bne.n 802e212 <ip_input+0x66>
  42803. 802e254: e072 b.n 802e33c <ip_input+0x190>
  42804. /* remote port is DHCP server? */
  42805. if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
  42806. struct udp_hdr *udphdr = (struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen);
  42807. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: UDP packet to DHCP client port %"U16_F"\n",
  42808. ntohs(udphdr->dest)));
  42809. if (IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(udphdr->dest)) {
  42810. 802e256: eb06 0308 add.w r3, r6, r8
  42811. 802e25a: 885b ldrh r3, [r3, #2]
  42812. 802e25c: f5b3 4f88 cmp.w r3, #17408 ; 0x4400
  42813. 802e260: d16f bne.n 802e342 <ip_input+0x196>
  42814. 802e262: e011 b.n 802e288 <ip_input+0xdc>
  42815. /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */
  42816. #if IP_ACCEPT_LINK_LAYER_ADDRESSING
  42817. /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */
  42818. if (check_ip_src && !ip_addr_isany(&current_iphdr_src))
  42819. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  42820. { if ((ip_addr_isbroadcast(&current_iphdr_src, inp)) ||
  42821. 802e264: 4639 mov r1, r7
  42822. 802e266: f7ff fe8d bl 802df84 <ip4_addr_isbroadcast>
  42823. 802e26a: b928 cbnz r0, 802e278 <ip_input+0xcc>
  42824. (ip_addr_ismulticast(&current_iphdr_src))) {
  42825. 802e26c: f8d8 3000 ldr.w r3, [r8]
  42826. 802e270: f003 03f0 and.w r3, r3, #240 ; 0xf0
  42827. /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */
  42828. #if IP_ACCEPT_LINK_LAYER_ADDRESSING
  42829. /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */
  42830. if (check_ip_src && !ip_addr_isany(&current_iphdr_src))
  42831. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  42832. { if ((ip_addr_isbroadcast(&current_iphdr_src, inp)) ||
  42833. 802e274: 2be0 cmp r3, #224 ; 0xe0
  42834. 802e276: d108 bne.n 802e28a <ip_input+0xde>
  42835. (ip_addr_ismulticast(&current_iphdr_src))) {
  42836. /* packet source is not valid */
  42837. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("ip_input: packet source is not valid.\n"));
  42838. /* free (drop) packet pbufs */
  42839. pbuf_free(p);
  42840. 802e278: 4620 mov r0, r4
  42841. 802e27a: f7fc ffe9 bl 802b250 <pbuf_free>
  42842. IP_STATS_INC(ip.drop);
  42843. snmp_inc_ipinaddrerrors();
  42844. 802e27e: f001 fc19 bl 802fab4 <snmp_inc_ipinaddrerrors>
  42845. snmp_inc_ipindiscards();
  42846. 802e282: f001 fc27 bl 802fad4 <snmp_inc_ipindiscards>
  42847. return ERR_OK;
  42848. 802e286: e063 b.n 802e350 <ip_input+0x1a4>
  42849. /* remote port is DHCP server? */
  42850. if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
  42851. struct udp_hdr *udphdr = (struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen);
  42852. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: UDP packet to DHCP client port %"U16_F"\n",
  42853. ntohs(udphdr->dest)));
  42854. if (IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(udphdr->dest)) {
  42855. 802e288: 463d mov r5, r7
  42856. return ERR_OK;
  42857. }
  42858. }
  42859. /* packet not for us? */
  42860. if (netif == NULL) {
  42861. 802e28a: b93d cbnz r5, 802e29c <ip_input+0xf0>
  42862. /* try to forward IP packet on (other) interfaces */
  42863. ip_forward(p, iphdr, inp);
  42864. } else
  42865. #endif /* IP_FORWARD */
  42866. {
  42867. snmp_inc_ipinaddrerrors();
  42868. 802e28c: f001 fc12 bl 802fab4 <snmp_inc_ipinaddrerrors>
  42869. snmp_inc_ipindiscards();
  42870. 802e290: f001 fc20 bl 802fad4 <snmp_inc_ipindiscards>
  42871. }
  42872. pbuf_free(p);
  42873. 802e294: 4620 mov r0, r4
  42874. 802e296: f7fc ffdb bl 802b250 <pbuf_free>
  42875. return ERR_OK;
  42876. 802e29a: e059 b.n 802e350 <ip_input+0x1a4>
  42877. }
  42878. /* packet consists of multiple fragments? */
  42879. if ((IPH_OFFSET(iphdr) & PP_HTONS(IP_OFFMASK | IP_MF)) != 0) {
  42880. 802e29c: 88f3 ldrh r3, [r6, #6]
  42881. 802e29e: f023 03c0 bic.w r3, r3, #192 ; 0xc0
  42882. 802e2a2: b29b uxth r3, r3
  42883. 802e2a4: b12b cbz r3, 802e2b2 <ip_input+0x106>
  42884. if (p == NULL) {
  42885. return ERR_OK;
  42886. }
  42887. iphdr = (struct ip_hdr *)p->payload;
  42888. #else /* IP_REASSEMBLY == 0, no packet fragment reassembly code present */
  42889. pbuf_free(p);
  42890. 802e2a6: 4620 mov r0, r4
  42891. 802e2a8: f7fc ffd2 bl 802b250 <pbuf_free>
  42892. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since it was fragmented (0x%"X16_F") (while IP_REASSEMBLY == 0).\n",
  42893. ntohs(IPH_OFFSET(iphdr))));
  42894. IP_STATS_INC(ip.opterr);
  42895. IP_STATS_INC(ip.drop);
  42896. /* unsupported protocol feature */
  42897. snmp_inc_ipinunknownprotos();
  42898. 802e2ac: f001 fc0a bl 802fac4 <snmp_inc_ipinunknownprotos>
  42899. return ERR_OK;
  42900. 802e2b0: e04e b.n 802e350 <ip_input+0x1a4>
  42901. /* send to upper layers */
  42902. LWIP_DEBUGF(IP_DEBUG, ("ip_input: \n"));
  42903. ip_debug_print(p);
  42904. LWIP_DEBUGF(IP_DEBUG, ("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len));
  42905. current_netif = inp;
  42906. 802e2b2: 4b2b ldr r3, [pc, #172] ; (802e360 <ip_input+0x1b4>)
  42907. 802e2b4: 601f str r7, [r3, #0]
  42908. current_header = iphdr;
  42909. 802e2b6: 4b2b ldr r3, [pc, #172] ; (802e364 <ip_input+0x1b8>)
  42910. #if LWIP_RAW
  42911. /* raw input did not eat the packet? */
  42912. if (raw_input(p, inp) == 0)
  42913. 802e2b8: 4620 mov r0, r4
  42914. 802e2ba: 4639 mov r1, r7
  42915. LWIP_DEBUGF(IP_DEBUG, ("ip_input: \n"));
  42916. ip_debug_print(p);
  42917. LWIP_DEBUGF(IP_DEBUG, ("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len));
  42918. current_netif = inp;
  42919. current_header = iphdr;
  42920. 802e2bc: 601e str r6, [r3, #0]
  42921. #if LWIP_RAW
  42922. /* raw input did not eat the packet? */
  42923. if (raw_input(p, inp) == 0)
  42924. 802e2be: f7fd f947 bl 802b550 <raw_input>
  42925. 802e2c2: bb88 cbnz r0, 802e328 <ip_input+0x17c>
  42926. #endif /* LWIP_RAW */
  42927. {
  42928. switch (IPH_PROTO(iphdr)) {
  42929. 802e2c4: 7a73 ldrb r3, [r6, #9]
  42930. 802e2c6: 2b06 cmp r3, #6
  42931. 802e2c8: d00b beq.n 802e2e2 <ip_input+0x136>
  42932. 802e2ca: 2b11 cmp r3, #17
  42933. 802e2cc: d002 beq.n 802e2d4 <ip_input+0x128>
  42934. 802e2ce: 2b01 cmp r3, #1
  42935. 802e2d0: d115 bne.n 802e2fe <ip_input+0x152>
  42936. 802e2d2: e00d b.n 802e2f0 <ip_input+0x144>
  42937. #if LWIP_UDP
  42938. case IP_PROTO_UDP:
  42939. #if LWIP_UDPLITE
  42940. case IP_PROTO_UDPLITE:
  42941. #endif /* LWIP_UDPLITE */
  42942. snmp_inc_ipindelivers();
  42943. 802e2d4: f001 fc06 bl 802fae4 <snmp_inc_ipindelivers>
  42944. udp_input(p, inp);
  42945. 802e2d8: 4620 mov r0, r4
  42946. 802e2da: 4639 mov r1, r7
  42947. 802e2dc: f7ff fb44 bl 802d968 <udp_input>
  42948. break;
  42949. 802e2e0: e022 b.n 802e328 <ip_input+0x17c>
  42950. #endif /* LWIP_UDP */
  42951. #if LWIP_TCP
  42952. case IP_PROTO_TCP:
  42953. snmp_inc_ipindelivers();
  42954. 802e2e2: f001 fbff bl 802fae4 <snmp_inc_ipindelivers>
  42955. tcp_input(p, inp);
  42956. 802e2e6: 4620 mov r0, r4
  42957. 802e2e8: 4639 mov r1, r7
  42958. 802e2ea: f7fe f8e7 bl 802c4bc <tcp_input>
  42959. break;
  42960. 802e2ee: e01b b.n 802e328 <ip_input+0x17c>
  42961. #endif /* LWIP_TCP */
  42962. #if LWIP_ICMP
  42963. case IP_PROTO_ICMP:
  42964. snmp_inc_ipindelivers();
  42965. 802e2f0: f001 fbf8 bl 802fae4 <snmp_inc_ipindelivers>
  42966. icmp_input(p, inp);
  42967. 802e2f4: 4620 mov r0, r4
  42968. 802e2f6: 4639 mov r1, r7
  42969. 802e2f8: f7ff fd20 bl 802dd3c <icmp_input>
  42970. break;
  42971. 802e2fc: e014 b.n 802e328 <ip_input+0x17c>
  42972. break;
  42973. #endif /* LWIP_IGMP */
  42974. default:
  42975. #if LWIP_ICMP
  42976. /* send ICMP destination protocol unreachable unless is was a broadcast */
  42977. if (!ip_addr_isbroadcast(&current_iphdr_dest, inp) &&
  42978. 802e2fe: 4d16 ldr r5, [pc, #88] ; (802e358 <ip_input+0x1ac>)
  42979. 802e300: 4639 mov r1, r7
  42980. 802e302: 6828 ldr r0, [r5, #0]
  42981. 802e304: f7ff fe3e bl 802df84 <ip4_addr_isbroadcast>
  42982. 802e308: b948 cbnz r0, 802e31e <ip_input+0x172>
  42983. !ip_addr_ismulticast(&current_iphdr_dest)) {
  42984. 802e30a: 682b ldr r3, [r5, #0]
  42985. 802e30c: f003 03f0 and.w r3, r3, #240 ; 0xf0
  42986. break;
  42987. #endif /* LWIP_IGMP */
  42988. default:
  42989. #if LWIP_ICMP
  42990. /* send ICMP destination protocol unreachable unless is was a broadcast */
  42991. if (!ip_addr_isbroadcast(&current_iphdr_dest, inp) &&
  42992. 802e310: 2be0 cmp r3, #224 ; 0xe0
  42993. 802e312: d004 beq.n 802e31e <ip_input+0x172>
  42994. !ip_addr_ismulticast(&current_iphdr_dest)) {
  42995. p->payload = iphdr;
  42996. 802e314: 6066 str r6, [r4, #4]
  42997. icmp_dest_unreach(p, ICMP_DUR_PROTO);
  42998. 802e316: 4620 mov r0, r4
  42999. 802e318: 2102 movs r1, #2
  43000. 802e31a: f7ff fda5 bl 802de68 <icmp_dest_unreach>
  43001. }
  43002. #endif /* LWIP_ICMP */
  43003. pbuf_free(p);
  43004. 802e31e: 4620 mov r0, r4
  43005. 802e320: f7fc ff96 bl 802b250 <pbuf_free>
  43006. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Unsupported transport protocol %"U16_F"\n", IPH_PROTO(iphdr)));
  43007. IP_STATS_INC(ip.proterr);
  43008. IP_STATS_INC(ip.drop);
  43009. snmp_inc_ipinunknownprotos();
  43010. 802e324: f001 fbce bl 802fac4 <snmp_inc_ipinunknownprotos>
  43011. }
  43012. }
  43013. current_netif = NULL;
  43014. 802e328: 4a0d ldr r2, [pc, #52] ; (802e360 <ip_input+0x1b4>)
  43015. 802e32a: 2300 movs r3, #0
  43016. 802e32c: 6013 str r3, [r2, #0]
  43017. current_header = NULL;
  43018. 802e32e: 4a0d ldr r2, [pc, #52] ; (802e364 <ip_input+0x1b8>)
  43019. 802e330: 6013 str r3, [r2, #0]
  43020. ip_addr_set_any(&current_iphdr_src);
  43021. 802e332: 4a0a ldr r2, [pc, #40] ; (802e35c <ip_input+0x1b0>)
  43022. 802e334: 6013 str r3, [r2, #0]
  43023. ip_addr_set_any(&current_iphdr_dest);
  43024. 802e336: 4a08 ldr r2, [pc, #32] ; (802e358 <ip_input+0x1ac>)
  43025. 802e338: 6013 str r3, [r2, #0]
  43026. return ERR_OK;
  43027. 802e33a: e009 b.n 802e350 <ip_input+0x1a4>
  43028. *
  43029. * #define LWIP_IP_ACCEPT_UDP_PORT(dst_port) ((dst_port) == PP_NTOHS(12345))
  43030. */
  43031. if (netif == NULL) {
  43032. /* remote port is DHCP server? */
  43033. if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
  43034. 802e33c: 7a73 ldrb r3, [r6, #9]
  43035. 802e33e: 2b11 cmp r3, #17
  43036. 802e340: d089 beq.n 802e256 <ip_input+0xaa>
  43037. #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
  43038. /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */
  43039. #if IP_ACCEPT_LINK_LAYER_ADDRESSING
  43040. /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */
  43041. if (check_ip_src && !ip_addr_isany(&current_iphdr_src))
  43042. 802e342: f8df 8018 ldr.w r8, [pc, #24] ; 802e35c <ip_input+0x1b0>
  43043. 802e346: f8d8 0000 ldr.w r0, [r8]
  43044. 802e34a: 2800 cmp r0, #0
  43045. 802e34c: d09d beq.n 802e28a <ip_input+0xde>
  43046. 802e34e: e789 b.n 802e264 <ip_input+0xb8>
  43047. current_header = NULL;
  43048. ip_addr_set_any(&current_iphdr_src);
  43049. ip_addr_set_any(&current_iphdr_dest);
  43050. return ERR_OK;
  43051. }
  43052. 802e350: 2000 movs r0, #0
  43053. 802e352: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  43054. 802e356: bf00 nop
  43055. 802e358: 20010da0 .word 0x20010da0
  43056. 802e35c: 20010d98 .word 0x20010d98
  43057. 802e360: 20010d9c .word 0x20010d9c
  43058. 802e364: 20010da4 .word 0x20010da4
  43059. 802e368: 20010d6c .word 0x20010d6c
  43060. 0802e36c <ip_output_if>:
  43061. */
  43062. err_t
  43063. ip_output_if(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
  43064. u8_t ttl, u8_t tos,
  43065. u8_t proto, struct netif *netif)
  43066. {
  43067. 802e36c: e92d 47f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, r9, sl, lr}
  43068. 802e370: 4615 mov r5, r2
  43069. 802e372: 4606 mov r6, r0
  43070. 802e374: 4689 mov r9, r1
  43071. 802e376: 469a mov sl, r3
  43072. 802e378: 9f0c ldr r7, [sp, #48] ; 0x30
  43073. /* pbufs passed to IP must have a ref-count of 1 as their payload pointer
  43074. gets altered as the packet is passed down the stack */
  43075. LWIP_ASSERT("p->ref == 1", p->ref == 1);
  43076. snmp_inc_ipoutrequests();
  43077. 802e37a: f001 fbbb bl 802faf4 <snmp_inc_ipoutrequests>
  43078. /* Should the IP header be generated or is it already included in p? */
  43079. if (dest != IP_HDRINCL) {
  43080. 802e37e: b3b5 cbz r5, 802e3ee <ip_output_if+0x82>
  43081. }
  43082. #endif /* CHECKSUM_GEN_IP_INLINE */
  43083. }
  43084. #endif /* IP_OPTIONS_SEND */
  43085. /* generate IP header */
  43086. if (pbuf_header(p, IP_HLEN)) {
  43087. 802e380: 4630 mov r0, r6
  43088. 802e382: 2114 movs r1, #20
  43089. 802e384: f7fc ff39 bl 802b1fa <pbuf_header>
  43090. 802e388: 4680 mov r8, r0
  43091. 802e38a: b118 cbz r0, 802e394 <ip_output_if+0x28>
  43092. LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_output: not enough room for IP header in pbuf\n"));
  43093. IP_STATS_INC(ip.err);
  43094. snmp_inc_ipoutdiscards();
  43095. 802e38c: f001 fbba bl 802fb04 <snmp_inc_ipoutdiscards>
  43096. return ERR_BUF;
  43097. 802e390: 20fe movs r0, #254 ; 0xfe
  43098. 802e392: e036 b.n 802e402 <ip_output_if+0x96>
  43099. }
  43100. iphdr = (struct ip_hdr *)p->payload;
  43101. 802e394: 6874 ldr r4, [r6, #4]
  43102. LWIP_ASSERT("check that first pbuf can hold struct ip_hdr",
  43103. (p->len >= sizeof(struct ip_hdr)));
  43104. IPH_TTL_SET(iphdr, ttl);
  43105. IPH_PROTO_SET(iphdr, proto);
  43106. 802e396: f89d 302c ldrb.w r3, [sp, #44] ; 0x2c
  43107. iphdr = (struct ip_hdr *)p->payload;
  43108. LWIP_ASSERT("check that first pbuf can hold struct ip_hdr",
  43109. (p->len >= sizeof(struct ip_hdr)));
  43110. IPH_TTL_SET(iphdr, ttl);
  43111. 802e39a: f884 a008 strb.w sl, [r4, #8]
  43112. IPH_PROTO_SET(iphdr, proto);
  43113. 802e39e: 7263 strb r3, [r4, #9]
  43114. #if CHECKSUM_GEN_IP_INLINE
  43115. chk_sum += LWIP_MAKE_U16(proto, ttl);
  43116. #endif /* CHECKSUM_GEN_IP_INLINE */
  43117. /* dest cannot be NULL here */
  43118. ip_addr_copy(iphdr->dest, *dest);
  43119. 802e3a0: 682b ldr r3, [r5, #0]
  43120. 802e3a2: 6123 str r3, [r4, #16]
  43121. #if CHECKSUM_GEN_IP_INLINE
  43122. chk_sum += ip4_addr_get_u32(&iphdr->dest) & 0xFFFF;
  43123. chk_sum += ip4_addr_get_u32(&iphdr->dest) >> 16;
  43124. #endif /* CHECKSUM_GEN_IP_INLINE */
  43125. IPH_VHL_SET(iphdr, 4, ip_hlen / 4);
  43126. 802e3a4: 2345 movs r3, #69 ; 0x45
  43127. 802e3a6: 7023 strb r3, [r4, #0]
  43128. IPH_TOS_SET(iphdr, tos);
  43129. 802e3a8: f89d 3028 ldrb.w r3, [sp, #40] ; 0x28
  43130. 802e3ac: 7063 strb r3, [r4, #1]
  43131. #if CHECKSUM_GEN_IP_INLINE
  43132. chk_sum += LWIP_MAKE_U16(tos, iphdr->_v_hl);
  43133. #endif /* CHECKSUM_GEN_IP_INLINE */
  43134. IPH_LEN_SET(iphdr, htons(p->tot_len));
  43135. 802e3ae: 8930 ldrh r0, [r6, #8]
  43136. 802e3b0: f7fb fe10 bl 8029fd4 <lwip_htons>
  43137. #if CHECKSUM_GEN_IP_INLINE
  43138. chk_sum += iphdr->_len;
  43139. #endif /* CHECKSUM_GEN_IP_INLINE */
  43140. IPH_OFFSET_SET(iphdr, 0);
  43141. 802e3b4: f884 8006 strb.w r8, [r4, #6]
  43142. 802e3b8: f884 8007 strb.w r8, [r4, #7]
  43143. IPH_ID_SET(iphdr, htons(ip_id));
  43144. 802e3bc: f8df 8048 ldr.w r8, [pc, #72] ; 802e408 <ip_output_if+0x9c>
  43145. IPH_VHL_SET(iphdr, 4, ip_hlen / 4);
  43146. IPH_TOS_SET(iphdr, tos);
  43147. #if CHECKSUM_GEN_IP_INLINE
  43148. chk_sum += LWIP_MAKE_U16(tos, iphdr->_v_hl);
  43149. #endif /* CHECKSUM_GEN_IP_INLINE */
  43150. IPH_LEN_SET(iphdr, htons(p->tot_len));
  43151. 802e3c0: 8060 strh r0, [r4, #2]
  43152. #if CHECKSUM_GEN_IP_INLINE
  43153. chk_sum += iphdr->_len;
  43154. #endif /* CHECKSUM_GEN_IP_INLINE */
  43155. IPH_OFFSET_SET(iphdr, 0);
  43156. IPH_ID_SET(iphdr, htons(ip_id));
  43157. 802e3c2: f8b8 0000 ldrh.w r0, [r8]
  43158. 802e3c6: f7fb fe05 bl 8029fd4 <lwip_htons>
  43159. 802e3ca: 80a0 strh r0, [r4, #4]
  43160. #if CHECKSUM_GEN_IP_INLINE
  43161. chk_sum += iphdr->_id;
  43162. #endif /* CHECKSUM_GEN_IP_INLINE */
  43163. ++ip_id;
  43164. 802e3cc: f8b8 3000 ldrh.w r3, [r8]
  43165. 802e3d0: 3301 adds r3, #1
  43166. 802e3d2: f8a8 3000 strh.w r3, [r8]
  43167. if (ip_addr_isany(src)) {
  43168. 802e3d6: f1b9 0f00 cmp.w r9, #0
  43169. 802e3da: d002 beq.n 802e3e2 <ip_output_if+0x76>
  43170. 802e3dc: f8d9 3000 ldr.w r3, [r9]
  43171. 802e3e0: b903 cbnz r3, 802e3e4 <ip_output_if+0x78>
  43172. ip_addr_copy(iphdr->src, netif->ip_addr);
  43173. 802e3e2: 687b ldr r3, [r7, #4]
  43174. } else {
  43175. /* src cannot be NULL here */
  43176. ip_addr_copy(iphdr->src, *src);
  43177. 802e3e4: 60e3 str r3, [r4, #12]
  43178. chk_sum = (chk_sum >> 16) + (chk_sum & 0xFFFF);
  43179. chk_sum = (chk_sum >> 16) + chk_sum;
  43180. chk_sum = ~chk_sum;
  43181. iphdr->_chksum = chk_sum; /* network order */
  43182. #else /* CHECKSUM_GEN_IP_INLINE */
  43183. IPH_CHKSUM_SET(iphdr, 0);
  43184. 802e3e6: 2300 movs r3, #0
  43185. 802e3e8: 72a3 strb r3, [r4, #10]
  43186. 802e3ea: 72e3 strb r3, [r4, #11]
  43187. 802e3ec: e004 b.n 802e3f8 <ip_output_if+0x8c>
  43188. #endif
  43189. #endif /* CHECKSUM_GEN_IP_INLINE */
  43190. } else {
  43191. /* IP header already included in p */
  43192. iphdr = (struct ip_hdr *)p->payload;
  43193. ip_addr_copy(dest_addr, iphdr->dest);
  43194. 802e3ee: 6873 ldr r3, [r6, #4]
  43195. 802e3f0: ad02 add r5, sp, #8
  43196. 802e3f2: 691b ldr r3, [r3, #16]
  43197. 802e3f4: f845 3d04 str.w r3, [r5, #-4]!
  43198. return ip_frag(p, netif, dest);
  43199. }
  43200. #endif /* IP_FRAG */
  43201. LWIP_DEBUGF(IP_DEBUG, ("netif->output()"));
  43202. return netif->output(netif, p, dest);
  43203. 802e3f8: 697b ldr r3, [r7, #20]
  43204. 802e3fa: 4638 mov r0, r7
  43205. 802e3fc: 4631 mov r1, r6
  43206. 802e3fe: 462a mov r2, r5
  43207. 802e400: 4798 blx r3
  43208. }
  43209. 802e402: b240 sxtb r0, r0
  43210. 802e404: e8bd 87fc ldmia.w sp!, {r2, r3, r4, r5, r6, r7, r8, r9, sl, pc}
  43211. 802e408: 2000e0e8 .word 0x2000e0e8
  43212. 0802e40c <ip_output>:
  43213. * see ip_output_if() for more return values
  43214. */
  43215. err_t
  43216. ip_output(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
  43217. u8_t ttl, u8_t tos, u8_t proto)
  43218. {
  43219. 802e40c: b5f0 push {r4, r5, r6, r7, lr}
  43220. 802e40e: 4605 mov r5, r0
  43221. 802e410: b085 sub sp, #20
  43222. /* pbufs passed to IP must have a ref-count of 1 as their payload pointer
  43223. gets altered as the packet is passed down the stack */
  43224. LWIP_ASSERT("p->ref == 1", p->ref == 1);
  43225. if ((netif = ip_route(dest)) == NULL) {
  43226. 802e412: 4610 mov r0, r2
  43227. * see ip_output_if() for more return values
  43228. */
  43229. err_t
  43230. ip_output(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
  43231. u8_t ttl, u8_t tos, u8_t proto)
  43232. {
  43233. 802e414: 460f mov r7, r1
  43234. 802e416: 4614 mov r4, r2
  43235. 802e418: 461e mov r6, r3
  43236. /* pbufs passed to IP must have a ref-count of 1 as their payload pointer
  43237. gets altered as the packet is passed down the stack */
  43238. LWIP_ASSERT("p->ref == 1", p->ref == 1);
  43239. if ((netif = ip_route(dest)) == NULL) {
  43240. 802e41a: f7ff fea3 bl 802e164 <ip_route>
  43241. 802e41e: b168 cbz r0, 802e43c <ip_output+0x30>
  43242. ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
  43243. IP_STATS_INC(ip.rterr);
  43244. return ERR_RTE;
  43245. }
  43246. return ip_output_if(p, src, dest, ttl, tos, proto, netif);
  43247. 802e420: f89d 3028 ldrb.w r3, [sp, #40] ; 0x28
  43248. 802e424: 9002 str r0, [sp, #8]
  43249. 802e426: 9300 str r3, [sp, #0]
  43250. 802e428: f89d 302c ldrb.w r3, [sp, #44] ; 0x2c
  43251. 802e42c: 4628 mov r0, r5
  43252. 802e42e: 9301 str r3, [sp, #4]
  43253. 802e430: 4639 mov r1, r7
  43254. 802e432: 4622 mov r2, r4
  43255. 802e434: 4633 mov r3, r6
  43256. 802e436: f7ff ff99 bl 802e36c <ip_output_if>
  43257. 802e43a: e000 b.n 802e43e <ip_output+0x32>
  43258. if ((netif = ip_route(dest)) == NULL) {
  43259. LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
  43260. ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));
  43261. IP_STATS_INC(ip.rterr);
  43262. return ERR_RTE;
  43263. 802e43c: 20fc movs r0, #252 ; 0xfc
  43264. }
  43265. return ip_output_if(p, src, dest, ttl, tos, proto, netif);
  43266. }
  43267. 802e43e: b240 sxtb r0, r0
  43268. 802e440: b005 add sp, #20
  43269. 802e442: bdf0 pop {r4, r5, r6, r7, pc}
  43270. 0802e444 <snmp_asn1_dec_type>:
  43271. * @param type return ASN1 type
  43272. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  43273. */
  43274. err_t
  43275. snmp_asn1_dec_type(struct pbuf *p, u16_t ofs, u8_t *type)
  43276. {
  43277. 802e444: b510 push {r4, lr}
  43278. u16_t plen, base;
  43279. u8_t *msg_ptr;
  43280. plen = 0;
  43281. 802e446: 2300 movs r3, #0
  43282. while (p != NULL)
  43283. 802e448: e00c b.n 802e464 <snmp_asn1_dec_type+0x20>
  43284. {
  43285. base = plen;
  43286. plen += p->len;
  43287. 802e44a: 8944 ldrh r4, [r0, #10]
  43288. 802e44c: 191c adds r4, r3, r4
  43289. 802e44e: b2a4 uxth r4, r4
  43290. if (ofs < plen)
  43291. 802e450: 42a1 cmp r1, r4
  43292. 802e452: d205 bcs.n 802e460 <snmp_asn1_dec_type+0x1c>
  43293. {
  43294. msg_ptr = (u8_t*)p->payload;
  43295. 802e454: 6840 ldr r0, [r0, #4]
  43296. msg_ptr += ofs - base;
  43297. 802e456: 1acb subs r3, r1, r3
  43298. *type = *msg_ptr;
  43299. 802e458: 5cc3 ldrb r3, [r0, r3]
  43300. return ERR_OK;
  43301. 802e45a: 2000 movs r0, #0
  43302. plen += p->len;
  43303. if (ofs < plen)
  43304. {
  43305. msg_ptr = (u8_t*)p->payload;
  43306. msg_ptr += ofs - base;
  43307. *type = *msg_ptr;
  43308. 802e45c: 7013 strb r3, [r2, #0]
  43309. return ERR_OK;
  43310. 802e45e: e004 b.n 802e46a <snmp_asn1_dec_type+0x26>
  43311. }
  43312. p = p->next;
  43313. 802e460: 6800 ldr r0, [r0, #0]
  43314. plen = 0;
  43315. while (p != NULL)
  43316. {
  43317. base = plen;
  43318. plen += p->len;
  43319. 802e462: 4623 mov r3, r4
  43320. {
  43321. u16_t plen, base;
  43322. u8_t *msg_ptr;
  43323. plen = 0;
  43324. while (p != NULL)
  43325. 802e464: 2800 cmp r0, #0
  43326. 802e466: d1f0 bne.n 802e44a <snmp_asn1_dec_type+0x6>
  43327. return ERR_OK;
  43328. }
  43329. p = p->next;
  43330. }
  43331. /* p == NULL, ofs >= plen */
  43332. return ERR_ARG;
  43333. 802e468: 20f2 movs r0, #242 ; 0xf2
  43334. }
  43335. 802e46a: b240 sxtb r0, r0
  43336. 802e46c: bd10 pop {r4, pc}
  43337. 0802e46e <snmp_asn1_dec_length>:
  43338. * @param length return host order length, upto 64k
  43339. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  43340. */
  43341. err_t
  43342. snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length)
  43343. {
  43344. 802e46e: b5f0 push {r4, r5, r6, r7, lr}
  43345. u16_t plen, base;
  43346. u8_t *msg_ptr;
  43347. plen = 0;
  43348. 802e470: 2500 movs r5, #0
  43349. while (p != NULL)
  43350. 802e472: e079 b.n 802e568 <snmp_asn1_dec_length+0xfa>
  43351. {
  43352. base = plen;
  43353. plen += p->len;
  43354. 802e474: 8944 ldrh r4, [r0, #10]
  43355. 802e476: 192c adds r4, r5, r4
  43356. 802e478: b2a4 uxth r4, r4
  43357. if (ofs < plen)
  43358. 802e47a: 42a1 cmp r1, r4
  43359. 802e47c: d272 bcs.n 802e564 <snmp_asn1_dec_length+0xf6>
  43360. {
  43361. msg_ptr = (u8_t*)p->payload;
  43362. 802e47e: f8d0 c004 ldr.w ip, [r0, #4]
  43363. msg_ptr += ofs - base;
  43364. 802e482: 1b4f subs r7, r1, r5
  43365. 802e484: eb0c 0507 add.w r5, ip, r7
  43366. if (*msg_ptr < 0x80)
  43367. 802e488: f81c 6007 ldrb.w r6, [ip, r7]
  43368. 802e48c: f016 0f80 tst.w r6, #128 ; 0x80
  43369. 802e490: d105 bne.n 802e49e <snmp_asn1_dec_length+0x30>
  43370. {
  43371. /* primitive definite length format */
  43372. *octets_used = 1;
  43373. 802e492: 2101 movs r1, #1
  43374. 802e494: 7011 strb r1, [r2, #0]
  43375. *length = *msg_ptr;
  43376. 802e496: f81c 2007 ldrb.w r2, [ip, r7]
  43377. 802e49a: 801a strh r2, [r3, #0]
  43378. 802e49c: e05a b.n 802e554 <snmp_asn1_dec_length+0xe6>
  43379. return ERR_OK;
  43380. }
  43381. else if (*msg_ptr == 0x80)
  43382. 802e49e: 2e80 cmp r6, #128 ; 0x80
  43383. 802e4a0: d12a bne.n 802e4f8 <snmp_asn1_dec_length+0x8a>
  43384. {
  43385. /* constructed indefinite length format, termination with two zero octets */
  43386. u8_t zeros;
  43387. u8_t i;
  43388. *length = 0;
  43389. 802e4a2: 2600 movs r6, #0
  43390. 802e4a4: 801e strh r6, [r3, #0]
  43391. 802e4a6: e022 b.n 802e4ee <snmp_asn1_dec_length+0x80>
  43392. {
  43393. i = 2;
  43394. while (i > 0)
  43395. {
  43396. i--;
  43397. (*length) += 1;
  43398. 802e4a8: f8b3 c000 ldrh.w ip, [r3]
  43399. ofs += 1;
  43400. 802e4ac: 3101 adds r1, #1
  43401. 802e4ae: b289 uxth r1, r1
  43402. {
  43403. i = 2;
  43404. while (i > 0)
  43405. {
  43406. i--;
  43407. (*length) += 1;
  43408. 802e4b0: f10c 0c01 add.w ip, ip, #1
  43409. ofs += 1;
  43410. if (ofs >= plen)
  43411. 802e4b4: 42a1 cmp r1, r4
  43412. {
  43413. i = 2;
  43414. while (i > 0)
  43415. {
  43416. i--;
  43417. (*length) += 1;
  43418. 802e4b6: f8a3 c000 strh.w ip, [r3]
  43419. ofs += 1;
  43420. if (ofs >= plen)
  43421. 802e4ba: d308 bcc.n 802e4ce <snmp_asn1_dec_length+0x60>
  43422. {
  43423. /* next octet in next pbuf */
  43424. p = p->next;
  43425. 802e4bc: 6800 ldr r0, [r0, #0]
  43426. if (p == NULL) { return ERR_ARG; }
  43427. 802e4be: b900 cbnz r0, 802e4c2 <snmp_asn1_dec_length+0x54>
  43428. 802e4c0: e04e b.n 802e560 <snmp_asn1_dec_length+0xf2>
  43429. msg_ptr = (u8_t*)p->payload;
  43430. plen += p->len;
  43431. 802e4c2: f8b0 c00a ldrh.w ip, [r0, #10]
  43432. if (ofs >= plen)
  43433. {
  43434. /* next octet in next pbuf */
  43435. p = p->next;
  43436. if (p == NULL) { return ERR_ARG; }
  43437. msg_ptr = (u8_t*)p->payload;
  43438. 802e4c6: 6845 ldr r5, [r0, #4]
  43439. plen += p->len;
  43440. 802e4c8: 4464 add r4, ip
  43441. 802e4ca: b2a4 uxth r4, r4
  43442. 802e4cc: e000 b.n 802e4d0 <snmp_asn1_dec_length+0x62>
  43443. }
  43444. else
  43445. {
  43446. /* next octet in same pbuf */
  43447. msg_ptr++;
  43448. 802e4ce: 3501 adds r5, #1
  43449. }
  43450. if (*msg_ptr == 0)
  43451. 802e4d0: f895 c000 ldrb.w ip, [r5]
  43452. 802e4d4: f1bc 0f00 cmp.w ip, #0
  43453. 802e4d8: d104 bne.n 802e4e4 <snmp_asn1_dec_length+0x76>
  43454. {
  43455. zeros++;
  43456. 802e4da: 3601 adds r6, #1
  43457. 802e4dc: b2f6 uxtb r6, r6
  43458. if (zeros == 2)
  43459. 802e4de: 2e02 cmp r6, #2
  43460. 802e4e0: d101 bne.n 802e4e6 <snmp_asn1_dec_length+0x78>
  43461. 802e4e2: e007 b.n 802e4f4 <snmp_asn1_dec_length+0x86>
  43462. i = 0;
  43463. }
  43464. }
  43465. else
  43466. {
  43467. zeros = 0;
  43468. 802e4e4: 2600 movs r6, #0
  43469. *length = 0;
  43470. zeros = 0;
  43471. while (zeros != 2)
  43472. {
  43473. i = 2;
  43474. while (i > 0)
  43475. 802e4e6: 42b9 cmp r1, r7
  43476. 802e4e8: d1de bne.n 802e4a8 <snmp_asn1_dec_length+0x3a>
  43477. u8_t zeros;
  43478. u8_t i;
  43479. *length = 0;
  43480. zeros = 0;
  43481. while (zeros != 2)
  43482. 802e4ea: 2e02 cmp r6, #2
  43483. 802e4ec: d002 beq.n 802e4f4 <snmp_asn1_dec_length+0x86>
  43484. * @param octets_used returns number of octets used by the length code
  43485. * @param length return host order length, upto 64k
  43486. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  43487. */
  43488. err_t
  43489. snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length)
  43490. 802e4ee: 1c8f adds r7, r1, #2
  43491. 802e4f0: b2bf uxth r7, r7
  43492. 802e4f2: e7d9 b.n 802e4a8 <snmp_asn1_dec_length+0x3a>
  43493. {
  43494. zeros = 0;
  43495. }
  43496. }
  43497. }
  43498. *octets_used = 1;
  43499. 802e4f4: 2301 movs r3, #1
  43500. 802e4f6: e02c b.n 802e552 <snmp_asn1_dec_length+0xe4>
  43501. return ERR_OK;
  43502. }
  43503. else if (*msg_ptr == 0x81)
  43504. 802e4f8: 2e81 cmp r6, #129 ; 0x81
  43505. 802e4fa: d10c bne.n 802e516 <snmp_asn1_dec_length+0xa8>
  43506. {
  43507. /* constructed definite length format, one octet */
  43508. ofs += 1;
  43509. 802e4fc: 3101 adds r1, #1
  43510. if (ofs >= plen)
  43511. 802e4fe: b289 uxth r1, r1
  43512. 802e500: 42a1 cmp r1, r4
  43513. 802e502: d303 bcc.n 802e50c <snmp_asn1_dec_length+0x9e>
  43514. {
  43515. /* next octet in next pbuf */
  43516. p = p->next;
  43517. 802e504: 6801 ldr r1, [r0, #0]
  43518. if (p == NULL) { return ERR_ARG; }
  43519. 802e506: b359 cbz r1, 802e560 <snmp_asn1_dec_length+0xf2>
  43520. msg_ptr = (u8_t*)p->payload;
  43521. 802e508: 684d ldr r5, [r1, #4]
  43522. 802e50a: e000 b.n 802e50e <snmp_asn1_dec_length+0xa0>
  43523. }
  43524. else
  43525. {
  43526. /* next octet in same pbuf */
  43527. msg_ptr++;
  43528. 802e50c: 3501 adds r5, #1
  43529. }
  43530. *length = *msg_ptr;
  43531. 802e50e: 7829 ldrb r1, [r5, #0]
  43532. 802e510: 8019 strh r1, [r3, #0]
  43533. *octets_used = 2;
  43534. 802e512: 2302 movs r3, #2
  43535. 802e514: e01d b.n 802e552 <snmp_asn1_dec_length+0xe4>
  43536. return ERR_OK;
  43537. }
  43538. else if (*msg_ptr == 0x82)
  43539. 802e516: 2e82 cmp r6, #130 ; 0x82
  43540. 802e518: d11e bne.n 802e558 <snmp_asn1_dec_length+0xea>
  43541. /* constructed definite length format, two octets */
  43542. i = 2;
  43543. while (i > 0)
  43544. {
  43545. i--;
  43546. ofs += 1;
  43547. 802e51a: 1c4e adds r6, r1, #1
  43548. if (ofs >= plen)
  43549. 802e51c: b2b6 uxth r6, r6
  43550. 802e51e: 42a6 cmp r6, r4
  43551. 802e520: d201 bcs.n 802e526 <snmp_asn1_dec_length+0xb8>
  43552. plen += p->len;
  43553. }
  43554. else
  43555. {
  43556. /* next octet in same pbuf */
  43557. msg_ptr++;
  43558. 802e522: 3501 adds r5, #1
  43559. 802e524: e005 b.n 802e532 <snmp_asn1_dec_length+0xc4>
  43560. i--;
  43561. ofs += 1;
  43562. if (ofs >= plen)
  43563. {
  43564. /* next octet in next pbuf */
  43565. p = p->next;
  43566. 802e526: 6800 ldr r0, [r0, #0]
  43567. if (p == NULL) { return ERR_ARG; }
  43568. 802e528: b1d0 cbz r0, 802e560 <snmp_asn1_dec_length+0xf2>
  43569. msg_ptr = (u8_t*)p->payload;
  43570. plen += p->len;
  43571. 802e52a: 8946 ldrh r6, [r0, #10]
  43572. if (ofs >= plen)
  43573. {
  43574. /* next octet in next pbuf */
  43575. p = p->next;
  43576. if (p == NULL) { return ERR_ARG; }
  43577. msg_ptr = (u8_t*)p->payload;
  43578. 802e52c: 6845 ldr r5, [r0, #4]
  43579. plen += p->len;
  43580. 802e52e: 19a4 adds r4, r4, r6
  43581. 802e530: b2a4 uxth r4, r4
  43582. *length |= *msg_ptr;
  43583. }
  43584. else
  43585. {
  43586. /* most significant length octet */
  43587. *length = (*msg_ptr) << 8;
  43588. 802e532: 782e ldrb r6, [r5, #0]
  43589. /* constructed definite length format, two octets */
  43590. i = 2;
  43591. while (i > 0)
  43592. {
  43593. i--;
  43594. ofs += 1;
  43595. 802e534: 3102 adds r1, #2
  43596. if (ofs >= plen)
  43597. 802e536: b289 uxth r1, r1
  43598. *length |= *msg_ptr;
  43599. }
  43600. else
  43601. {
  43602. /* most significant length octet */
  43603. *length = (*msg_ptr) << 8;
  43604. 802e538: 0236 lsls r6, r6, #8
  43605. i = 2;
  43606. while (i > 0)
  43607. {
  43608. i--;
  43609. ofs += 1;
  43610. if (ofs >= plen)
  43611. 802e53a: 42a1 cmp r1, r4
  43612. *length |= *msg_ptr;
  43613. }
  43614. else
  43615. {
  43616. /* most significant length octet */
  43617. *length = (*msg_ptr) << 8;
  43618. 802e53c: 801e strh r6, [r3, #0]
  43619. i = 2;
  43620. while (i > 0)
  43621. {
  43622. i--;
  43623. ofs += 1;
  43624. if (ofs >= plen)
  43625. 802e53e: d201 bcs.n 802e544 <snmp_asn1_dec_length+0xd6>
  43626. plen += p->len;
  43627. }
  43628. else
  43629. {
  43630. /* next octet in same pbuf */
  43631. msg_ptr++;
  43632. 802e540: 3501 adds r5, #1
  43633. 802e542: e002 b.n 802e54a <snmp_asn1_dec_length+0xdc>
  43634. i--;
  43635. ofs += 1;
  43636. if (ofs >= plen)
  43637. {
  43638. /* next octet in next pbuf */
  43639. p = p->next;
  43640. 802e544: 6801 ldr r1, [r0, #0]
  43641. if (p == NULL) { return ERR_ARG; }
  43642. 802e546: b159 cbz r1, 802e560 <snmp_asn1_dec_length+0xf2>
  43643. msg_ptr = (u8_t*)p->payload;
  43644. 802e548: 684d ldr r5, [r1, #4]
  43645. msg_ptr++;
  43646. }
  43647. if (i == 0)
  43648. {
  43649. /* least significant length octet */
  43650. *length |= *msg_ptr;
  43651. 802e54a: 7829 ldrb r1, [r5, #0]
  43652. 802e54c: 430e orrs r6, r1
  43653. 802e54e: 801e strh r6, [r3, #0]
  43654. {
  43655. /* most significant length octet */
  43656. *length = (*msg_ptr) << 8;
  43657. }
  43658. }
  43659. *octets_used = 3;
  43660. 802e550: 2303 movs r3, #3
  43661. 802e552: 7013 strb r3, [r2, #0]
  43662. return ERR_OK;
  43663. 802e554: 2000 movs r0, #0
  43664. 802e556: e00a b.n 802e56e <snmp_asn1_dec_length+0x100>
  43665. }
  43666. else
  43667. {
  43668. /* constructed definite length format 3..127 octets, this is too big (>64k) */
  43669. /** @todo: do we need to accept inefficient codings with many leading zero's? */
  43670. *octets_used = 1 + ((*msg_ptr) & 0x7f);
  43671. 802e558: f006 067f and.w r6, r6, #127 ; 0x7f
  43672. 802e55c: 3601 adds r6, #1
  43673. 802e55e: 7016 strb r6, [r2, #0]
  43674. return ERR_ARG;
  43675. 802e560: 20f2 movs r0, #242 ; 0xf2
  43676. 802e562: e004 b.n 802e56e <snmp_asn1_dec_length+0x100>
  43677. }
  43678. }
  43679. p = p->next;
  43680. 802e564: 6800 ldr r0, [r0, #0]
  43681. plen = 0;
  43682. while (p != NULL)
  43683. {
  43684. base = plen;
  43685. plen += p->len;
  43686. 802e566: 4625 mov r5, r4
  43687. {
  43688. u16_t plen, base;
  43689. u8_t *msg_ptr;
  43690. plen = 0;
  43691. while (p != NULL)
  43692. 802e568: 2800 cmp r0, #0
  43693. 802e56a: d183 bne.n 802e474 <snmp_asn1_dec_length+0x6>
  43694. 802e56c: e7f8 b.n 802e560 <snmp_asn1_dec_length+0xf2>
  43695. p = p->next;
  43696. }
  43697. /* p == NULL, ofs >= plen */
  43698. return ERR_ARG;
  43699. }
  43700. 802e56e: b240 sxtb r0, r0
  43701. 802e570: bdf0 pop {r4, r5, r6, r7, pc}
  43702. 0802e572 <snmp_asn1_dec_u32t>:
  43703. * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value
  43704. * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!
  43705. */
  43706. err_t
  43707. snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value)
  43708. {
  43709. 802e572: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  43710. u16_t plen, base;
  43711. u8_t *msg_ptr;
  43712. plen = 0;
  43713. 802e576: 2500 movs r5, #0
  43714. while (p != NULL)
  43715. 802e578: e049 b.n 802e60e <snmp_asn1_dec_u32t+0x9c>
  43716. {
  43717. base = plen;
  43718. plen += p->len;
  43719. 802e57a: 8944 ldrh r4, [r0, #10]
  43720. 802e57c: 192c adds r4, r5, r4
  43721. 802e57e: b2a4 uxth r4, r4
  43722. if (ofs < plen)
  43723. 802e580: 42a1 cmp r1, r4
  43724. 802e582: d242 bcs.n 802e60a <snmp_asn1_dec_u32t+0x98>
  43725. {
  43726. msg_ptr = (u8_t*)p->payload;
  43727. msg_ptr += ofs - base;
  43728. if ((len > 0) && (len < 6))
  43729. 802e584: 1e56 subs r6, r2, #1
  43730. {
  43731. base = plen;
  43732. plen += p->len;
  43733. if (ofs < plen)
  43734. {
  43735. msg_ptr = (u8_t*)p->payload;
  43736. 802e586: f8d0 c004 ldr.w ip, [r0, #4]
  43737. msg_ptr += ofs - base;
  43738. if ((len > 0) && (len < 6))
  43739. 802e58a: b2b6 uxth r6, r6
  43740. base = plen;
  43741. plen += p->len;
  43742. if (ofs < plen)
  43743. {
  43744. msg_ptr = (u8_t*)p->payload;
  43745. msg_ptr += ofs - base;
  43746. 802e58c: 1b4f subs r7, r1, r5
  43747. if ((len > 0) && (len < 6))
  43748. 802e58e: 2e04 cmp r6, #4
  43749. base = plen;
  43750. plen += p->len;
  43751. if (ofs < plen)
  43752. {
  43753. msg_ptr = (u8_t*)p->payload;
  43754. msg_ptr += ofs - base;
  43755. 802e590: eb0c 0507 add.w r5, ip, r7
  43756. if ((len > 0) && (len < 6))
  43757. 802e594: d901 bls.n 802e59a <snmp_asn1_dec_u32t+0x28>
  43758. *value |= *msg_ptr;
  43759. return ERR_OK;
  43760. }
  43761. else
  43762. {
  43763. return ERR_ARG;
  43764. 802e596: 20f2 movs r0, #242 ; 0xf2
  43765. 802e598: e03c b.n 802e614 <snmp_asn1_dec_u32t+0xa2>
  43766. msg_ptr = (u8_t*)p->payload;
  43767. msg_ptr += ofs - base;
  43768. if ((len > 0) && (len < 6))
  43769. {
  43770. /* start from zero */
  43771. *value = 0;
  43772. 802e59a: f04f 0800 mov.w r8, #0
  43773. 802e59e: f8c3 8000 str.w r8, [r3]
  43774. if (*msg_ptr & 0x80)
  43775. 802e5a2: f81c 7007 ldrb.w r7, [ip, r7]
  43776. 802e5a6: f017 0f80 tst.w r7, #128 ; 0x80
  43777. 802e5aa: d1f4 bne.n 802e596 <snmp_asn1_dec_u32t+0x24>
  43778. return ERR_ARG;
  43779. }
  43780. else
  43781. {
  43782. /* positive */
  43783. if ((len > 1) && (*msg_ptr == 0))
  43784. 802e5ac: 2a01 cmp r2, #1
  43785. 802e5ae: d00e beq.n 802e5ce <snmp_asn1_dec_u32t+0x5c>
  43786. 802e5b0: b96f cbnz r7, 802e5ce <snmp_asn1_dec_u32t+0x5c>
  43787. {
  43788. /* skip leading "sign byte" octet 0x00 */
  43789. len--;
  43790. ofs += 1;
  43791. 802e5b2: 3101 adds r1, #1
  43792. 802e5b4: b289 uxth r1, r1
  43793. if (ofs >= plen)
  43794. 802e5b6: 42a1 cmp r1, r4
  43795. {
  43796. /* positive */
  43797. if ((len > 1) && (*msg_ptr == 0))
  43798. {
  43799. /* skip leading "sign byte" octet 0x00 */
  43800. len--;
  43801. 802e5b8: 4632 mov r2, r6
  43802. ofs += 1;
  43803. if (ofs >= plen)
  43804. 802e5ba: d307 bcc.n 802e5cc <snmp_asn1_dec_u32t+0x5a>
  43805. {
  43806. /* next octet in next pbuf */
  43807. p = p->next;
  43808. 802e5bc: 6800 ldr r0, [r0, #0]
  43809. if (p == NULL) { return ERR_ARG; }
  43810. 802e5be: 2800 cmp r0, #0
  43811. 802e5c0: d0e9 beq.n 802e596 <snmp_asn1_dec_u32t+0x24>
  43812. msg_ptr = (u8_t*)p->payload;
  43813. plen += p->len;
  43814. 802e5c2: 8946 ldrh r6, [r0, #10]
  43815. if (ofs >= plen)
  43816. {
  43817. /* next octet in next pbuf */
  43818. p = p->next;
  43819. if (p == NULL) { return ERR_ARG; }
  43820. msg_ptr = (u8_t*)p->payload;
  43821. 802e5c4: 6845 ldr r5, [r0, #4]
  43822. plen += p->len;
  43823. 802e5c6: 19a4 adds r4, r4, r6
  43824. 802e5c8: b2a4 uxth r4, r4
  43825. 802e5ca: e000 b.n 802e5ce <snmp_asn1_dec_u32t+0x5c>
  43826. }
  43827. else
  43828. {
  43829. /* next octet in same pbuf */
  43830. msg_ptr++;
  43831. 802e5cc: 3501 adds r5, #1
  43832. 802e5ce: 1c4e adds r6, r1, #1
  43833. * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded
  43834. * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value
  43835. * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!
  43836. */
  43837. err_t
  43838. snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value)
  43839. 802e5d0: 188a adds r2, r1, r2
  43840. 802e5d2: b2b6 uxth r6, r6
  43841. 802e5d4: b292 uxth r2, r2
  43842. 802e5d6: e010 b.n 802e5fa <snmp_asn1_dec_u32t+0x88>
  43843. }
  43844. /* OR octets with value */
  43845. while (len > 1)
  43846. {
  43847. len--;
  43848. *value |= *msg_ptr;
  43849. 802e5d8: 7829 ldrb r1, [r5, #0]
  43850. 802e5da: 430f orrs r7, r1
  43851. *value <<= 8;
  43852. 802e5dc: 023f lsls r7, r7, #8
  43853. ofs += 1;
  43854. if (ofs >= plen)
  43855. 802e5de: 42a6 cmp r6, r4
  43856. /* OR octets with value */
  43857. while (len > 1)
  43858. {
  43859. len--;
  43860. *value |= *msg_ptr;
  43861. *value <<= 8;
  43862. 802e5e0: 601f str r7, [r3, #0]
  43863. ofs += 1;
  43864. if (ofs >= plen)
  43865. 802e5e2: d307 bcc.n 802e5f4 <snmp_asn1_dec_u32t+0x82>
  43866. {
  43867. /* next octet in next pbuf */
  43868. p = p->next;
  43869. 802e5e4: 6800 ldr r0, [r0, #0]
  43870. if (p == NULL) { return ERR_ARG; }
  43871. 802e5e6: 2800 cmp r0, #0
  43872. 802e5e8: d0d5 beq.n 802e596 <snmp_asn1_dec_u32t+0x24>
  43873. msg_ptr = (u8_t*)p->payload;
  43874. plen += p->len;
  43875. 802e5ea: 8941 ldrh r1, [r0, #10]
  43876. if (ofs >= plen)
  43877. {
  43878. /* next octet in next pbuf */
  43879. p = p->next;
  43880. if (p == NULL) { return ERR_ARG; }
  43881. msg_ptr = (u8_t*)p->payload;
  43882. 802e5ec: 6845 ldr r5, [r0, #4]
  43883. plen += p->len;
  43884. 802e5ee: 1864 adds r4, r4, r1
  43885. 802e5f0: b2a4 uxth r4, r4
  43886. 802e5f2: e000 b.n 802e5f6 <snmp_asn1_dec_u32t+0x84>
  43887. }
  43888. else
  43889. {
  43890. /* next octet in same pbuf */
  43891. msg_ptr++;
  43892. 802e5f4: 3501 adds r5, #1
  43893. 802e5f6: 3601 adds r6, #1
  43894. 802e5f8: b2b6 uxth r6, r6
  43895. msg_ptr++;
  43896. }
  43897. }
  43898. }
  43899. /* OR octets with value */
  43900. while (len > 1)
  43901. 802e5fa: 4296 cmp r6, r2
  43902. 802e5fc: 681f ldr r7, [r3, #0]
  43903. 802e5fe: d1eb bne.n 802e5d8 <snmp_asn1_dec_u32t+0x66>
  43904. {
  43905. /* next octet in same pbuf */
  43906. msg_ptr++;
  43907. }
  43908. }
  43909. *value |= *msg_ptr;
  43910. 802e600: 782a ldrb r2, [r5, #0]
  43911. 802e602: 4317 orrs r7, r2
  43912. 802e604: 601f str r7, [r3, #0]
  43913. return ERR_OK;
  43914. 802e606: 2000 movs r0, #0
  43915. 802e608: e004 b.n 802e614 <snmp_asn1_dec_u32t+0xa2>
  43916. else
  43917. {
  43918. return ERR_ARG;
  43919. }
  43920. }
  43921. p = p->next;
  43922. 802e60a: 6800 ldr r0, [r0, #0]
  43923. plen = 0;
  43924. while (p != NULL)
  43925. {
  43926. base = plen;
  43927. plen += p->len;
  43928. 802e60c: 4625 mov r5, r4
  43929. {
  43930. u16_t plen, base;
  43931. u8_t *msg_ptr;
  43932. plen = 0;
  43933. while (p != NULL)
  43934. 802e60e: 2800 cmp r0, #0
  43935. 802e610: d1b3 bne.n 802e57a <snmp_asn1_dec_u32t+0x8>
  43936. 802e612: e7c0 b.n 802e596 <snmp_asn1_dec_u32t+0x24>
  43937. }
  43938. p = p->next;
  43939. }
  43940. /* p == NULL, ofs >= plen */
  43941. return ERR_ARG;
  43942. }
  43943. 802e614: b240 sxtb r0, r0
  43944. 802e616: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  43945. 0802e61a <snmp_asn1_dec_s32t>:
  43946. *
  43947. * @note ASN coded integers are _always_ signed!
  43948. */
  43949. err_t
  43950. snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value)
  43951. {
  43952. 802e61a: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  43953. #if BYTE_ORDER == BIG_ENDIAN
  43954. u8_t *lsb_ptr = (u8_t*)value + sizeof(s32_t) - 1;
  43955. #endif
  43956. u8_t sign;
  43957. plen = 0;
  43958. 802e61e: 2500 movs r5, #0
  43959. while (p != NULL)
  43960. 802e620: e04e b.n 802e6c0 <snmp_asn1_dec_s32t+0xa6>
  43961. {
  43962. base = plen;
  43963. plen += p->len;
  43964. 802e622: 8944 ldrh r4, [r0, #10]
  43965. 802e624: 192c adds r4, r5, r4
  43966. 802e626: b2a4 uxth r4, r4
  43967. if (ofs < plen)
  43968. 802e628: 42a1 cmp r1, r4
  43969. 802e62a: d247 bcs.n 802e6bc <snmp_asn1_dec_s32t+0xa2>
  43970. {
  43971. msg_ptr = (u8_t*)p->payload;
  43972. 802e62c: 6847 ldr r7, [r0, #4]
  43973. msg_ptr += ofs - base;
  43974. if ((len > 0) && (len < 5))
  43975. 802e62e: f102 3cff add.w ip, r2, #4294967295
  43976. base = plen;
  43977. plen += p->len;
  43978. if (ofs < plen)
  43979. {
  43980. msg_ptr = (u8_t*)p->payload;
  43981. msg_ptr += ofs - base;
  43982. 802e632: 1b4e subs r6, r1, r5
  43983. if ((len > 0) && (len < 5))
  43984. 802e634: f1bc 0f03 cmp.w ip, #3
  43985. base = plen;
  43986. plen += p->len;
  43987. if (ofs < plen)
  43988. {
  43989. msg_ptr = (u8_t*)p->payload;
  43990. msg_ptr += ofs - base;
  43991. 802e638: eb07 0506 add.w r5, r7, r6
  43992. if ((len > 0) && (len < 5))
  43993. 802e63c: d901 bls.n 802e642 <snmp_asn1_dec_s32t+0x28>
  43994. }
  43995. return ERR_OK;
  43996. }
  43997. else
  43998. {
  43999. return ERR_ARG;
  44000. 802e63e: 20f2 movs r0, #242 ; 0xf2
  44001. 802e640: e041 b.n 802e6c6 <snmp_asn1_dec_s32t+0xac>
  44002. {
  44003. msg_ptr = (u8_t*)p->payload;
  44004. msg_ptr += ofs - base;
  44005. if ((len > 0) && (len < 5))
  44006. {
  44007. if (*msg_ptr & 0x80)
  44008. 802e642: 57be ldrsb r6, [r7, r6]
  44009. 802e644: 2e00 cmp r6, #0
  44010. 802e646: da0b bge.n 802e660 <snmp_asn1_dec_s32t+0x46>
  44011. {
  44012. /* negative, start from -1 */
  44013. *value = -1;
  44014. 802e648: f04f 36ff mov.w r6, #4294967295
  44015. 802e64c: 601e str r6, [r3, #0]
  44016. sign = 1;
  44017. 802e64e: 2601 movs r6, #1
  44018. 802e650: f101 0c01 add.w ip, r1, #1
  44019. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  44020. *
  44021. * @note ASN coded integers are _always_ signed!
  44022. */
  44023. err_t
  44024. snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value)
  44025. 802e654: 1852 adds r2, r2, r1
  44026. 802e656: fa1f fc8c uxth.w ip, ip
  44027. 802e65a: b292 uxth r2, r2
  44028. len--;
  44029. if (sign)
  44030. {
  44031. *lsb_ptr &= *msg_ptr;
  44032. *value <<= 8;
  44033. *lsb_ptr |= 255;
  44034. 802e65c: 21ff movs r1, #255 ; 0xff
  44035. 802e65e: e022 b.n 802e6a6 <snmp_asn1_dec_s32t+0x8c>
  44036. sign = 1;
  44037. }
  44038. else
  44039. {
  44040. /* positive, start from 0 */
  44041. *value = 0;
  44042. 802e660: 2600 movs r6, #0
  44043. 802e662: 601e str r6, [r3, #0]
  44044. 802e664: e7f4 b.n 802e650 <snmp_asn1_dec_s32t+0x36>
  44045. 802e666: f895 8000 ldrb.w r8, [r5]
  44046. }
  44047. /* OR/AND octets with value */
  44048. while (len > 1)
  44049. {
  44050. len--;
  44051. if (sign)
  44052. 802e66a: b13e cbz r6, 802e67c <snmp_asn1_dec_s32t+0x62>
  44053. {
  44054. *lsb_ptr &= *msg_ptr;
  44055. 802e66c: ea08 0707 and.w r7, r8, r7
  44056. 802e670: 701f strb r7, [r3, #0]
  44057. *value <<= 8;
  44058. 802e672: 681f ldr r7, [r3, #0]
  44059. 802e674: 023f lsls r7, r7, #8
  44060. 802e676: 601f str r7, [r3, #0]
  44061. *lsb_ptr |= 255;
  44062. 802e678: 7019 strb r1, [r3, #0]
  44063. 802e67a: e005 b.n 802e688 <snmp_asn1_dec_s32t+0x6e>
  44064. }
  44065. else
  44066. {
  44067. *lsb_ptr |= *msg_ptr;
  44068. 802e67c: ea48 0707 orr.w r7, r8, r7
  44069. 802e680: 701f strb r7, [r3, #0]
  44070. *value <<= 8;
  44071. 802e682: 681f ldr r7, [r3, #0]
  44072. 802e684: 023f lsls r7, r7, #8
  44073. 802e686: 601f str r7, [r3, #0]
  44074. }
  44075. ofs += 1;
  44076. if (ofs >= plen)
  44077. 802e688: 45a4 cmp ip, r4
  44078. 802e68a: d307 bcc.n 802e69c <snmp_asn1_dec_s32t+0x82>
  44079. {
  44080. /* next octet in next pbuf */
  44081. p = p->next;
  44082. 802e68c: 6800 ldr r0, [r0, #0]
  44083. if (p == NULL) { return ERR_ARG; }
  44084. 802e68e: 2800 cmp r0, #0
  44085. 802e690: d0d5 beq.n 802e63e <snmp_asn1_dec_s32t+0x24>
  44086. msg_ptr = (u8_t*)p->payload;
  44087. plen += p->len;
  44088. 802e692: 8947 ldrh r7, [r0, #10]
  44089. if (ofs >= plen)
  44090. {
  44091. /* next octet in next pbuf */
  44092. p = p->next;
  44093. if (p == NULL) { return ERR_ARG; }
  44094. msg_ptr = (u8_t*)p->payload;
  44095. 802e694: 6845 ldr r5, [r0, #4]
  44096. plen += p->len;
  44097. 802e696: 19e4 adds r4, r4, r7
  44098. 802e698: b2a4 uxth r4, r4
  44099. 802e69a: e000 b.n 802e69e <snmp_asn1_dec_s32t+0x84>
  44100. }
  44101. else
  44102. {
  44103. /* next octet in same pbuf */
  44104. msg_ptr++;
  44105. 802e69c: 3501 adds r5, #1
  44106. 802e69e: f10c 0c01 add.w ip, ip, #1
  44107. 802e6a2: fa1f fc8c uxth.w ip, ip
  44108. /* positive, start from 0 */
  44109. *value = 0;
  44110. sign = 0;
  44111. }
  44112. /* OR/AND octets with value */
  44113. while (len > 1)
  44114. 802e6a6: 4594 cmp ip, r2
  44115. 802e6a8: 781f ldrb r7, [r3, #0]
  44116. 802e6aa: d1dc bne.n 802e666 <snmp_asn1_dec_s32t+0x4c>
  44117. 802e6ac: 782a ldrb r2, [r5, #0]
  44118. {
  44119. /* next octet in same pbuf */
  44120. msg_ptr++;
  44121. }
  44122. }
  44123. if (sign)
  44124. 802e6ae: b11e cbz r6, 802e6b8 <snmp_asn1_dec_s32t+0x9e>
  44125. {
  44126. *lsb_ptr &= *msg_ptr;
  44127. 802e6b0: 4017 ands r7, r2
  44128. 802e6b2: 701f strb r7, [r3, #0]
  44129. }
  44130. else
  44131. {
  44132. *lsb_ptr |= *msg_ptr;
  44133. }
  44134. return ERR_OK;
  44135. 802e6b4: 2000 movs r0, #0
  44136. 802e6b6: e006 b.n 802e6c6 <snmp_asn1_dec_s32t+0xac>
  44137. {
  44138. *lsb_ptr &= *msg_ptr;
  44139. }
  44140. else
  44141. {
  44142. *lsb_ptr |= *msg_ptr;
  44143. 802e6b8: 4317 orrs r7, r2
  44144. 802e6ba: e7fa b.n 802e6b2 <snmp_asn1_dec_s32t+0x98>
  44145. else
  44146. {
  44147. return ERR_ARG;
  44148. }
  44149. }
  44150. p = p->next;
  44151. 802e6bc: 6800 ldr r0, [r0, #0]
  44152. plen = 0;
  44153. while (p != NULL)
  44154. {
  44155. base = plen;
  44156. plen += p->len;
  44157. 802e6be: 4625 mov r5, r4
  44158. u8_t *lsb_ptr = (u8_t*)value + sizeof(s32_t) - 1;
  44159. #endif
  44160. u8_t sign;
  44161. plen = 0;
  44162. while (p != NULL)
  44163. 802e6c0: 2800 cmp r0, #0
  44164. 802e6c2: d1ae bne.n 802e622 <snmp_asn1_dec_s32t+0x8>
  44165. 802e6c4: e7bb b.n 802e63e <snmp_asn1_dec_s32t+0x24>
  44166. }
  44167. p = p->next;
  44168. }
  44169. /* p == NULL, ofs >= plen */
  44170. return ERR_ARG;
  44171. }
  44172. 802e6c6: b240 sxtb r0, r0
  44173. 802e6c8: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  44174. 0802e6cc <snmp_asn1_dec_oid>:
  44175. * @param oid return object identifier struct
  44176. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  44177. */
  44178. err_t
  44179. snmp_asn1_dec_oid(struct pbuf *p, u16_t ofs, u16_t len, struct snmp_obj_id *oid)
  44180. {
  44181. 802e6cc: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  44182. u16_t plen, base;
  44183. u8_t *msg_ptr;
  44184. s32_t *oid_ptr;
  44185. plen = 0;
  44186. 802e6d0: 2600 movs r6, #0
  44187. while (p != NULL)
  44188. 802e6d2: e08d b.n 802e7f0 <snmp_asn1_dec_oid+0x124>
  44189. {
  44190. base = plen;
  44191. plen += p->len;
  44192. 802e6d4: 8944 ldrh r4, [r0, #10]
  44193. 802e6d6: 1934 adds r4, r6, r4
  44194. 802e6d8: b2a4 uxth r4, r4
  44195. if (ofs < plen)
  44196. 802e6da: 42a1 cmp r1, r4
  44197. 802e6dc: f080 8086 bcs.w 802e7ec <snmp_asn1_dec_oid+0x120>
  44198. {
  44199. msg_ptr = (u8_t*)p->payload;
  44200. msg_ptr += ofs - base;
  44201. oid->len = 0;
  44202. 802e6e0: f04f 0800 mov.w r8, #0
  44203. {
  44204. base = plen;
  44205. plen += p->len;
  44206. if (ofs < plen)
  44207. {
  44208. msg_ptr = (u8_t*)p->payload;
  44209. 802e6e4: 6847 ldr r7, [r0, #4]
  44210. msg_ptr += ofs - base;
  44211. oid->len = 0;
  44212. 802e6e6: f883 8000 strb.w r8, [r3]
  44213. oid_ptr = &oid->id[0];
  44214. if (len > 0)
  44215. 802e6ea: b90a cbnz r2, 802e6f0 <snmp_asn1_dec_oid+0x24>
  44216. }
  44217. else
  44218. {
  44219. /* accepting zero length identifiers e.g. for
  44220. getnext operation. uncommon but valid */
  44221. return ERR_OK;
  44222. 802e6ec: 2000 movs r0, #0
  44223. 802e6ee: e083 b.n 802e7f8 <snmp_asn1_dec_oid+0x12c>
  44224. base = plen;
  44225. plen += p->len;
  44226. if (ofs < plen)
  44227. {
  44228. msg_ptr = (u8_t*)p->payload;
  44229. msg_ptr += ofs - base;
  44230. 802e6f0: 1b8e subs r6, r1, r6
  44231. 802e6f2: 19bd adds r5, r7, r6
  44232. oid->len = 0;
  44233. oid_ptr = &oid->id[0];
  44234. if (len > 0)
  44235. {
  44236. /* first compressed octet */
  44237. if (*msg_ptr == 0x2B)
  44238. 802e6f4: f817 c006 ldrb.w ip, [r7, r6]
  44239. 802e6f8: f1bc 0f2b cmp.w ip, #43 ; 0x2b
  44240. 802e6fc: d103 bne.n 802e706 <snmp_asn1_dec_oid+0x3a>
  44241. {
  44242. /* (most) common case 1.3 (iso.org) */
  44243. *oid_ptr = 1;
  44244. 802e6fe: 2601 movs r6, #1
  44245. 802e700: 605e str r6, [r3, #4]
  44246. oid_ptr++;
  44247. *oid_ptr = 3;
  44248. 802e702: 2603 movs r6, #3
  44249. 802e704: e016 b.n 802e734 <snmp_asn1_dec_oid+0x68>
  44250. oid_ptr++;
  44251. }
  44252. else if (*msg_ptr < 40)
  44253. 802e706: f1bc 0f27 cmp.w ip, #39 ; 0x27
  44254. 802e70a: d803 bhi.n 802e714 <snmp_asn1_dec_oid+0x48>
  44255. {
  44256. *oid_ptr = 0;
  44257. 802e70c: f8c3 8004 str.w r8, [r3, #4]
  44258. oid_ptr++;
  44259. *oid_ptr = *msg_ptr;
  44260. 802e710: 5dbe ldrb r6, [r7, r6]
  44261. 802e712: e00f b.n 802e734 <snmp_asn1_dec_oid+0x68>
  44262. oid_ptr++;
  44263. }
  44264. else if (*msg_ptr < 80)
  44265. 802e714: f1bc 0f4f cmp.w ip, #79 ; 0x4f
  44266. 802e718: d806 bhi.n 802e728 <snmp_asn1_dec_oid+0x5c>
  44267. {
  44268. *oid_ptr = 1;
  44269. 802e71a: f04f 0c01 mov.w ip, #1
  44270. 802e71e: f8c3 c004 str.w ip, [r3, #4]
  44271. oid_ptr++;
  44272. *oid_ptr = (*msg_ptr) - 40;
  44273. 802e722: 5dbe ldrb r6, [r7, r6]
  44274. 802e724: 3e28 subs r6, #40 ; 0x28
  44275. 802e726: e005 b.n 802e734 <snmp_asn1_dec_oid+0x68>
  44276. oid_ptr++;
  44277. }
  44278. else
  44279. {
  44280. *oid_ptr = 2;
  44281. 802e728: f04f 0c02 mov.w ip, #2
  44282. 802e72c: f8c3 c004 str.w ip, [r3, #4]
  44283. oid_ptr++;
  44284. *oid_ptr = (*msg_ptr) - 80;
  44285. 802e730: 5dbe ldrb r6, [r7, r6]
  44286. 802e732: 3e50 subs r6, #80 ; 0x50
  44287. {
  44288. /* accepting zero length identifiers e.g. for
  44289. getnext operation. uncommon but valid */
  44290. return ERR_OK;
  44291. }
  44292. len--;
  44293. 802e734: 3a01 subs r2, #1
  44294. *oid_ptr = 2;
  44295. oid_ptr++;
  44296. *oid_ptr = (*msg_ptr) - 80;
  44297. oid_ptr++;
  44298. }
  44299. oid->len = 2;
  44300. 802e736: 2702 movs r7, #2
  44301. {
  44302. /* accepting zero length identifiers e.g. for
  44303. getnext operation. uncommon but valid */
  44304. return ERR_OK;
  44305. }
  44306. len--;
  44307. 802e738: b292 uxth r2, r2
  44308. }
  44309. else
  44310. {
  44311. *oid_ptr = 2;
  44312. oid_ptr++;
  44313. *oid_ptr = (*msg_ptr) - 80;
  44314. 802e73a: 609e str r6, [r3, #8]
  44315. oid_ptr++;
  44316. }
  44317. oid->len = 2;
  44318. 802e73c: 701f strb r7, [r3, #0]
  44319. else
  44320. {
  44321. *oid_ptr = 2;
  44322. oid_ptr++;
  44323. *oid_ptr = (*msg_ptr) - 80;
  44324. oid_ptr++;
  44325. 802e73e: f103 060c add.w r6, r3, #12
  44326. /* accepting zero length identifiers e.g. for
  44327. getnext operation. uncommon but valid */
  44328. return ERR_OK;
  44329. }
  44330. len--;
  44331. if (len > 0)
  44332. 802e742: 2a00 cmp r2, #0
  44333. 802e744: d04b beq.n 802e7de <snmp_asn1_dec_oid+0x112>
  44334. {
  44335. ofs += 1;
  44336. 802e746: 3101 adds r1, #1
  44337. 802e748: b289 uxth r1, r1
  44338. if (ofs >= plen)
  44339. 802e74a: 42a1 cmp r1, r4
  44340. 802e74c: d308 bcc.n 802e760 <snmp_asn1_dec_oid+0x94>
  44341. {
  44342. /* next octet in next pbuf */
  44343. p = p->next;
  44344. 802e74e: 6800 ldr r0, [r0, #0]
  44345. if (p == NULL) { return ERR_ARG; }
  44346. 802e750: b908 cbnz r0, 802e756 <snmp_asn1_dec_oid+0x8a>
  44347. 802e752: 20f2 movs r0, #242 ; 0xf2
  44348. 802e754: e050 b.n 802e7f8 <snmp_asn1_dec_oid+0x12c>
  44349. msg_ptr = (u8_t*)p->payload;
  44350. plen += p->len;
  44351. 802e756: 8947 ldrh r7, [r0, #10]
  44352. if (ofs >= plen)
  44353. {
  44354. /* next octet in next pbuf */
  44355. p = p->next;
  44356. if (p == NULL) { return ERR_ARG; }
  44357. msg_ptr = (u8_t*)p->payload;
  44358. 802e758: 6845 ldr r5, [r0, #4]
  44359. plen += p->len;
  44360. 802e75a: 19e4 adds r4, r4, r7
  44361. 802e75c: b2a4 uxth r4, r4
  44362. 802e75e: e03e b.n 802e7de <snmp_asn1_dec_oid+0x112>
  44363. }
  44364. else
  44365. {
  44366. /* next octet in same pbuf */
  44367. msg_ptr++;
  44368. 802e760: 3501 adds r5, #1
  44369. 802e762: e03c b.n 802e7de <snmp_asn1_dec_oid+0x112>
  44370. }
  44371. }
  44372. while ((len > 0) && (oid->len < LWIP_SNMP_OBJ_ID_LEN))
  44373. {
  44374. /* sub-identifier uses multiple octets */
  44375. if (*msg_ptr & 0x80)
  44376. 802e764: 782f ldrb r7, [r5, #0]
  44377. 802e766: f017 0f80 tst.w r7, #128 ; 0x80
  44378. 802e76a: d023 beq.n 802e7b4 <snmp_asn1_dec_oid+0xe8>
  44379. 802e76c: e014 b.n 802e798 <snmp_asn1_dec_oid+0xcc>
  44380. while ((*msg_ptr & 0x80) && (len > 1))
  44381. {
  44382. len--;
  44383. sub_id = (sub_id << 7) + (*msg_ptr & ~0x80);
  44384. ofs += 1;
  44385. 802e76e: 3101 adds r1, #1
  44386. 802e770: b289 uxth r1, r1
  44387. {
  44388. s32_t sub_id = 0;
  44389. while ((*msg_ptr & 0x80) && (len > 1))
  44390. {
  44391. len--;
  44392. 802e772: 3a01 subs r2, #1
  44393. sub_id = (sub_id << 7) + (*msg_ptr & ~0x80);
  44394. 802e774: f02c 0c80 bic.w ip, ip, #128 ; 0x80
  44395. ofs += 1;
  44396. if (ofs >= plen)
  44397. 802e778: 42a1 cmp r1, r4
  44398. {
  44399. s32_t sub_id = 0;
  44400. while ((*msg_ptr & 0x80) && (len > 1))
  44401. {
  44402. len--;
  44403. 802e77a: b292 uxth r2, r2
  44404. sub_id = (sub_id << 7) + (*msg_ptr & ~0x80);
  44405. 802e77c: eb0c 17c7 add.w r7, ip, r7, lsl #7
  44406. ofs += 1;
  44407. if (ofs >= plen)
  44408. 802e780: d308 bcc.n 802e794 <snmp_asn1_dec_oid+0xc8>
  44409. {
  44410. /* next octet in next pbuf */
  44411. p = p->next;
  44412. 802e782: 6800 ldr r0, [r0, #0]
  44413. if (p == NULL) { return ERR_ARG; }
  44414. 802e784: 2800 cmp r0, #0
  44415. 802e786: d0e4 beq.n 802e752 <snmp_asn1_dec_oid+0x86>
  44416. msg_ptr = (u8_t*)p->payload;
  44417. plen += p->len;
  44418. 802e788: f8b0 c00a ldrh.w ip, [r0, #10]
  44419. if (ofs >= plen)
  44420. {
  44421. /* next octet in next pbuf */
  44422. p = p->next;
  44423. if (p == NULL) { return ERR_ARG; }
  44424. msg_ptr = (u8_t*)p->payload;
  44425. 802e78c: 6845 ldr r5, [r0, #4]
  44426. plen += p->len;
  44427. 802e78e: 4464 add r4, ip
  44428. 802e790: b2a4 uxth r4, r4
  44429. 802e792: e002 b.n 802e79a <snmp_asn1_dec_oid+0xce>
  44430. }
  44431. else
  44432. {
  44433. /* next octet in same pbuf */
  44434. msg_ptr++;
  44435. 802e794: 3501 adds r5, #1
  44436. 802e796: e000 b.n 802e79a <snmp_asn1_dec_oid+0xce>
  44437. }
  44438. }
  44439. while ((len > 0) && (oid->len < LWIP_SNMP_OBJ_ID_LEN))
  44440. {
  44441. /* sub-identifier uses multiple octets */
  44442. if (*msg_ptr & 0x80)
  44443. 802e798: 2700 movs r7, #0
  44444. {
  44445. s32_t sub_id = 0;
  44446. while ((*msg_ptr & 0x80) && (len > 1))
  44447. 802e79a: f895 c000 ldrb.w ip, [r5]
  44448. 802e79e: f01c 0f80 tst.w ip, #128 ; 0x80
  44449. 802e7a2: d02c beq.n 802e7fe <snmp_asn1_dec_oid+0x132>
  44450. 802e7a4: 2a01 cmp r2, #1
  44451. 802e7a6: d1e2 bne.n 802e76e <snmp_asn1_dec_oid+0xa2>
  44452. 802e7a8: e009 b.n 802e7be <snmp_asn1_dec_oid+0xf2>
  44453. }
  44454. }
  44455. if (!(*msg_ptr & 0x80) && (len > 0))
  44456. {
  44457. /* last octet sub-identifier */
  44458. len--;
  44459. 802e7aa: 3a01 subs r2, #1
  44460. 802e7ac: b292 uxth r2, r2
  44461. sub_id = (sub_id << 7) + *msg_ptr;
  44462. 802e7ae: eb0c 17c7 add.w r7, ip, r7, lsl #7
  44463. 802e7b2: e001 b.n 802e7b8 <snmp_asn1_dec_oid+0xec>
  44464. }
  44465. }
  44466. else
  44467. {
  44468. /* !(*msg_ptr & 0x80) sub-identifier uses single octet */
  44469. len--;
  44470. 802e7b4: 3a01 subs r2, #1
  44471. 802e7b6: b292 uxth r2, r2
  44472. *oid_ptr = *msg_ptr;
  44473. 802e7b8: f846 7c04 str.w r7, [r6, #-4]
  44474. }
  44475. if (len > 0)
  44476. 802e7bc: b162 cbz r2, 802e7d8 <snmp_asn1_dec_oid+0x10c>
  44477. {
  44478. /* remaining oid bytes available ... */
  44479. ofs += 1;
  44480. 802e7be: 3101 adds r1, #1
  44481. 802e7c0: b289 uxth r1, r1
  44482. if (ofs >= plen)
  44483. 802e7c2: 42a1 cmp r1, r4
  44484. 802e7c4: d307 bcc.n 802e7d6 <snmp_asn1_dec_oid+0x10a>
  44485. {
  44486. /* next octet in next pbuf */
  44487. p = p->next;
  44488. 802e7c6: 6800 ldr r0, [r0, #0]
  44489. if (p == NULL) { return ERR_ARG; }
  44490. 802e7c8: 2800 cmp r0, #0
  44491. 802e7ca: d0c2 beq.n 802e752 <snmp_asn1_dec_oid+0x86>
  44492. msg_ptr = (u8_t*)p->payload;
  44493. plen += p->len;
  44494. 802e7cc: 8947 ldrh r7, [r0, #10]
  44495. if (ofs >= plen)
  44496. {
  44497. /* next octet in next pbuf */
  44498. p = p->next;
  44499. if (p == NULL) { return ERR_ARG; }
  44500. msg_ptr = (u8_t*)p->payload;
  44501. 802e7ce: 6845 ldr r5, [r0, #4]
  44502. plen += p->len;
  44503. 802e7d0: 19e4 adds r4, r4, r7
  44504. 802e7d2: b2a4 uxth r4, r4
  44505. 802e7d4: e000 b.n 802e7d8 <snmp_asn1_dec_oid+0x10c>
  44506. }
  44507. else
  44508. {
  44509. /* next octet in same pbuf */
  44510. msg_ptr++;
  44511. 802e7d6: 3501 adds r5, #1
  44512. }
  44513. }
  44514. oid_ptr++;
  44515. oid->len++;
  44516. 802e7d8: 781f ldrb r7, [r3, #0]
  44517. 802e7da: 3701 adds r7, #1
  44518. 802e7dc: 701f strb r7, [r3, #0]
  44519. 802e7de: 3604 adds r6, #4
  44520. {
  44521. /* next octet in same pbuf */
  44522. msg_ptr++;
  44523. }
  44524. }
  44525. while ((len > 0) && (oid->len < LWIP_SNMP_OBJ_ID_LEN))
  44526. 802e7e0: 2a00 cmp r2, #0
  44527. 802e7e2: d083 beq.n 802e6ec <snmp_asn1_dec_oid+0x20>
  44528. 802e7e4: 781f ldrb r7, [r3, #0]
  44529. 802e7e6: 2f1f cmp r7, #31
  44530. 802e7e8: d9bc bls.n 802e764 <snmp_asn1_dec_oid+0x98>
  44531. 802e7ea: e7b2 b.n 802e752 <snmp_asn1_dec_oid+0x86>
  44532. /* len > 0, oid->len == LWIP_SNMP_OBJ_ID_LEN or malformed encoding */
  44533. return ERR_ARG;
  44534. }
  44535. }
  44536. p = p->next;
  44537. 802e7ec: 6800 ldr r0, [r0, #0]
  44538. plen = 0;
  44539. while (p != NULL)
  44540. {
  44541. base = plen;
  44542. plen += p->len;
  44543. 802e7ee: 4626 mov r6, r4
  44544. u16_t plen, base;
  44545. u8_t *msg_ptr;
  44546. s32_t *oid_ptr;
  44547. plen = 0;
  44548. while (p != NULL)
  44549. 802e7f0: 2800 cmp r0, #0
  44550. 802e7f2: f47f af6f bne.w 802e6d4 <snmp_asn1_dec_oid+0x8>
  44551. 802e7f6: e7ac b.n 802e752 <snmp_asn1_dec_oid+0x86>
  44552. 802e7f8: b240 sxtb r0, r0
  44553. 802e7fa: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  44554. {
  44555. /* next octet in same pbuf */
  44556. msg_ptr++;
  44557. }
  44558. }
  44559. if (!(*msg_ptr & 0x80) && (len > 0))
  44560. 802e7fe: 2a00 cmp r2, #0
  44561. 802e800: d1d3 bne.n 802e7aa <snmp_asn1_dec_oid+0xde>
  44562. 802e802: e7e9 b.n 802e7d8 <snmp_asn1_dec_oid+0x10c>
  44563. 0802e804 <snmp_asn1_dec_raw>:
  44564. * @param raw return raw bytes
  44565. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  44566. */
  44567. err_t
  44568. snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw)
  44569. {
  44570. 802e804: b5f0 push {r4, r5, r6, r7, lr}
  44571. u16_t plen, base;
  44572. u8_t *msg_ptr;
  44573. if (len > 0)
  44574. 802e806: 2a00 cmp r2, #0
  44575. 802e808: d12d bne.n 802e866 <snmp_asn1_dec_raw+0x62>
  44576. 802e80a: e027 b.n 802e85c <snmp_asn1_dec_raw+0x58>
  44577. {
  44578. plen = 0;
  44579. while (p != NULL)
  44580. {
  44581. base = plen;
  44582. plen += p->len;
  44583. 802e80c: 8944 ldrh r4, [r0, #10]
  44584. 802e80e: 1934 adds r4, r6, r4
  44585. 802e810: b2a4 uxth r4, r4
  44586. if (ofs < plen)
  44587. 802e812: 42a1 cmp r1, r4
  44588. 802e814: d224 bcs.n 802e860 <snmp_asn1_dec_raw+0x5c>
  44589. {
  44590. msg_ptr = (u8_t*)p->payload;
  44591. 802e816: 6847 ldr r7, [r0, #4]
  44592. msg_ptr += ofs - base;
  44593. 802e818: 1b8d subs r5, r1, r6
  44594. if (raw_len >= len)
  44595. 802e81a: 4293 cmp r3, r2
  44596. base = plen;
  44597. plen += p->len;
  44598. if (ofs < plen)
  44599. {
  44600. msg_ptr = (u8_t*)p->payload;
  44601. msg_ptr += ofs - base;
  44602. 802e81c: 443d add r5, r7
  44603. if (raw_len >= len)
  44604. 802e81e: d305 bcc.n 802e82c <snmp_asn1_dec_raw+0x28>
  44605. 802e820: 9b05 ldr r3, [sp, #20]
  44606. * @param raw_len length of the raw return value
  44607. * @param raw return raw bytes
  44608. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  44609. */
  44610. err_t
  44611. snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw)
  44612. 802e822: b29e uxth r6, r3
  44613. 802e824: 18b2 adds r2, r6, r2
  44614. 802e826: b292 uxth r2, r2
  44615. 802e828: 1b89 subs r1, r1, r6
  44616. 802e82a: e011 b.n 802e850 <snmp_asn1_dec_raw+0x4c>
  44617. return ERR_OK;
  44618. }
  44619. else
  44620. {
  44621. /* raw_len < len, not enough dst space */
  44622. return ERR_ARG;
  44623. 802e82c: 20f2 movs r0, #242 ; 0xf2
  44624. 802e82e: e01e b.n 802e86e <snmp_asn1_dec_raw+0x6a>
  44625. {
  44626. while (len > 1)
  44627. {
  44628. /* copy len - 1 octets */
  44629. len--;
  44630. *raw = *msg_ptr;
  44631. 802e830: 782e ldrb r6, [r5, #0]
  44632. 802e832: f803 6b01 strb.w r6, [r3], #1
  44633. * @param raw_len length of the raw return value
  44634. * @param raw return raw bytes
  44635. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
  44636. */
  44637. err_t
  44638. snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw)
  44639. 802e836: 18ce adds r6, r1, r3
  44640. /* copy len - 1 octets */
  44641. len--;
  44642. *raw = *msg_ptr;
  44643. raw++;
  44644. ofs += 1;
  44645. if (ofs >= plen)
  44646. 802e838: b2b6 uxth r6, r6
  44647. 802e83a: 42a6 cmp r6, r4
  44648. 802e83c: d307 bcc.n 802e84e <snmp_asn1_dec_raw+0x4a>
  44649. {
  44650. /* next octet in next pbuf */
  44651. p = p->next;
  44652. 802e83e: 6800 ldr r0, [r0, #0]
  44653. if (p == NULL) { return ERR_ARG; }
  44654. 802e840: 2800 cmp r0, #0
  44655. 802e842: d0f3 beq.n 802e82c <snmp_asn1_dec_raw+0x28>
  44656. msg_ptr = (u8_t*)p->payload;
  44657. plen += p->len;
  44658. 802e844: 8946 ldrh r6, [r0, #10]
  44659. if (ofs >= plen)
  44660. {
  44661. /* next octet in next pbuf */
  44662. p = p->next;
  44663. if (p == NULL) { return ERR_ARG; }
  44664. msg_ptr = (u8_t*)p->payload;
  44665. 802e846: 6845 ldr r5, [r0, #4]
  44666. plen += p->len;
  44667. 802e848: 19a4 adds r4, r4, r6
  44668. 802e84a: b2a4 uxth r4, r4
  44669. 802e84c: e000 b.n 802e850 <snmp_asn1_dec_raw+0x4c>
  44670. }
  44671. else
  44672. {
  44673. /* next octet in same pbuf */
  44674. msg_ptr++;
  44675. 802e84e: 3501 adds r5, #1
  44676. {
  44677. msg_ptr = (u8_t*)p->payload;
  44678. msg_ptr += ofs - base;
  44679. if (raw_len >= len)
  44680. {
  44681. while (len > 1)
  44682. 802e850: 1ad7 subs r7, r2, r3
  44683. 802e852: b2bf uxth r7, r7
  44684. 802e854: 2f01 cmp r7, #1
  44685. 802e856: d8eb bhi.n 802e830 <snmp_asn1_dec_raw+0x2c>
  44686. /* next octet in same pbuf */
  44687. msg_ptr++;
  44688. }
  44689. }
  44690. /* copy last octet */
  44691. *raw = *msg_ptr;
  44692. 802e858: 782a ldrb r2, [r5, #0]
  44693. 802e85a: 701a strb r2, [r3, #0]
  44694. return ERR_OK;
  44695. 802e85c: 2000 movs r0, #0
  44696. 802e85e: e006 b.n 802e86e <snmp_asn1_dec_raw+0x6a>
  44697. {
  44698. /* raw_len < len, not enough dst space */
  44699. return ERR_ARG;
  44700. }
  44701. }
  44702. p = p->next;
  44703. 802e860: 6800 ldr r0, [r0, #0]
  44704. {
  44705. plen = 0;
  44706. while (p != NULL)
  44707. {
  44708. base = plen;
  44709. plen += p->len;
  44710. 802e862: 4626 mov r6, r4
  44711. 802e864: e000 b.n 802e868 <snmp_asn1_dec_raw+0x64>
  44712. snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw)
  44713. {
  44714. u16_t plen, base;
  44715. u8_t *msg_ptr;
  44716. if (len > 0)
  44717. 802e866: 2600 movs r6, #0
  44718. {
  44719. plen = 0;
  44720. while (p != NULL)
  44721. 802e868: 2800 cmp r0, #0
  44722. 802e86a: d1cf bne.n 802e80c <snmp_asn1_dec_raw+0x8>
  44723. 802e86c: e7de b.n 802e82c <snmp_asn1_dec_raw+0x28>
  44724. else
  44725. {
  44726. /* len == 0, empty string */
  44727. return ERR_OK;
  44728. }
  44729. }
  44730. 802e86e: b240 sxtb r0, r0
  44731. 802e870: bdf0 pop {r4, r5, r6, r7, pc}
  44732. 0802e872 <snmp_asn1_enc_length_cnt>:
  44733. * @param octets_needed points to the return value
  44734. */
  44735. void
  44736. snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed)
  44737. {
  44738. if (length < 0x80U)
  44739. 802e872: 287f cmp r0, #127 ; 0x7f
  44740. 802e874: d801 bhi.n 802e87a <snmp_asn1_enc_length_cnt+0x8>
  44741. {
  44742. *octets_needed = 1;
  44743. 802e876: 2301 movs r3, #1
  44744. 802e878: e004 b.n 802e884 <snmp_asn1_enc_length_cnt+0x12>
  44745. }
  44746. else if (length < 0x100U)
  44747. 802e87a: 28ff cmp r0, #255 ; 0xff
  44748. 802e87c: d801 bhi.n 802e882 <snmp_asn1_enc_length_cnt+0x10>
  44749. {
  44750. *octets_needed = 2;
  44751. 802e87e: 2302 movs r3, #2
  44752. 802e880: e000 b.n 802e884 <snmp_asn1_enc_length_cnt+0x12>
  44753. }
  44754. else
  44755. {
  44756. *octets_needed = 3;
  44757. 802e882: 2303 movs r3, #3
  44758. 802e884: 700b strb r3, [r1, #0]
  44759. 802e886: 4770 bx lr
  44760. 0802e888 <snmp_asn1_enc_u32t_cnt>:
  44761. * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!
  44762. */
  44763. void
  44764. snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed)
  44765. {
  44766. if (value < 0x80UL)
  44767. 802e888: 287f cmp r0, #127 ; 0x7f
  44768. 802e88a: d801 bhi.n 802e890 <snmp_asn1_enc_u32t_cnt+0x8>
  44769. {
  44770. *octets_needed = 1;
  44771. 802e88c: 2301 movs r3, #1
  44772. 802e88e: e00e b.n 802e8ae <snmp_asn1_enc_u32t_cnt+0x26>
  44773. }
  44774. else if (value < 0x8000UL)
  44775. 802e890: f5b0 4f00 cmp.w r0, #32768 ; 0x8000
  44776. 802e894: d201 bcs.n 802e89a <snmp_asn1_enc_u32t_cnt+0x12>
  44777. {
  44778. *octets_needed = 2;
  44779. 802e896: 2302 movs r3, #2
  44780. 802e898: e009 b.n 802e8ae <snmp_asn1_enc_u32t_cnt+0x26>
  44781. }
  44782. else if (value < 0x800000UL)
  44783. 802e89a: f5b0 0f00 cmp.w r0, #8388608 ; 0x800000
  44784. 802e89e: d201 bcs.n 802e8a4 <snmp_asn1_enc_u32t_cnt+0x1c>
  44785. {
  44786. *octets_needed = 3;
  44787. 802e8a0: 2303 movs r3, #3
  44788. 802e8a2: e004 b.n 802e8ae <snmp_asn1_enc_u32t_cnt+0x26>
  44789. }
  44790. else if (value < 0x80000000UL)
  44791. 802e8a4: 2800 cmp r0, #0
  44792. 802e8a6: db01 blt.n 802e8ac <snmp_asn1_enc_u32t_cnt+0x24>
  44793. {
  44794. *octets_needed = 4;
  44795. 802e8a8: 2304 movs r3, #4
  44796. 802e8aa: e000 b.n 802e8ae <snmp_asn1_enc_u32t_cnt+0x26>
  44797. }
  44798. else
  44799. {
  44800. *octets_needed = 5;
  44801. 802e8ac: 2305 movs r3, #5
  44802. 802e8ae: 800b strh r3, [r1, #0]
  44803. 802e8b0: 4770 bx lr
  44804. 0802e8b2 <snmp_asn1_enc_s32t_cnt>:
  44805. void
  44806. snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed)
  44807. {
  44808. if (value < 0)
  44809. {
  44810. value = ~value;
  44811. 802e8b2: 43c3 mvns r3, r0
  44812. 802e8b4: 4283 cmp r3, r0
  44813. 802e8b6: bfa8 it ge
  44814. 802e8b8: 4618 movge r0, r3
  44815. }
  44816. if (value < 0x80L)
  44817. 802e8ba: 287f cmp r0, #127 ; 0x7f
  44818. 802e8bc: dc01 bgt.n 802e8c2 <snmp_asn1_enc_s32t_cnt+0x10>
  44819. {
  44820. *octets_needed = 1;
  44821. 802e8be: 2301 movs r3, #1
  44822. 802e8c0: e00a b.n 802e8d8 <snmp_asn1_enc_s32t_cnt+0x26>
  44823. }
  44824. else if (value < 0x8000L)
  44825. 802e8c2: f5b0 4f00 cmp.w r0, #32768 ; 0x8000
  44826. 802e8c6: da01 bge.n 802e8cc <snmp_asn1_enc_s32t_cnt+0x1a>
  44827. {
  44828. *octets_needed = 2;
  44829. 802e8c8: 2302 movs r3, #2
  44830. 802e8ca: e005 b.n 802e8d8 <snmp_asn1_enc_s32t_cnt+0x26>
  44831. }
  44832. else if (value < 0x800000L)
  44833. 802e8cc: f5b0 0f00 cmp.w r0, #8388608 ; 0x800000
  44834. 802e8d0: da01 bge.n 802e8d6 <snmp_asn1_enc_s32t_cnt+0x24>
  44835. {
  44836. *octets_needed = 3;
  44837. 802e8d2: 2303 movs r3, #3
  44838. 802e8d4: e000 b.n 802e8d8 <snmp_asn1_enc_s32t_cnt+0x26>
  44839. }
  44840. else
  44841. {
  44842. *octets_needed = 4;
  44843. 802e8d6: 2304 movs r3, #4
  44844. 802e8d8: 800b strh r3, [r1, #0]
  44845. 802e8da: 4770 bx lr
  44846. 0802e8dc <snmp_asn1_enc_oid_cnt>:
  44847. {
  44848. s32_t sub_id;
  44849. u8_t cnt;
  44850. cnt = 0;
  44851. if (ident_len > 1)
  44852. 802e8dc: 2801 cmp r0, #1
  44853. * @param ident points to object identifier array
  44854. * @param octets_needed points to the return value
  44855. */
  44856. void
  44857. snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed)
  44858. {
  44859. 802e8de: b510 push {r4, lr}
  44860. s32_t sub_id;
  44861. u8_t cnt;
  44862. cnt = 0;
  44863. if (ident_len > 1)
  44864. 802e8e0: d904 bls.n 802e8ec <snmp_asn1_enc_oid_cnt+0x10>
  44865. {
  44866. /* compressed prefix in one octet */
  44867. cnt++;
  44868. ident_len -= 2;
  44869. 802e8e2: 3802 subs r0, #2
  44870. 802e8e4: b2c0 uxtb r0, r0
  44871. ident += 2;
  44872. 802e8e6: 3108 adds r1, #8
  44873. cnt = 0;
  44874. if (ident_len > 1)
  44875. {
  44876. /* compressed prefix in one octet */
  44877. cnt++;
  44878. 802e8e8: 2301 movs r3, #1
  44879. 802e8ea: e000 b.n 802e8ee <snmp_asn1_enc_oid_cnt+0x12>
  44880. snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed)
  44881. {
  44882. s32_t sub_id;
  44883. u8_t cnt;
  44884. cnt = 0;
  44885. 802e8ec: 2300 movs r3, #0
  44886. * @param ident_len object identifier array length
  44887. * @param ident points to object identifier array
  44888. * @param octets_needed points to the return value
  44889. */
  44890. void
  44891. snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed)
  44892. 802e8ee: 3904 subs r1, #4
  44893. 802e8f0: e008 b.n 802e904 <snmp_asn1_enc_oid_cnt+0x28>
  44894. ident_len -= 2;
  44895. ident += 2;
  44896. }
  44897. while(ident_len > 0)
  44898. {
  44899. ident_len--;
  44900. 802e8f2: 3801 subs r0, #1
  44901. sub_id = *ident;
  44902. 802e8f4: f851 4f04 ldr.w r4, [r1, #4]!
  44903. ident_len -= 2;
  44904. ident += 2;
  44905. }
  44906. while(ident_len > 0)
  44907. {
  44908. ident_len--;
  44909. 802e8f8: b2c0 uxtb r0, r0
  44910. sub_id >>= 7;
  44911. cnt++;
  44912. while(sub_id > 0)
  44913. {
  44914. sub_id >>= 7;
  44915. 802e8fa: 11e4 asrs r4, r4, #7
  44916. cnt++;
  44917. 802e8fc: 3301 adds r3, #1
  44918. ident_len--;
  44919. sub_id = *ident;
  44920. sub_id >>= 7;
  44921. cnt++;
  44922. while(sub_id > 0)
  44923. 802e8fe: 2c00 cmp r4, #0
  44924. {
  44925. sub_id >>= 7;
  44926. cnt++;
  44927. 802e900: b2db uxtb r3, r3
  44928. ident_len--;
  44929. sub_id = *ident;
  44930. sub_id >>= 7;
  44931. cnt++;
  44932. while(sub_id > 0)
  44933. 802e902: dcfa bgt.n 802e8fa <snmp_asn1_enc_oid_cnt+0x1e>
  44934. /* compressed prefix in one octet */
  44935. cnt++;
  44936. ident_len -= 2;
  44937. ident += 2;
  44938. }
  44939. while(ident_len > 0)
  44940. 802e904: 2800 cmp r0, #0
  44941. 802e906: d1f4 bne.n 802e8f2 <snmp_asn1_enc_oid_cnt+0x16>
  44942. sub_id >>= 7;
  44943. cnt++;
  44944. }
  44945. ident++;
  44946. }
  44947. *octets_needed = cnt;
  44948. 802e908: 8013 strh r3, [r2, #0]
  44949. 802e90a: bd10 pop {r4, pc}
  44950. 0802e90c <snmp_asn1_enc_type>:
  44951. * @param type input ASN1 type
  44952. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  44953. */
  44954. err_t
  44955. snmp_asn1_enc_type(struct pbuf *p, u16_t ofs, u8_t type)
  44956. {
  44957. 802e90c: b510 push {r4, lr}
  44958. u16_t plen, base;
  44959. u8_t *msg_ptr;
  44960. plen = 0;
  44961. 802e90e: 2300 movs r3, #0
  44962. while (p != NULL)
  44963. 802e910: e00b b.n 802e92a <snmp_asn1_enc_type+0x1e>
  44964. {
  44965. base = plen;
  44966. plen += p->len;
  44967. 802e912: 8944 ldrh r4, [r0, #10]
  44968. 802e914: 191c adds r4, r3, r4
  44969. 802e916: b2a4 uxth r4, r4
  44970. if (ofs < plen)
  44971. 802e918: 42a1 cmp r1, r4
  44972. 802e91a: d204 bcs.n 802e926 <snmp_asn1_enc_type+0x1a>
  44973. {
  44974. msg_ptr = (u8_t*)p->payload;
  44975. 802e91c: 6840 ldr r0, [r0, #4]
  44976. msg_ptr += ofs - base;
  44977. 802e91e: 1acb subs r3, r1, r3
  44978. *msg_ptr = type;
  44979. 802e920: 54c2 strb r2, [r0, r3]
  44980. return ERR_OK;
  44981. 802e922: 2000 movs r0, #0
  44982. 802e924: e004 b.n 802e930 <snmp_asn1_enc_type+0x24>
  44983. }
  44984. p = p->next;
  44985. 802e926: 6800 ldr r0, [r0, #0]
  44986. plen = 0;
  44987. while (p != NULL)
  44988. {
  44989. base = plen;
  44990. plen += p->len;
  44991. 802e928: 4623 mov r3, r4
  44992. {
  44993. u16_t plen, base;
  44994. u8_t *msg_ptr;
  44995. plen = 0;
  44996. while (p != NULL)
  44997. 802e92a: 2800 cmp r0, #0
  44998. 802e92c: d1f1 bne.n 802e912 <snmp_asn1_enc_type+0x6>
  44999. return ERR_OK;
  45000. }
  45001. p = p->next;
  45002. }
  45003. /* p == NULL, ofs >= plen */
  45004. return ERR_ARG;
  45005. 802e92e: 20f2 movs r0, #242 ; 0xf2
  45006. }
  45007. 802e930: b240 sxtb r0, r0
  45008. 802e932: bd10 pop {r4, pc}
  45009. 0802e934 <snmp_asn1_enc_length>:
  45010. * @param length is the host order length to be encoded
  45011. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  45012. */
  45013. err_t
  45014. snmp_asn1_enc_length(struct pbuf *p, u16_t ofs, u16_t length)
  45015. {
  45016. 802e934: b5f0 push {r4, r5, r6, r7, lr}
  45017. u16_t plen, base;
  45018. u8_t *msg_ptr;
  45019. plen = 0;
  45020. 802e936: 2400 movs r4, #0
  45021. while (p != NULL)
  45022. 802e938: e03f b.n 802e9ba <snmp_asn1_enc_length+0x86>
  45023. {
  45024. base = plen;
  45025. plen += p->len;
  45026. 802e93a: 8943 ldrh r3, [r0, #10]
  45027. 802e93c: 18e3 adds r3, r4, r3
  45028. 802e93e: b29b uxth r3, r3
  45029. if (ofs < plen)
  45030. 802e940: 4299 cmp r1, r3
  45031. 802e942: d238 bcs.n 802e9b6 <snmp_asn1_enc_length+0x82>
  45032. {
  45033. msg_ptr = (u8_t*)p->payload;
  45034. 802e944: 6845 ldr r5, [r0, #4]
  45035. msg_ptr += ofs - base;
  45036. 802e946: 1b0c subs r4, r1, r4
  45037. if (length < 0x80)
  45038. 802e948: 2a7f cmp r2, #127 ; 0x7f
  45039. base = plen;
  45040. plen += p->len;
  45041. if (ofs < plen)
  45042. {
  45043. msg_ptr = (u8_t*)p->payload;
  45044. msg_ptr += ofs - base;
  45045. 802e94a: eb05 0604 add.w r6, r5, r4
  45046. if (length < 0x80)
  45047. 802e94e: d801 bhi.n 802e954 <snmp_asn1_enc_length+0x20>
  45048. {
  45049. *msg_ptr = (u8_t)length;
  45050. 802e950: 552a strb r2, [r5, r4]
  45051. 802e952: e02e b.n 802e9b2 <snmp_asn1_enc_length+0x7e>
  45052. return ERR_OK;
  45053. }
  45054. else if (length < 0x100)
  45055. 802e954: 2aff cmp r2, #255 ; 0xff
  45056. 802e956: f101 0701 add.w r7, r1, #1
  45057. 802e95a: d80d bhi.n 802e978 <snmp_asn1_enc_length+0x44>
  45058. {
  45059. *msg_ptr = 0x81;
  45060. ofs += 1;
  45061. if (ofs >= plen)
  45062. 802e95c: b2bf uxth r7, r7
  45063. *msg_ptr = (u8_t)length;
  45064. return ERR_OK;
  45065. }
  45066. else if (length < 0x100)
  45067. {
  45068. *msg_ptr = 0x81;
  45069. 802e95e: 2181 movs r1, #129 ; 0x81
  45070. ofs += 1;
  45071. if (ofs >= plen)
  45072. 802e960: 429f cmp r7, r3
  45073. *msg_ptr = (u8_t)length;
  45074. return ERR_OK;
  45075. }
  45076. else if (length < 0x100)
  45077. {
  45078. *msg_ptr = 0x81;
  45079. 802e962: 5529 strb r1, [r5, r4]
  45080. ofs += 1;
  45081. if (ofs >= plen)
  45082. 802e964: d305 bcc.n 802e972 <snmp_asn1_enc_length+0x3e>
  45083. {
  45084. /* next octet in next pbuf */
  45085. p = p->next;
  45086. 802e966: 6803 ldr r3, [r0, #0]
  45087. if (p == NULL) { return ERR_ARG; }
  45088. 802e968: b90b cbnz r3, 802e96e <snmp_asn1_enc_length+0x3a>
  45089. 802e96a: 20f2 movs r0, #242 ; 0xf2
  45090. 802e96c: e028 b.n 802e9c0 <snmp_asn1_enc_length+0x8c>
  45091. msg_ptr = (u8_t*)p->payload;
  45092. 802e96e: 685e ldr r6, [r3, #4]
  45093. 802e970: e000 b.n 802e974 <snmp_asn1_enc_length+0x40>
  45094. }
  45095. else
  45096. {
  45097. /* next octet in same pbuf */
  45098. msg_ptr++;
  45099. 802e972: 3601 adds r6, #1
  45100. }
  45101. *msg_ptr = (u8_t)length;
  45102. 802e974: 7032 strb r2, [r6, #0]
  45103. 802e976: e01c b.n 802e9b2 <snmp_asn1_enc_length+0x7e>
  45104. i = 2;
  45105. while (i > 0)
  45106. {
  45107. i--;
  45108. ofs += 1;
  45109. if (ofs >= plen)
  45110. 802e978: b2bf uxth r7, r7
  45111. else
  45112. {
  45113. u8_t i;
  45114. /* length >= 0x100 && length <= 0xFFFF */
  45115. *msg_ptr = 0x82;
  45116. 802e97a: f04f 0c82 mov.w ip, #130 ; 0x82
  45117. i = 2;
  45118. while (i > 0)
  45119. {
  45120. i--;
  45121. ofs += 1;
  45122. if (ofs >= plen)
  45123. 802e97e: 429f cmp r7, r3
  45124. else
  45125. {
  45126. u8_t i;
  45127. /* length >= 0x100 && length <= 0xFFFF */
  45128. *msg_ptr = 0x82;
  45129. 802e980: f805 c004 strb.w ip, [r5, r4]
  45130. i = 2;
  45131. while (i > 0)
  45132. {
  45133. i--;
  45134. ofs += 1;
  45135. if (ofs >= plen)
  45136. 802e984: d201 bcs.n 802e98a <snmp_asn1_enc_length+0x56>
  45137. plen += p->len;
  45138. }
  45139. else
  45140. {
  45141. /* next octet in same pbuf */
  45142. msg_ptr++;
  45143. 802e986: 1c74 adds r4, r6, #1
  45144. 802e988: e006 b.n 802e998 <snmp_asn1_enc_length+0x64>
  45145. i--;
  45146. ofs += 1;
  45147. if (ofs >= plen)
  45148. {
  45149. /* next octet in next pbuf */
  45150. p = p->next;
  45151. 802e98a: 6800 ldr r0, [r0, #0]
  45152. if (p == NULL) { return ERR_ARG; }
  45153. 802e98c: 2800 cmp r0, #0
  45154. 802e98e: d0ec beq.n 802e96a <snmp_asn1_enc_length+0x36>
  45155. msg_ptr = (u8_t*)p->payload;
  45156. plen += p->len;
  45157. 802e990: 8945 ldrh r5, [r0, #10]
  45158. if (ofs >= plen)
  45159. {
  45160. /* next octet in next pbuf */
  45161. p = p->next;
  45162. if (p == NULL) { return ERR_ARG; }
  45163. msg_ptr = (u8_t*)p->payload;
  45164. 802e992: 6844 ldr r4, [r0, #4]
  45165. plen += p->len;
  45166. 802e994: 195b adds r3, r3, r5
  45167. 802e996: b29b uxth r3, r3
  45168. *msg_ptr = 0x82;
  45169. i = 2;
  45170. while (i > 0)
  45171. {
  45172. i--;
  45173. ofs += 1;
  45174. 802e998: 3102 adds r1, #2
  45175. if (ofs >= plen)
  45176. 802e99a: b289 uxth r1, r1
  45177. *msg_ptr = (u8_t)length;
  45178. }
  45179. else
  45180. {
  45181. /* most significant length octet */
  45182. *msg_ptr = (u8_t)(length >> 8);
  45183. 802e99c: 0a15 lsrs r5, r2, #8
  45184. i = 2;
  45185. while (i > 0)
  45186. {
  45187. i--;
  45188. ofs += 1;
  45189. if (ofs >= plen)
  45190. 802e99e: 4299 cmp r1, r3
  45191. *msg_ptr = (u8_t)length;
  45192. }
  45193. else
  45194. {
  45195. /* most significant length octet */
  45196. *msg_ptr = (u8_t)(length >> 8);
  45197. 802e9a0: 7025 strb r5, [r4, #0]
  45198. i = 2;
  45199. while (i > 0)
  45200. {
  45201. i--;
  45202. ofs += 1;
  45203. if (ofs >= plen)
  45204. 802e9a2: d201 bcs.n 802e9a8 <snmp_asn1_enc_length+0x74>
  45205. plen += p->len;
  45206. }
  45207. else
  45208. {
  45209. /* next octet in same pbuf */
  45210. msg_ptr++;
  45211. 802e9a4: 3401 adds r4, #1
  45212. 802e9a6: e003 b.n 802e9b0 <snmp_asn1_enc_length+0x7c>
  45213. i--;
  45214. ofs += 1;
  45215. if (ofs >= plen)
  45216. {
  45217. /* next octet in next pbuf */
  45218. p = p->next;
  45219. 802e9a8: 6803 ldr r3, [r0, #0]
  45220. if (p == NULL) { return ERR_ARG; }
  45221. 802e9aa: 2b00 cmp r3, #0
  45222. 802e9ac: d0dd beq.n 802e96a <snmp_asn1_enc_length+0x36>
  45223. msg_ptr = (u8_t*)p->payload;
  45224. 802e9ae: 685c ldr r4, [r3, #4]
  45225. msg_ptr++;
  45226. }
  45227. if (i == 0)
  45228. {
  45229. /* least significant length octet */
  45230. *msg_ptr = (u8_t)length;
  45231. 802e9b0: 7022 strb r2, [r4, #0]
  45232. {
  45233. /* most significant length octet */
  45234. *msg_ptr = (u8_t)(length >> 8);
  45235. }
  45236. }
  45237. return ERR_OK;
  45238. 802e9b2: 2000 movs r0, #0
  45239. 802e9b4: e004 b.n 802e9c0 <snmp_asn1_enc_length+0x8c>
  45240. }
  45241. }
  45242. p = p->next;
  45243. 802e9b6: 6800 ldr r0, [r0, #0]
  45244. plen = 0;
  45245. while (p != NULL)
  45246. {
  45247. base = plen;
  45248. plen += p->len;
  45249. 802e9b8: 461c mov r4, r3
  45250. {
  45251. u16_t plen, base;
  45252. u8_t *msg_ptr;
  45253. plen = 0;
  45254. while (p != NULL)
  45255. 802e9ba: 2800 cmp r0, #0
  45256. 802e9bc: d1bd bne.n 802e93a <snmp_asn1_enc_length+0x6>
  45257. 802e9be: e7d4 b.n 802e96a <snmp_asn1_enc_length+0x36>
  45258. }
  45259. p = p->next;
  45260. }
  45261. /* p == NULL, ofs >= plen */
  45262. return ERR_ARG;
  45263. }
  45264. 802e9c0: b240 sxtb r0, r0
  45265. 802e9c2: bdf0 pop {r4, r5, r6, r7, pc}
  45266. 0802e9c4 <snmp_asn1_enc_u32t>:
  45267. *
  45268. * @see snmp_asn1_enc_u32t_cnt()
  45269. */
  45270. err_t
  45271. snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value)
  45272. {
  45273. 802e9c4: b5f0 push {r4, r5, r6, r7, lr}
  45274. u16_t plen, base;
  45275. u8_t *msg_ptr;
  45276. plen = 0;
  45277. 802e9c6: 2500 movs r5, #0
  45278. while (p != NULL)
  45279. 802e9c8: e037 b.n 802ea3a <snmp_asn1_enc_u32t+0x76>
  45280. {
  45281. base = plen;
  45282. plen += p->len;
  45283. 802e9ca: 8944 ldrh r4, [r0, #10]
  45284. 802e9cc: 192c adds r4, r5, r4
  45285. 802e9ce: b2a4 uxth r4, r4
  45286. if (ofs < plen)
  45287. 802e9d0: 42a1 cmp r1, r4
  45288. 802e9d2: d230 bcs.n 802ea36 <snmp_asn1_enc_u32t+0x72>
  45289. {
  45290. msg_ptr = (u8_t*)p->payload;
  45291. 802e9d4: 6847 ldr r7, [r0, #4]
  45292. msg_ptr += ofs - base;
  45293. 802e9d6: 1b4e subs r6, r1, r5
  45294. if (octets_needed == 5)
  45295. 802e9d8: 2a05 cmp r2, #5
  45296. base = plen;
  45297. plen += p->len;
  45298. if (ofs < plen)
  45299. {
  45300. msg_ptr = (u8_t*)p->payload;
  45301. msg_ptr += ofs - base;
  45302. 802e9da: eb07 0506 add.w r5, r7, r6
  45303. if (octets_needed == 5)
  45304. 802e9de: d110 bne.n 802ea02 <snmp_asn1_enc_u32t+0x3e>
  45305. {
  45306. /* not enough bits in 'value' add leading 0x00 */
  45307. octets_needed--;
  45308. *msg_ptr = 0x00;
  45309. ofs += 1;
  45310. 802e9e0: 3101 adds r1, #1
  45311. 802e9e2: b289 uxth r1, r1
  45312. if (octets_needed == 5)
  45313. {
  45314. /* not enough bits in 'value' add leading 0x00 */
  45315. octets_needed--;
  45316. *msg_ptr = 0x00;
  45317. 802e9e4: 2200 movs r2, #0
  45318. ofs += 1;
  45319. if (ofs >= plen)
  45320. 802e9e6: 42a1 cmp r1, r4
  45321. if (octets_needed == 5)
  45322. {
  45323. /* not enough bits in 'value' add leading 0x00 */
  45324. octets_needed--;
  45325. *msg_ptr = 0x00;
  45326. 802e9e8: 55ba strb r2, [r7, r6]
  45327. ofs += 1;
  45328. if (ofs >= plen)
  45329. 802e9ea: d308 bcc.n 802e9fe <snmp_asn1_enc_u32t+0x3a>
  45330. {
  45331. /* next octet in next pbuf */
  45332. p = p->next;
  45333. 802e9ec: 6800 ldr r0, [r0, #0]
  45334. if (p == NULL) { return ERR_ARG; }
  45335. 802e9ee: b908 cbnz r0, 802e9f4 <snmp_asn1_enc_u32t+0x30>
  45336. 802e9f0: 20f2 movs r0, #242 ; 0xf2
  45337. 802e9f2: e025 b.n 802ea40 <snmp_asn1_enc_u32t+0x7c>
  45338. msg_ptr = (u8_t*)p->payload;
  45339. plen += p->len;
  45340. 802e9f4: 8942 ldrh r2, [r0, #10]
  45341. if (ofs >= plen)
  45342. {
  45343. /* next octet in next pbuf */
  45344. p = p->next;
  45345. if (p == NULL) { return ERR_ARG; }
  45346. msg_ptr = (u8_t*)p->payload;
  45347. 802e9f6: 6845 ldr r5, [r0, #4]
  45348. plen += p->len;
  45349. 802e9f8: 18a4 adds r4, r4, r2
  45350. 802e9fa: b2a4 uxth r4, r4
  45351. 802e9fc: e000 b.n 802ea00 <snmp_asn1_enc_u32t+0x3c>
  45352. }
  45353. else
  45354. {
  45355. /* next octet in same pbuf */
  45356. msg_ptr++;
  45357. 802e9fe: 3501 adds r5, #1
  45358. msg_ptr += ofs - base;
  45359. if (octets_needed == 5)
  45360. {
  45361. /* not enough bits in 'value' add leading 0x00 */
  45362. octets_needed--;
  45363. 802ea00: 2204 movs r2, #4
  45364. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  45365. *
  45366. * @see snmp_asn1_enc_u32t_cnt()
  45367. */
  45368. err_t
  45369. snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value)
  45370. 802ea02: 1851 adds r1, r2, r1
  45371. 802ea04: e012 b.n 802ea2c <snmp_asn1_enc_u32t+0x68>
  45372. msg_ptr++;
  45373. }
  45374. }
  45375. while (octets_needed > 1)
  45376. {
  45377. octets_needed--;
  45378. 802ea06: 3a01 subs r2, #1
  45379. 802ea08: b292 uxth r2, r2
  45380. *msg_ptr = (u8_t)(value >> (octets_needed << 3));
  45381. 802ea0a: 00d6 lsls r6, r2, #3
  45382. 802ea0c: fa23 f606 lsr.w r6, r3, r6
  45383. 802ea10: 702e strb r6, [r5, #0]
  45384. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  45385. *
  45386. * @see snmp_asn1_enc_u32t_cnt()
  45387. */
  45388. err_t
  45389. snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value)
  45390. 802ea12: 1a8e subs r6, r1, r2
  45391. while (octets_needed > 1)
  45392. {
  45393. octets_needed--;
  45394. *msg_ptr = (u8_t)(value >> (octets_needed << 3));
  45395. ofs += 1;
  45396. if (ofs >= plen)
  45397. 802ea14: b2b6 uxth r6, r6
  45398. 802ea16: 42a6 cmp r6, r4
  45399. 802ea18: d307 bcc.n 802ea2a <snmp_asn1_enc_u32t+0x66>
  45400. {
  45401. /* next octet in next pbuf */
  45402. p = p->next;
  45403. 802ea1a: 6800 ldr r0, [r0, #0]
  45404. if (p == NULL) { return ERR_ARG; }
  45405. 802ea1c: 2800 cmp r0, #0
  45406. 802ea1e: d0e7 beq.n 802e9f0 <snmp_asn1_enc_u32t+0x2c>
  45407. msg_ptr = (u8_t*)p->payload;
  45408. plen += p->len;
  45409. 802ea20: 8946 ldrh r6, [r0, #10]
  45410. if (ofs >= plen)
  45411. {
  45412. /* next octet in next pbuf */
  45413. p = p->next;
  45414. if (p == NULL) { return ERR_ARG; }
  45415. msg_ptr = (u8_t*)p->payload;
  45416. 802ea22: 6845 ldr r5, [r0, #4]
  45417. plen += p->len;
  45418. 802ea24: 19a4 adds r4, r4, r6
  45419. 802ea26: b2a4 uxth r4, r4
  45420. 802ea28: e000 b.n 802ea2c <snmp_asn1_enc_u32t+0x68>
  45421. }
  45422. else
  45423. {
  45424. /* next octet in same pbuf */
  45425. msg_ptr++;
  45426. 802ea2a: 3501 adds r5, #1
  45427. {
  45428. /* next octet in same pbuf */
  45429. msg_ptr++;
  45430. }
  45431. }
  45432. while (octets_needed > 1)
  45433. 802ea2c: 2a01 cmp r2, #1
  45434. 802ea2e: d8ea bhi.n 802ea06 <snmp_asn1_enc_u32t+0x42>
  45435. /* next octet in same pbuf */
  45436. msg_ptr++;
  45437. }
  45438. }
  45439. /* (only) one least significant octet */
  45440. *msg_ptr = (u8_t)value;
  45441. 802ea30: 702b strb r3, [r5, #0]
  45442. return ERR_OK;
  45443. 802ea32: 2000 movs r0, #0
  45444. 802ea34: e004 b.n 802ea40 <snmp_asn1_enc_u32t+0x7c>
  45445. }
  45446. p = p->next;
  45447. 802ea36: 6800 ldr r0, [r0, #0]
  45448. plen = 0;
  45449. while (p != NULL)
  45450. {
  45451. base = plen;
  45452. plen += p->len;
  45453. 802ea38: 4625 mov r5, r4
  45454. {
  45455. u16_t plen, base;
  45456. u8_t *msg_ptr;
  45457. plen = 0;
  45458. while (p != NULL)
  45459. 802ea3a: 2800 cmp r0, #0
  45460. 802ea3c: d1c5 bne.n 802e9ca <snmp_asn1_enc_u32t+0x6>
  45461. 802ea3e: e7d7 b.n 802e9f0 <snmp_asn1_enc_u32t+0x2c>
  45462. }
  45463. p = p->next;
  45464. }
  45465. /* p == NULL, ofs >= plen */
  45466. return ERR_ARG;
  45467. }
  45468. 802ea40: b240 sxtb r0, r0
  45469. 802ea42: bdf0 pop {r4, r5, r6, r7, pc}
  45470. 0802ea44 <snmp_asn1_enc_s32t>:
  45471. *
  45472. * @see snmp_asn1_enc_s32t_cnt()
  45473. */
  45474. err_t
  45475. snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value)
  45476. {
  45477. 802ea44: b5f0 push {r4, r5, r6, r7, lr}
  45478. u16_t plen, base;
  45479. u8_t *msg_ptr;
  45480. plen = 0;
  45481. 802ea46: 2600 movs r6, #0
  45482. while (p != NULL)
  45483. 802ea48: e024 b.n 802ea94 <snmp_asn1_enc_s32t+0x50>
  45484. {
  45485. base = plen;
  45486. plen += p->len;
  45487. 802ea4a: 8944 ldrh r4, [r0, #10]
  45488. 802ea4c: 1934 adds r4, r6, r4
  45489. 802ea4e: b2a4 uxth r4, r4
  45490. if (ofs < plen)
  45491. 802ea50: 42a1 cmp r1, r4
  45492. 802ea52: d21d bcs.n 802ea90 <snmp_asn1_enc_s32t+0x4c>
  45493. {
  45494. msg_ptr = (u8_t*)p->payload;
  45495. 802ea54: 6847 ldr r7, [r0, #4]
  45496. msg_ptr += ofs - base;
  45497. 802ea56: 1b8d subs r5, r1, r6
  45498. 802ea58: 197d adds r5, r7, r5
  45499. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  45500. *
  45501. * @see snmp_asn1_enc_s32t_cnt()
  45502. */
  45503. err_t
  45504. snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value)
  45505. 802ea5a: 1851 adds r1, r2, r1
  45506. if (ofs < plen)
  45507. {
  45508. msg_ptr = (u8_t*)p->payload;
  45509. msg_ptr += ofs - base;
  45510. while (octets_needed > 1)
  45511. 802ea5c: e013 b.n 802ea86 <snmp_asn1_enc_s32t+0x42>
  45512. {
  45513. octets_needed--;
  45514. 802ea5e: 3a01 subs r2, #1
  45515. 802ea60: b292 uxth r2, r2
  45516. *msg_ptr = (u8_t)(value >> (octets_needed << 3));
  45517. 802ea62: 00d6 lsls r6, r2, #3
  45518. 802ea64: fa43 f606 asr.w r6, r3, r6
  45519. 802ea68: 702e strb r6, [r5, #0]
  45520. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  45521. *
  45522. * @see snmp_asn1_enc_s32t_cnt()
  45523. */
  45524. err_t
  45525. snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value)
  45526. 802ea6a: 1a8e subs r6, r1, r2
  45527. while (octets_needed > 1)
  45528. {
  45529. octets_needed--;
  45530. *msg_ptr = (u8_t)(value >> (octets_needed << 3));
  45531. ofs += 1;
  45532. if (ofs >= plen)
  45533. 802ea6c: b2b6 uxth r6, r6
  45534. 802ea6e: 42a6 cmp r6, r4
  45535. 802ea70: d308 bcc.n 802ea84 <snmp_asn1_enc_s32t+0x40>
  45536. {
  45537. /* next octet in next pbuf */
  45538. p = p->next;
  45539. 802ea72: 6800 ldr r0, [r0, #0]
  45540. if (p == NULL) { return ERR_ARG; }
  45541. 802ea74: b908 cbnz r0, 802ea7a <snmp_asn1_enc_s32t+0x36>
  45542. 802ea76: 20f2 movs r0, #242 ; 0xf2
  45543. 802ea78: e00f b.n 802ea9a <snmp_asn1_enc_s32t+0x56>
  45544. msg_ptr = (u8_t*)p->payload;
  45545. plen += p->len;
  45546. 802ea7a: 8946 ldrh r6, [r0, #10]
  45547. if (ofs >= plen)
  45548. {
  45549. /* next octet in next pbuf */
  45550. p = p->next;
  45551. if (p == NULL) { return ERR_ARG; }
  45552. msg_ptr = (u8_t*)p->payload;
  45553. 802ea7c: 6845 ldr r5, [r0, #4]
  45554. plen += p->len;
  45555. 802ea7e: 19a4 adds r4, r4, r6
  45556. 802ea80: b2a4 uxth r4, r4
  45557. 802ea82: e000 b.n 802ea86 <snmp_asn1_enc_s32t+0x42>
  45558. }
  45559. else
  45560. {
  45561. /* next octet in same pbuf */
  45562. msg_ptr++;
  45563. 802ea84: 3501 adds r5, #1
  45564. if (ofs < plen)
  45565. {
  45566. msg_ptr = (u8_t*)p->payload;
  45567. msg_ptr += ofs - base;
  45568. while (octets_needed > 1)
  45569. 802ea86: 2a01 cmp r2, #1
  45570. 802ea88: d8e9 bhi.n 802ea5e <snmp_asn1_enc_s32t+0x1a>
  45571. /* next octet in same pbuf */
  45572. msg_ptr++;
  45573. }
  45574. }
  45575. /* (only) one least significant octet */
  45576. *msg_ptr = (u8_t)value;
  45577. 802ea8a: 702b strb r3, [r5, #0]
  45578. return ERR_OK;
  45579. 802ea8c: 2000 movs r0, #0
  45580. 802ea8e: e004 b.n 802ea9a <snmp_asn1_enc_s32t+0x56>
  45581. }
  45582. p = p->next;
  45583. 802ea90: 6800 ldr r0, [r0, #0]
  45584. plen = 0;
  45585. while (p != NULL)
  45586. {
  45587. base = plen;
  45588. plen += p->len;
  45589. 802ea92: 4626 mov r6, r4
  45590. {
  45591. u16_t plen, base;
  45592. u8_t *msg_ptr;
  45593. plen = 0;
  45594. while (p != NULL)
  45595. 802ea94: 2800 cmp r0, #0
  45596. 802ea96: d1d8 bne.n 802ea4a <snmp_asn1_enc_s32t+0x6>
  45597. 802ea98: e7ed b.n 802ea76 <snmp_asn1_enc_s32t+0x32>
  45598. }
  45599. p = p->next;
  45600. }
  45601. /* p == NULL, ofs >= plen */
  45602. return ERR_ARG;
  45603. }
  45604. 802ea9a: b240 sxtb r0, r0
  45605. 802ea9c: bdf0 pop {r4, r5, r6, r7, pc}
  45606. 0802ea9e <snmp_asn1_enc_oid>:
  45607. * @param ident points to object identifier array
  45608. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  45609. */
  45610. err_t
  45611. snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident)
  45612. {
  45613. 802ea9e: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  45614. u16_t plen, base;
  45615. u8_t *msg_ptr;
  45616. plen = 0;
  45617. 802eaa2: 2500 movs r5, #0
  45618. while (p != NULL)
  45619. 802eaa4: e068 b.n 802eb78 <snmp_asn1_enc_oid+0xda>
  45620. {
  45621. base = plen;
  45622. plen += p->len;
  45623. 802eaa6: 8944 ldrh r4, [r0, #10]
  45624. 802eaa8: 192c adds r4, r5, r4
  45625. 802eaaa: b2a4 uxth r4, r4
  45626. if (ofs < plen)
  45627. 802eaac: 42a1 cmp r1, r4
  45628. 802eaae: d261 bcs.n 802eb74 <snmp_asn1_enc_oid+0xd6>
  45629. {
  45630. msg_ptr = (u8_t*)p->payload;
  45631. 802eab0: 6846 ldr r6, [r0, #4]
  45632. msg_ptr += ofs - base;
  45633. 802eab2: 1b4d subs r5, r1, r5
  45634. if (ident_len > 1)
  45635. 802eab4: 2a01 cmp r2, #1
  45636. base = plen;
  45637. plen += p->len;
  45638. if (ofs < plen)
  45639. {
  45640. msg_ptr = (u8_t*)p->payload;
  45641. msg_ptr += ofs - base;
  45642. 802eab6: eb06 0805 add.w r8, r6, r5
  45643. if (ident_len > 1)
  45644. 802eaba: d801 bhi.n 802eac0 <snmp_asn1_enc_oid+0x22>
  45645. }
  45646. else
  45647. {
  45648. /* @bug: allow empty varbinds for symmetry (we must decode them for getnext), allow partial compression?? */
  45649. /* ident_len <= 1, at least we need zeroDotZero (0.0) (ident_len == 2) */
  45650. return ERR_ARG;
  45651. 802eabc: 20f2 movs r0, #242 ; 0xf2
  45652. 802eabe: e05e b.n 802eb7e <snmp_asn1_enc_oid+0xe0>
  45653. msg_ptr = (u8_t*)p->payload;
  45654. msg_ptr += ofs - base;
  45655. if (ident_len > 1)
  45656. {
  45657. if ((ident[0] == 1) && (ident[1] == 3))
  45658. 802eac0: f8d3 c000 ldr.w ip, [r3]
  45659. 802eac4: f1bc 0f01 cmp.w ip, #1
  45660. 802eac8: d105 bne.n 802ead6 <snmp_asn1_enc_oid+0x38>
  45661. 802eaca: 685f ldr r7, [r3, #4]
  45662. 802eacc: 2f03 cmp r7, #3
  45663. 802eace: d102 bne.n 802ead6 <snmp_asn1_enc_oid+0x38>
  45664. {
  45665. /* compressed (most common) prefix .iso.org */
  45666. *msg_ptr = 0x2b;
  45667. 802ead0: 272b movs r7, #43 ; 0x2b
  45668. 802ead2: 5577 strb r7, [r6, r5]
  45669. 802ead4: e006 b.n 802eae4 <snmp_asn1_enc_oid+0x46>
  45670. }
  45671. else
  45672. {
  45673. /* calculate prefix */
  45674. *msg_ptr = (u8_t)((ident[0] * 40) + ident[1]);
  45675. 802ead6: 685f ldr r7, [r3, #4]
  45676. 802ead8: f04f 0928 mov.w r9, #40 ; 0x28
  45677. 802eadc: fb09 7c0c mla ip, r9, ip, r7
  45678. 802eae0: f806 c005 strb.w ip, [r6, r5]
  45679. }
  45680. ofs += 1;
  45681. 802eae4: 3101 adds r1, #1
  45682. 802eae6: b289 uxth r1, r1
  45683. if (ofs >= plen)
  45684. 802eae8: 42a1 cmp r1, r4
  45685. 802eaea: d307 bcc.n 802eafc <snmp_asn1_enc_oid+0x5e>
  45686. {
  45687. /* next octet in next pbuf */
  45688. p = p->next;
  45689. 802eaec: 6800 ldr r0, [r0, #0]
  45690. if (p == NULL) { return ERR_ARG; }
  45691. 802eaee: 2800 cmp r0, #0
  45692. 802eaf0: d0e4 beq.n 802eabc <snmp_asn1_enc_oid+0x1e>
  45693. msg_ptr = (u8_t*)p->payload;
  45694. plen += p->len;
  45695. 802eaf2: 8946 ldrh r6, [r0, #10]
  45696. if (ofs >= plen)
  45697. {
  45698. /* next octet in next pbuf */
  45699. p = p->next;
  45700. if (p == NULL) { return ERR_ARG; }
  45701. msg_ptr = (u8_t*)p->payload;
  45702. 802eaf4: 6845 ldr r5, [r0, #4]
  45703. plen += p->len;
  45704. 802eaf6: 19a4 adds r4, r4, r6
  45705. 802eaf8: b2a4 uxth r4, r4
  45706. 802eafa: e001 b.n 802eb00 <snmp_asn1_enc_oid+0x62>
  45707. }
  45708. else
  45709. {
  45710. /* next octet in same pbuf */
  45711. msg_ptr++;
  45712. 802eafc: f108 0501 add.w r5, r8, #1
  45713. }
  45714. ident_len -= 2;
  45715. 802eb00: 3a02 subs r2, #2
  45716. 802eb02: b2d2 uxtb r2, r2
  45717. * @param ident_len object identifier array length
  45718. * @param ident points to object identifier array
  45719. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  45720. */
  45721. err_t
  45722. snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident)
  45723. 802eb04: 3304 adds r3, #4
  45724. {
  45725. /* @bug: allow empty varbinds for symmetry (we must decode them for getnext), allow partial compression?? */
  45726. /* ident_len <= 1, at least we need zeroDotZero (0.0) (ident_len == 2) */
  45727. return ERR_ARG;
  45728. }
  45729. while (ident_len > 0)
  45730. 802eb06: e031 b.n 802eb6c <snmp_asn1_enc_oid+0xce>
  45731. {
  45732. s32_t sub_id;
  45733. u8_t shift, tail;
  45734. ident_len--;
  45735. 802eb08: 3a01 subs r2, #1
  45736. sub_id = *ident;
  45737. 802eb0a: f853 cf04 ldr.w ip, [r3, #4]!
  45738. while (ident_len > 0)
  45739. {
  45740. s32_t sub_id;
  45741. u8_t shift, tail;
  45742. ident_len--;
  45743. 802eb0e: b2d2 uxtb r2, r2
  45744. sub_id = *ident;
  45745. 802eb10: 261c movs r6, #28
  45746. tail = 0;
  45747. 802eb12: 2700 movs r7, #0
  45748. shift = 28;
  45749. while(shift > 0)
  45750. {
  45751. u8_t code;
  45752. code = (u8_t)(sub_id >> shift);
  45753. 802eb14: fa4c f806 asr.w r8, ip, r6
  45754. if ((code != 0) || (tail != 0))
  45755. 802eb18: f018 0fff tst.w r8, #255 ; 0xff
  45756. 802eb1c: d100 bne.n 802eb20 <snmp_asn1_enc_oid+0x82>
  45757. 802eb1e: b18f cbz r7, 802eb44 <snmp_asn1_enc_oid+0xa6>
  45758. {
  45759. tail = 1;
  45760. *msg_ptr = code | 0x80;
  45761. ofs += 1;
  45762. 802eb20: 3101 adds r1, #1
  45763. 802eb22: b289 uxth r1, r1
  45764. code = (u8_t)(sub_id >> shift);
  45765. if ((code != 0) || (tail != 0))
  45766. {
  45767. tail = 1;
  45768. *msg_ptr = code | 0x80;
  45769. 802eb24: f048 0880 orr.w r8, r8, #128 ; 0x80
  45770. ofs += 1;
  45771. if (ofs >= plen)
  45772. 802eb28: 42a1 cmp r1, r4
  45773. code = (u8_t)(sub_id >> shift);
  45774. if ((code != 0) || (tail != 0))
  45775. {
  45776. tail = 1;
  45777. *msg_ptr = code | 0x80;
  45778. 802eb2a: f885 8000 strb.w r8, [r5]
  45779. ofs += 1;
  45780. if (ofs >= plen)
  45781. 802eb2e: d307 bcc.n 802eb40 <snmp_asn1_enc_oid+0xa2>
  45782. {
  45783. /* next octet in next pbuf */
  45784. p = p->next;
  45785. 802eb30: 6800 ldr r0, [r0, #0]
  45786. if (p == NULL) { return ERR_ARG; }
  45787. 802eb32: 2800 cmp r0, #0
  45788. 802eb34: d0c2 beq.n 802eabc <snmp_asn1_enc_oid+0x1e>
  45789. msg_ptr = (u8_t*)p->payload;
  45790. plen += p->len;
  45791. 802eb36: 8947 ldrh r7, [r0, #10]
  45792. if (ofs >= plen)
  45793. {
  45794. /* next octet in next pbuf */
  45795. p = p->next;
  45796. if (p == NULL) { return ERR_ARG; }
  45797. msg_ptr = (u8_t*)p->payload;
  45798. 802eb38: 6845 ldr r5, [r0, #4]
  45799. plen += p->len;
  45800. 802eb3a: 19e4 adds r4, r4, r7
  45801. 802eb3c: b2a4 uxth r4, r4
  45802. 802eb3e: e000 b.n 802eb42 <snmp_asn1_enc_oid+0xa4>
  45803. }
  45804. else
  45805. {
  45806. /* next octet in same pbuf */
  45807. msg_ptr++;
  45808. 802eb40: 3501 adds r5, #1
  45809. u8_t code;
  45810. code = (u8_t)(sub_id >> shift);
  45811. if ((code != 0) || (tail != 0))
  45812. {
  45813. tail = 1;
  45814. 802eb42: 2701 movs r7, #1
  45815. ident_len--;
  45816. sub_id = *ident;
  45817. tail = 0;
  45818. shift = 28;
  45819. while(shift > 0)
  45820. 802eb44: 3e07 subs r6, #7
  45821. 802eb46: d1e5 bne.n 802eb14 <snmp_asn1_enc_oid+0x76>
  45822. msg_ptr++;
  45823. }
  45824. }
  45825. shift -= 7;
  45826. }
  45827. *msg_ptr = (u8_t)sub_id & 0x7F;
  45828. 802eb48: f00c 0c7f and.w ip, ip, #127 ; 0x7f
  45829. 802eb4c: f885 c000 strb.w ip, [r5]
  45830. if (ident_len > 0)
  45831. 802eb50: b172 cbz r2, 802eb70 <snmp_asn1_enc_oid+0xd2>
  45832. {
  45833. ofs += 1;
  45834. 802eb52: 3101 adds r1, #1
  45835. 802eb54: b289 uxth r1, r1
  45836. if (ofs >= plen)
  45837. 802eb56: 42a1 cmp r1, r4
  45838. 802eb58: d307 bcc.n 802eb6a <snmp_asn1_enc_oid+0xcc>
  45839. {
  45840. /* next octet in next pbuf */
  45841. p = p->next;
  45842. 802eb5a: 6800 ldr r0, [r0, #0]
  45843. if (p == NULL) { return ERR_ARG; }
  45844. 802eb5c: 2800 cmp r0, #0
  45845. 802eb5e: d0ad beq.n 802eabc <snmp_asn1_enc_oid+0x1e>
  45846. msg_ptr = (u8_t*)p->payload;
  45847. plen += p->len;
  45848. 802eb60: 8946 ldrh r6, [r0, #10]
  45849. if (ofs >= plen)
  45850. {
  45851. /* next octet in next pbuf */
  45852. p = p->next;
  45853. if (p == NULL) { return ERR_ARG; }
  45854. msg_ptr = (u8_t*)p->payload;
  45855. 802eb62: 6845 ldr r5, [r0, #4]
  45856. plen += p->len;
  45857. 802eb64: 19a4 adds r4, r4, r6
  45858. 802eb66: b2a4 uxth r4, r4
  45859. 802eb68: e000 b.n 802eb6c <snmp_asn1_enc_oid+0xce>
  45860. }
  45861. else
  45862. {
  45863. /* next octet in same pbuf */
  45864. msg_ptr++;
  45865. 802eb6a: 3501 adds r5, #1
  45866. {
  45867. /* @bug: allow empty varbinds for symmetry (we must decode them for getnext), allow partial compression?? */
  45868. /* ident_len <= 1, at least we need zeroDotZero (0.0) (ident_len == 2) */
  45869. return ERR_ARG;
  45870. }
  45871. while (ident_len > 0)
  45872. 802eb6c: 2a00 cmp r2, #0
  45873. 802eb6e: d1cb bne.n 802eb08 <snmp_asn1_enc_oid+0x6a>
  45874. }
  45875. }
  45876. /* proceed to next sub-identifier */
  45877. ident++;
  45878. }
  45879. return ERR_OK;
  45880. 802eb70: 2000 movs r0, #0
  45881. 802eb72: e004 b.n 802eb7e <snmp_asn1_enc_oid+0xe0>
  45882. }
  45883. p = p->next;
  45884. 802eb74: 6800 ldr r0, [r0, #0]
  45885. plen = 0;
  45886. while (p != NULL)
  45887. {
  45888. base = plen;
  45889. plen += p->len;
  45890. 802eb76: 4625 mov r5, r4
  45891. {
  45892. u16_t plen, base;
  45893. u8_t *msg_ptr;
  45894. plen = 0;
  45895. while (p != NULL)
  45896. 802eb78: 2800 cmp r0, #0
  45897. 802eb7a: d194 bne.n 802eaa6 <snmp_asn1_enc_oid+0x8>
  45898. 802eb7c: e79e b.n 802eabc <snmp_asn1_enc_oid+0x1e>
  45899. }
  45900. p = p->next;
  45901. }
  45902. /* p == NULL, ofs >= plen */
  45903. return ERR_ARG;
  45904. }
  45905. 802eb7e: b240 sxtb r0, r0
  45906. 802eb80: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  45907. 0802eb84 <snmp_asn1_enc_raw>:
  45908. * @param raw points raw data
  45909. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  45910. */
  45911. err_t
  45912. snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw)
  45913. {
  45914. 802eb84: b5f0 push {r4, r5, r6, r7, lr}
  45915. u16_t plen, base;
  45916. u8_t *msg_ptr;
  45917. plen = 0;
  45918. 802eb86: 2600 movs r6, #0
  45919. while (p != NULL)
  45920. 802eb88: e025 b.n 802ebd6 <snmp_asn1_enc_raw+0x52>
  45921. {
  45922. base = plen;
  45923. plen += p->len;
  45924. 802eb8a: 8944 ldrh r4, [r0, #10]
  45925. 802eb8c: 1934 adds r4, r6, r4
  45926. 802eb8e: b2a4 uxth r4, r4
  45927. if (ofs < plen)
  45928. 802eb90: 42a1 cmp r1, r4
  45929. 802eb92: d21e bcs.n 802ebd2 <snmp_asn1_enc_raw+0x4e>
  45930. {
  45931. msg_ptr = (u8_t*)p->payload;
  45932. 802eb94: 6847 ldr r7, [r0, #4]
  45933. msg_ptr += ofs - base;
  45934. 802eb96: 1b8d subs r5, r1, r6
  45935. 802eb98: 197d adds r5, r7, r5
  45936. * @param raw_len raw data length
  45937. * @param raw points raw data
  45938. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  45939. */
  45940. err_t
  45941. snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw)
  45942. 802eb9a: 1851 adds r1, r2, r1
  45943. if (ofs < plen)
  45944. {
  45945. msg_ptr = (u8_t*)p->payload;
  45946. msg_ptr += ofs - base;
  45947. while (raw_len > 1)
  45948. 802eb9c: e012 b.n 802ebc4 <snmp_asn1_enc_raw+0x40>
  45949. {
  45950. /* copy raw_len - 1 octets */
  45951. raw_len--;
  45952. 802eb9e: 3a01 subs r2, #1
  45953. *msg_ptr = *raw;
  45954. 802eba0: f813 6b01 ldrb.w r6, [r3], #1
  45955. msg_ptr += ofs - base;
  45956. while (raw_len > 1)
  45957. {
  45958. /* copy raw_len - 1 octets */
  45959. raw_len--;
  45960. 802eba4: b292 uxth r2, r2
  45961. *msg_ptr = *raw;
  45962. 802eba6: 702e strb r6, [r5, #0]
  45963. * @param raw_len raw data length
  45964. * @param raw points raw data
  45965. * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
  45966. */
  45967. err_t
  45968. snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw)
  45969. 802eba8: 1a8e subs r6, r1, r2
  45970. /* copy raw_len - 1 octets */
  45971. raw_len--;
  45972. *msg_ptr = *raw;
  45973. raw++;
  45974. ofs += 1;
  45975. if (ofs >= plen)
  45976. 802ebaa: b2b6 uxth r6, r6
  45977. 802ebac: 42a6 cmp r6, r4
  45978. 802ebae: d308 bcc.n 802ebc2 <snmp_asn1_enc_raw+0x3e>
  45979. {
  45980. /* next octet in next pbuf */
  45981. p = p->next;
  45982. 802ebb0: 6800 ldr r0, [r0, #0]
  45983. if (p == NULL) { return ERR_ARG; }
  45984. 802ebb2: b908 cbnz r0, 802ebb8 <snmp_asn1_enc_raw+0x34>
  45985. 802ebb4: 20f2 movs r0, #242 ; 0xf2
  45986. 802ebb6: e012 b.n 802ebde <snmp_asn1_enc_raw+0x5a>
  45987. msg_ptr = (u8_t*)p->payload;
  45988. plen += p->len;
  45989. 802ebb8: 8946 ldrh r6, [r0, #10]
  45990. if (ofs >= plen)
  45991. {
  45992. /* next octet in next pbuf */
  45993. p = p->next;
  45994. if (p == NULL) { return ERR_ARG; }
  45995. msg_ptr = (u8_t*)p->payload;
  45996. 802ebba: 6845 ldr r5, [r0, #4]
  45997. plen += p->len;
  45998. 802ebbc: 19a4 adds r4, r4, r6
  45999. 802ebbe: b2a4 uxth r4, r4
  46000. 802ebc0: e000 b.n 802ebc4 <snmp_asn1_enc_raw+0x40>
  46001. }
  46002. else
  46003. {
  46004. /* next octet in same pbuf */
  46005. msg_ptr++;
  46006. 802ebc2: 3501 adds r5, #1
  46007. if (ofs < plen)
  46008. {
  46009. msg_ptr = (u8_t*)p->payload;
  46010. msg_ptr += ofs - base;
  46011. while (raw_len > 1)
  46012. 802ebc4: 2a01 cmp r2, #1
  46013. 802ebc6: d8ea bhi.n 802eb9e <snmp_asn1_enc_raw+0x1a>
  46014. {
  46015. /* next octet in same pbuf */
  46016. msg_ptr++;
  46017. }
  46018. }
  46019. if (raw_len > 0)
  46020. 802ebc8: b142 cbz r2, 802ebdc <snmp_asn1_enc_raw+0x58>
  46021. {
  46022. /* copy last or single octet */
  46023. *msg_ptr = *raw;
  46024. 802ebca: 781b ldrb r3, [r3, #0]
  46025. }
  46026. return ERR_OK;
  46027. 802ebcc: 2000 movs r0, #0
  46028. }
  46029. }
  46030. if (raw_len > 0)
  46031. {
  46032. /* copy last or single octet */
  46033. *msg_ptr = *raw;
  46034. 802ebce: 702b strb r3, [r5, #0]
  46035. 802ebd0: e005 b.n 802ebde <snmp_asn1_enc_raw+0x5a>
  46036. }
  46037. return ERR_OK;
  46038. }
  46039. p = p->next;
  46040. 802ebd2: 6800 ldr r0, [r0, #0]
  46041. plen = 0;
  46042. while (p != NULL)
  46043. {
  46044. base = plen;
  46045. plen += p->len;
  46046. 802ebd4: 4626 mov r6, r4
  46047. {
  46048. u16_t plen, base;
  46049. u8_t *msg_ptr;
  46050. plen = 0;
  46051. while (p != NULL)
  46052. 802ebd6: 2800 cmp r0, #0
  46053. 802ebd8: d1d7 bne.n 802eb8a <snmp_asn1_enc_raw+0x6>
  46054. 802ebda: e7eb b.n 802ebb4 <snmp_asn1_enc_raw+0x30>
  46055. if (raw_len > 0)
  46056. {
  46057. /* copy last or single octet */
  46058. *msg_ptr = *raw;
  46059. }
  46060. return ERR_OK;
  46061. 802ebdc: 4610 mov r0, r2
  46062. }
  46063. p = p->next;
  46064. }
  46065. /* p == NULL, ofs >= plen */
  46066. return ERR_ARG;
  46067. }
  46068. 802ebde: b240 sxtb r0, r0
  46069. 802ebe0: bdf0 pop {r4, r5, r6, r7, pc}
  46070. 0802ebe2 <noleafs_get_object_def>:
  46071. void
  46072. noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  46073. {
  46074. LWIP_UNUSED_ARG(ident_len);
  46075. LWIP_UNUSED_ARG(ident);
  46076. od->instance = MIB_OBJECT_NONE;
  46077. 802ebe2: 2300 movs r3, #0
  46078. 802ebe4: 7013 strb r3, [r2, #0]
  46079. 802ebe6: 4770 bx lr
  46080. 0802ebe8 <noleafs_get_value>:
  46081. }
  46082. void
  46083. noleafs_get_value(struct obj_def *od, u16_t len, void *value)
  46084. {
  46085. 802ebe8: 4770 bx lr
  46086. 0802ebea <noleafs_set_test>:
  46087. LWIP_UNUSED_ARG(od);
  46088. LWIP_UNUSED_ARG(len);
  46089. LWIP_UNUSED_ARG(value);
  46090. /* can't set */
  46091. return 0;
  46092. }
  46093. 802ebea: 2000 movs r0, #0
  46094. 802ebec: 4770 bx lr
  46095. 0802ebee <noleafs_set_value>:
  46096. void
  46097. noleafs_set_value(struct obj_def *od, u16_t len, void *value)
  46098. {
  46099. 802ebee: 4770 bx lr
  46100. 0802ebf0 <system_get_object_def>:
  46101. u8_t id;
  46102. /* return to object name, adding index depth (1) */
  46103. ident_len += 1;
  46104. ident -= 1;
  46105. if (ident_len == 2)
  46106. 802ebf0: 2801 cmp r0, #1
  46107. 802ebf2: d145 bne.n 802ec80 <system_get_object_def+0x90>
  46108. {
  46109. od->id_inst_len = ident_len;
  46110. 802ebf4: 2002 movs r0, #2
  46111. {
  46112. u8_t id;
  46113. /* return to object name, adding index depth (1) */
  46114. ident_len += 1;
  46115. ident -= 1;
  46116. 802ebf6: 1f0b subs r3, r1, #4
  46117. if (ident_len == 2)
  46118. {
  46119. od->id_inst_len = ident_len;
  46120. 802ebf8: 7190 strb r0, [r2, #6]
  46121. od->id_inst_ptr = ident;
  46122. 802ebfa: 6093 str r3, [r2, #8]
  46123. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  46124. id = (u8_t)ident[0];
  46125. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def system.%"U16_F".0\n",(u16_t)id));
  46126. switch (id)
  46127. 802ebfc: f811 3c04 ldrb.w r3, [r1, #-4]
  46128. 802ec00: 3b01 subs r3, #1
  46129. 802ec02: 2b06 cmp r3, #6
  46130. 802ec04: d83c bhi.n 802ec80 <system_get_object_def+0x90>
  46131. 802ec06: e8df f003 tbb [pc, r3]
  46132. 802ec0a: 0b04 .short 0x0b04
  46133. 802ec0c: 2a221a14 .word 0x2a221a14
  46134. 802ec10: 34 .byte 0x34
  46135. 802ec11: 00 .byte 0x00
  46136. {
  46137. case 1: /* sysDescr */
  46138. od->instance = MIB_OBJECT_SCALAR;
  46139. 802ec12: 2301 movs r3, #1
  46140. 802ec14: 7013 strb r3, [r2, #0]
  46141. od->access = MIB_OBJECT_READ_ONLY;
  46142. 802ec16: 7053 strb r3, [r2, #1]
  46143. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  46144. 802ec18: 2304 movs r3, #4
  46145. 802ec1a: 7093 strb r3, [r2, #2]
  46146. od->v_len = *sysdescr_len_ptr;
  46147. 802ec1c: 4b1a ldr r3, [pc, #104] ; (802ec88 <system_get_object_def+0x98>)
  46148. 802ec1e: e025 b.n 802ec6c <system_get_object_def+0x7c>
  46149. break;
  46150. case 2: /* sysObjectID */
  46151. od->instance = MIB_OBJECT_SCALAR;
  46152. 802ec20: 2301 movs r3, #1
  46153. 802ec22: 7013 strb r3, [r2, #0]
  46154. od->access = MIB_OBJECT_READ_ONLY;
  46155. 802ec24: 7053 strb r3, [r2, #1]
  46156. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
  46157. 802ec26: 2306 movs r3, #6
  46158. 802ec28: 7093 strb r3, [r2, #2]
  46159. od->v_len = sysobjid.len * sizeof(s32_t);
  46160. 802ec2a: 4b18 ldr r3, [pc, #96] ; (802ec8c <system_get_object_def+0x9c>)
  46161. 802ec2c: 781b ldrb r3, [r3, #0]
  46162. 802ec2e: 009b lsls r3, r3, #2
  46163. 802ec30: e024 b.n 802ec7c <system_get_object_def+0x8c>
  46164. break;
  46165. case 3: /* sysUpTime */
  46166. od->instance = MIB_OBJECT_SCALAR;
  46167. 802ec32: 2301 movs r3, #1
  46168. 802ec34: 7013 strb r3, [r2, #0]
  46169. od->access = MIB_OBJECT_READ_ONLY;
  46170. 802ec36: 7053 strb r3, [r2, #1]
  46171. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS);
  46172. 802ec38: 2343 movs r3, #67 ; 0x43
  46173. 802ec3a: 7093 strb r3, [r2, #2]
  46174. 802ec3c: e01d b.n 802ec7a <system_get_object_def+0x8a>
  46175. od->v_len = sizeof(u32_t);
  46176. break;
  46177. case 4: /* sysContact */
  46178. od->instance = MIB_OBJECT_SCALAR;
  46179. 802ec3e: 2301 movs r3, #1
  46180. 802ec40: 7013 strb r3, [r2, #0]
  46181. od->access = MIB_OBJECT_READ_WRITE;
  46182. 802ec42: 2303 movs r3, #3
  46183. 802ec44: 7053 strb r3, [r2, #1]
  46184. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  46185. 802ec46: 2304 movs r3, #4
  46186. 802ec48: 7093 strb r3, [r2, #2]
  46187. od->v_len = *syscontact_len_ptr;
  46188. 802ec4a: 4b11 ldr r3, [pc, #68] ; (802ec90 <system_get_object_def+0xa0>)
  46189. 802ec4c: e00e b.n 802ec6c <system_get_object_def+0x7c>
  46190. break;
  46191. case 5: /* sysName */
  46192. od->instance = MIB_OBJECT_SCALAR;
  46193. 802ec4e: 2301 movs r3, #1
  46194. 802ec50: 7013 strb r3, [r2, #0]
  46195. od->access = MIB_OBJECT_READ_WRITE;
  46196. 802ec52: 2303 movs r3, #3
  46197. 802ec54: 7053 strb r3, [r2, #1]
  46198. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  46199. 802ec56: 2304 movs r3, #4
  46200. 802ec58: 7093 strb r3, [r2, #2]
  46201. od->v_len = *sysname_len_ptr;
  46202. 802ec5a: 4b0e ldr r3, [pc, #56] ; (802ec94 <system_get_object_def+0xa4>)
  46203. 802ec5c: e006 b.n 802ec6c <system_get_object_def+0x7c>
  46204. break;
  46205. case 6: /* sysLocation */
  46206. od->instance = MIB_OBJECT_SCALAR;
  46207. 802ec5e: 2301 movs r3, #1
  46208. 802ec60: 7013 strb r3, [r2, #0]
  46209. od->access = MIB_OBJECT_READ_WRITE;
  46210. 802ec62: 2303 movs r3, #3
  46211. 802ec64: 7053 strb r3, [r2, #1]
  46212. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  46213. 802ec66: 2304 movs r3, #4
  46214. 802ec68: 7093 strb r3, [r2, #2]
  46215. od->v_len = *syslocation_len_ptr;
  46216. 802ec6a: 4b0b ldr r3, [pc, #44] ; (802ec98 <system_get_object_def+0xa8>)
  46217. 802ec6c: 681b ldr r3, [r3, #0]
  46218. 802ec6e: 781b ldrb r3, [r3, #0]
  46219. 802ec70: e004 b.n 802ec7c <system_get_object_def+0x8c>
  46220. break;
  46221. case 7: /* sysServices */
  46222. od->instance = MIB_OBJECT_SCALAR;
  46223. 802ec72: 2301 movs r3, #1
  46224. 802ec74: 7013 strb r3, [r2, #0]
  46225. od->access = MIB_OBJECT_READ_ONLY;
  46226. 802ec76: 7053 strb r3, [r2, #1]
  46227. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  46228. 802ec78: 7090 strb r0, [r2, #2]
  46229. od->v_len = sizeof(s32_t);
  46230. 802ec7a: 2304 movs r3, #4
  46231. 802ec7c: 8093 strh r3, [r2, #4]
  46232. break;
  46233. 802ec7e: 4770 bx lr
  46234. };
  46235. }
  46236. else
  46237. {
  46238. LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def: no scalar\n"));
  46239. od->instance = MIB_OBJECT_NONE;
  46240. 802ec80: 2300 movs r3, #0
  46241. 802ec82: 7013 strb r3, [r2, #0]
  46242. 802ec84: 4770 bx lr
  46243. 802ec86: bf00 nop
  46244. 802ec88: 20001804 .word 0x20001804
  46245. 802ec8c: 200016b4 .word 0x200016b4
  46246. 802ec90: 20001660 .word 0x20001660
  46247. 802ec94: 2000165c .word 0x2000165c
  46248. 802ec98: 20001848 .word 0x20001848
  46249. 0802ec9c <interfaces_get_object_def>:
  46250. interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  46251. {
  46252. /* return to object name, adding index depth (1) */
  46253. ident_len += 1;
  46254. ident -= 1;
  46255. if (ident_len == 2)
  46256. 802ec9c: 2801 cmp r0, #1
  46257. 802ec9e: d109 bne.n 802ecb4 <interfaces_get_object_def+0x18>
  46258. {
  46259. od->id_inst_len = ident_len;
  46260. 802eca0: 2302 movs r3, #2
  46261. 802eca2: 7193 strb r3, [r2, #6]
  46262. static void
  46263. interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  46264. {
  46265. /* return to object name, adding index depth (1) */
  46266. ident_len += 1;
  46267. ident -= 1;
  46268. 802eca4: 3904 subs r1, #4
  46269. od->id_inst_len = ident_len;
  46270. od->id_inst_ptr = ident;
  46271. od->instance = MIB_OBJECT_SCALAR;
  46272. od->access = MIB_OBJECT_READ_ONLY;
  46273. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  46274. 802eca6: 7093 strb r3, [r2, #2]
  46275. od->v_len = sizeof(s32_t);
  46276. 802eca8: 2304 movs r3, #4
  46277. ident_len += 1;
  46278. ident -= 1;
  46279. if (ident_len == 2)
  46280. {
  46281. od->id_inst_len = ident_len;
  46282. od->id_inst_ptr = ident;
  46283. 802ecaa: 6091 str r1, [r2, #8]
  46284. od->instance = MIB_OBJECT_SCALAR;
  46285. 802ecac: 7010 strb r0, [r2, #0]
  46286. od->access = MIB_OBJECT_READ_ONLY;
  46287. 802ecae: 7050 strb r0, [r2, #1]
  46288. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  46289. od->v_len = sizeof(s32_t);
  46290. 802ecb0: 8093 strh r3, [r2, #4]
  46291. 802ecb2: 4770 bx lr
  46292. }
  46293. else
  46294. {
  46295. LWIP_DEBUGF(SNMP_MIB_DEBUG,("interfaces_get_object_def: no scalar\n"));
  46296. od->instance = MIB_OBJECT_NONE;
  46297. 802ecb4: 2300 movs r3, #0
  46298. 802ecb6: 7013 strb r3, [r2, #0]
  46299. 802ecb8: 4770 bx lr
  46300. 802ecba: 0000 movs r0, r0
  46301. 0802ecbc <interfaces_get_value>:
  46302. */
  46303. static void
  46304. interfaces_get_value(struct obj_def *od, u16_t len, void *value)
  46305. {
  46306. LWIP_UNUSED_ARG(len);
  46307. if (od->id_inst_ptr[0] == 1)
  46308. 802ecbc: 6883 ldr r3, [r0, #8]
  46309. 802ecbe: 681b ldr r3, [r3, #0]
  46310. 802ecc0: 2b01 cmp r3, #1
  46311. 802ecc2: d102 bne.n 802ecca <interfaces_get_value+0xe>
  46312. {
  46313. s32_t *sint_ptr = (s32_t*)value;
  46314. *sint_ptr = iflist_root.count;
  46315. 802ecc4: 4b01 ldr r3, [pc, #4] ; (802eccc <interfaces_get_value+0x10>)
  46316. 802ecc6: 8b9b ldrh r3, [r3, #28]
  46317. 802ecc8: 6013 str r3, [r2, #0]
  46318. 802ecca: 4770 bx lr
  46319. 802eccc: 20001694 .word 0x20001694
  46320. 0802ecd0 <ip_get_value>:
  46321. {
  46322. u8_t id;
  46323. LWIP_UNUSED_ARG(len);
  46324. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  46325. id = (u8_t)od->id_inst_ptr[0];
  46326. 802ecd0: 6883 ldr r3, [r0, #8]
  46327. switch (id)
  46328. 802ecd2: 781b ldrb r3, [r3, #0]
  46329. 802ecd4: 3b01 subs r3, #1
  46330. 802ecd6: 2b16 cmp r3, #22
  46331. 802ecd8: d836 bhi.n 802ed48 <ip_get_value+0x78>
  46332. 802ecda: e8df f003 tbb [pc, r3]
  46333. 802ecde: 0e0c .short 0x0e0c
  46334. 802ece0: 16141210 .word 0x16141210
  46335. 802ece4: 1e1c1a18 .word 0x1e1c1a18
  46336. 802ece8: 26242220 .word 0x26242220
  46337. 802ecec: 2e2c2a28 .word 0x2e2c2a28
  46338. 802ecf0: 35353530 .word 0x35353530
  46339. 802ecf4: 32 .byte 0x32
  46340. 802ecf5: 00 .byte 0x00
  46341. #if IP_FORWARD
  46342. /* forwarding */
  46343. *sint_ptr = 1;
  46344. #else
  46345. /* not-forwarding */
  46346. *sint_ptr = 2;
  46347. 802ecf6: 2302 movs r3, #2
  46348. 802ecf8: e025 b.n 802ed46 <ip_get_value+0x76>
  46349. }
  46350. break;
  46351. case 2: /* ipDefaultTTL */
  46352. {
  46353. s32_t *sint_ptr = (s32_t*)value;
  46354. *sint_ptr = IP_DEFAULT_TTL;
  46355. 802ecfa: 23ff movs r3, #255 ; 0xff
  46356. 802ecfc: e023 b.n 802ed46 <ip_get_value+0x76>
  46357. }
  46358. break;
  46359. case 3: /* ipInReceives */
  46360. {
  46361. u32_t *uint_ptr = (u32_t*)value;
  46362. *uint_ptr = ipinreceives;
  46363. 802ecfe: 4b13 ldr r3, [pc, #76] ; (802ed4c <ip_get_value+0x7c>)
  46364. 802ed00: e020 b.n 802ed44 <ip_get_value+0x74>
  46365. }
  46366. break;
  46367. case 4: /* ipInHdrErrors */
  46368. {
  46369. u32_t *uint_ptr = (u32_t*)value;
  46370. *uint_ptr = ipinhdrerrors;
  46371. 802ed02: 4b13 ldr r3, [pc, #76] ; (802ed50 <ip_get_value+0x80>)
  46372. 802ed04: e01e b.n 802ed44 <ip_get_value+0x74>
  46373. }
  46374. break;
  46375. case 5: /* ipInAddrErrors */
  46376. {
  46377. u32_t *uint_ptr = (u32_t*)value;
  46378. *uint_ptr = ipinaddrerrors;
  46379. 802ed06: 4b13 ldr r3, [pc, #76] ; (802ed54 <ip_get_value+0x84>)
  46380. 802ed08: e01c b.n 802ed44 <ip_get_value+0x74>
  46381. }
  46382. break;
  46383. case 6: /* ipForwDatagrams */
  46384. {
  46385. u32_t *uint_ptr = (u32_t*)value;
  46386. *uint_ptr = ipforwdatagrams;
  46387. 802ed0a: 4b13 ldr r3, [pc, #76] ; (802ed58 <ip_get_value+0x88>)
  46388. 802ed0c: e01a b.n 802ed44 <ip_get_value+0x74>
  46389. }
  46390. break;
  46391. case 7: /* ipInUnknownProtos */
  46392. {
  46393. u32_t *uint_ptr = (u32_t*)value;
  46394. *uint_ptr = ipinunknownprotos;
  46395. 802ed0e: 4b13 ldr r3, [pc, #76] ; (802ed5c <ip_get_value+0x8c>)
  46396. 802ed10: e018 b.n 802ed44 <ip_get_value+0x74>
  46397. }
  46398. break;
  46399. case 8: /* ipInDiscards */
  46400. {
  46401. u32_t *uint_ptr = (u32_t*)value;
  46402. *uint_ptr = ipindiscards;
  46403. 802ed12: 4b13 ldr r3, [pc, #76] ; (802ed60 <ip_get_value+0x90>)
  46404. 802ed14: e016 b.n 802ed44 <ip_get_value+0x74>
  46405. }
  46406. break;
  46407. case 9: /* ipInDelivers */
  46408. {
  46409. u32_t *uint_ptr = (u32_t*)value;
  46410. *uint_ptr = ipindelivers;
  46411. 802ed16: 4b13 ldr r3, [pc, #76] ; (802ed64 <ip_get_value+0x94>)
  46412. 802ed18: e014 b.n 802ed44 <ip_get_value+0x74>
  46413. }
  46414. break;
  46415. case 10: /* ipOutRequests */
  46416. {
  46417. u32_t *uint_ptr = (u32_t*)value;
  46418. *uint_ptr = ipoutrequests;
  46419. 802ed1a: 4b13 ldr r3, [pc, #76] ; (802ed68 <ip_get_value+0x98>)
  46420. 802ed1c: e012 b.n 802ed44 <ip_get_value+0x74>
  46421. }
  46422. break;
  46423. case 11: /* ipOutDiscards */
  46424. {
  46425. u32_t *uint_ptr = (u32_t*)value;
  46426. *uint_ptr = ipoutdiscards;
  46427. 802ed1e: 4b13 ldr r3, [pc, #76] ; (802ed6c <ip_get_value+0x9c>)
  46428. 802ed20: e010 b.n 802ed44 <ip_get_value+0x74>
  46429. }
  46430. break;
  46431. case 12: /* ipOutNoRoutes */
  46432. {
  46433. u32_t *uint_ptr = (u32_t*)value;
  46434. *uint_ptr = ipoutnoroutes;
  46435. 802ed22: 4b13 ldr r3, [pc, #76] ; (802ed70 <ip_get_value+0xa0>)
  46436. 802ed24: e00e b.n 802ed44 <ip_get_value+0x74>
  46437. {
  46438. s32_t *sint_ptr = (s32_t*)value;
  46439. #if IP_REASSEMBLY
  46440. *sint_ptr = IP_REASS_MAXAGE;
  46441. #else
  46442. *sint_ptr = 0;
  46443. 802ed26: 2300 movs r3, #0
  46444. 802ed28: e00d b.n 802ed46 <ip_get_value+0x76>
  46445. }
  46446. break;
  46447. case 14: /* ipReasmReqds */
  46448. {
  46449. u32_t *uint_ptr = (u32_t*)value;
  46450. *uint_ptr = ipreasmreqds;
  46451. 802ed2a: 4b12 ldr r3, [pc, #72] ; (802ed74 <ip_get_value+0xa4>)
  46452. 802ed2c: e00a b.n 802ed44 <ip_get_value+0x74>
  46453. }
  46454. break;
  46455. case 15: /* ipReasmOKs */
  46456. {
  46457. u32_t *uint_ptr = (u32_t*)value;
  46458. *uint_ptr = ipreasmoks;
  46459. 802ed2e: 4b12 ldr r3, [pc, #72] ; (802ed78 <ip_get_value+0xa8>)
  46460. 802ed30: e008 b.n 802ed44 <ip_get_value+0x74>
  46461. }
  46462. break;
  46463. case 16: /* ipReasmFails */
  46464. {
  46465. u32_t *uint_ptr = (u32_t*)value;
  46466. *uint_ptr = ipreasmfails;
  46467. 802ed32: 4b12 ldr r3, [pc, #72] ; (802ed7c <ip_get_value+0xac>)
  46468. 802ed34: e006 b.n 802ed44 <ip_get_value+0x74>
  46469. }
  46470. break;
  46471. case 17: /* ipFragOKs */
  46472. {
  46473. u32_t *uint_ptr = (u32_t*)value;
  46474. *uint_ptr = ipfragoks;
  46475. 802ed36: 4b12 ldr r3, [pc, #72] ; (802ed80 <ip_get_value+0xb0>)
  46476. 802ed38: e004 b.n 802ed44 <ip_get_value+0x74>
  46477. }
  46478. break;
  46479. case 18: /* ipFragFails */
  46480. {
  46481. u32_t *uint_ptr = (u32_t*)value;
  46482. *uint_ptr = ipfragfails;
  46483. 802ed3a: 4b12 ldr r3, [pc, #72] ; (802ed84 <ip_get_value+0xb4>)
  46484. 802ed3c: e002 b.n 802ed44 <ip_get_value+0x74>
  46485. }
  46486. break;
  46487. case 19: /* ipFragCreates */
  46488. {
  46489. u32_t *uint_ptr = (u32_t*)value;
  46490. *uint_ptr = ipfragcreates;
  46491. 802ed3e: 4b12 ldr r3, [pc, #72] ; (802ed88 <ip_get_value+0xb8>)
  46492. 802ed40: e000 b.n 802ed44 <ip_get_value+0x74>
  46493. break;
  46494. case 23: /* ipRoutingDiscards */
  46495. /** @todo can lwIP discard routes at all?? hardwire this to 0?? */
  46496. {
  46497. u32_t *uint_ptr = (u32_t*)value;
  46498. *uint_ptr = iproutingdiscards;
  46499. 802ed42: 4b12 ldr r3, [pc, #72] ; (802ed8c <ip_get_value+0xbc>)
  46500. 802ed44: 681b ldr r3, [r3, #0]
  46501. 802ed46: 6013 str r3, [r2, #0]
  46502. 802ed48: 4770 bx lr
  46503. 802ed4a: bf00 nop
  46504. 802ed4c: 2000e198 .word 0x2000e198
  46505. 802ed50: 2000e120 .word 0x2000e120
  46506. 802ed54: 2000e104 .word 0x2000e104
  46507. 802ed58: 2000e220 .word 0x2000e220
  46508. 802ed5c: 2000e160 .word 0x2000e160
  46509. 802ed60: 2000e1ec .word 0x2000e1ec
  46510. 802ed64: 2000e224 .word 0x2000e224
  46511. 802ed68: 2000e20c .word 0x2000e20c
  46512. 802ed6c: 2000e1b0 .word 0x2000e1b0
  46513. 802ed70: 2000e230 .word 0x2000e230
  46514. 802ed74: 2000e180 .word 0x2000e180
  46515. 802ed78: 2000e12c .word 0x2000e12c
  46516. 802ed7c: 2000e1e0 .word 0x2000e1e0
  46517. 802ed80: 2000e0f0 .word 0x2000e0f0
  46518. 802ed84: 2000e15c .word 0x2000e15c
  46519. 802ed88: 2000e1fc .word 0x2000e1fc
  46520. 802ed8c: 2000e1e8 .word 0x2000e1e8
  46521. 0802ed90 <ip_set_test>:
  46522. s32_t *sint_ptr = (s32_t*)value;
  46523. LWIP_UNUSED_ARG(len);
  46524. set_ok = 0;
  46525. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  46526. id = (u8_t)od->id_inst_ptr[0];
  46527. 802ed90: 6883 ldr r3, [r0, #8]
  46528. switch (id)
  46529. 802ed92: 781b ldrb r3, [r3, #0]
  46530. 802ed94: 2b01 cmp r3, #1
  46531. 802ed96: d002 beq.n 802ed9e <ip_set_test+0xe>
  46532. 802ed98: 2b02 cmp r3, #2
  46533. 802ed9a: d109 bne.n 802edb0 <ip_set_test+0x20>
  46534. 802ed9c: e002 b.n 802eda4 <ip_set_test+0x14>
  46535. #if IP_FORWARD
  46536. /* forwarding */
  46537. if (*sint_ptr == 1)
  46538. #else
  46539. /* not-forwarding */
  46540. if (*sint_ptr == 2)
  46541. 802ed9e: 6810 ldr r0, [r2, #0]
  46542. {
  46543. u8_t id, set_ok;
  46544. s32_t *sint_ptr = (s32_t*)value;
  46545. LWIP_UNUSED_ARG(len);
  46546. set_ok = 0;
  46547. 802eda0: 2802 cmp r0, #2
  46548. 802eda2: e001 b.n 802eda8 <ip_set_test+0x18>
  46549. {
  46550. set_ok = 1;
  46551. }
  46552. break;
  46553. case 2: /* ipDefaultTTL */
  46554. if (*sint_ptr == IP_DEFAULT_TTL)
  46555. 802eda4: 6810 ldr r0, [r2, #0]
  46556. {
  46557. u8_t id, set_ok;
  46558. s32_t *sint_ptr = (s32_t*)value;
  46559. LWIP_UNUSED_ARG(len);
  46560. set_ok = 0;
  46561. 802eda6: 28ff cmp r0, #255 ; 0xff
  46562. 802eda8: bf14 ite ne
  46563. 802edaa: 2000 movne r0, #0
  46564. 802edac: 2001 moveq r0, #1
  46565. 802edae: 4770 bx lr
  46566. 802edb0: 2000 movs r0, #0
  46567. set_ok = 1;
  46568. }
  46569. break;
  46570. };
  46571. return set_ok;
  46572. }
  46573. 802edb2: 4770 bx lr
  46574. 0802edb4 <ip_rteentry_get_object_def>:
  46575. /* return to object name, adding index depth (4) */
  46576. ident_len += 4;
  46577. ident -= 4;
  46578. if (ident_len == 5)
  46579. 802edb4: 2801 cmp r0, #1
  46580. 802edb6: d12c bne.n 802ee12 <ip_rteentry_get_object_def+0x5e>
  46581. {
  46582. od->id_inst_len = ident_len;
  46583. 802edb8: 2305 movs r3, #5
  46584. 802edba: 7193 strb r3, [r2, #6]
  46585. {
  46586. u8_t id;
  46587. /* return to object name, adding index depth (4) */
  46588. ident_len += 4;
  46589. ident -= 4;
  46590. 802edbc: f1a1 0310 sub.w r3, r1, #16
  46591. if (ident_len == 5)
  46592. {
  46593. od->id_inst_len = ident_len;
  46594. od->id_inst_ptr = ident;
  46595. 802edc0: 6093 str r3, [r2, #8]
  46596. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  46597. id = (u8_t)ident[0];
  46598. switch (id)
  46599. 802edc2: f811 3c10 ldrb.w r3, [r1, #-16]
  46600. 802edc6: 3b01 subs r3, #1
  46601. 802edc8: 2b0c cmp r3, #12
  46602. 802edca: d822 bhi.n 802ee12 <ip_rteentry_get_object_def+0x5e>
  46603. 802edcc: e8df f003 tbb [pc, r3]
  46604. 802edd0: 0d0d0d07 .word 0x0d0d0d07
  46605. 802edd4: 0d070d0d .word 0x0d070d0d
  46606. 802edd8: 0d070d11 .word 0x0d070d11
  46607. 802eddc: 18 .byte 0x18
  46608. 802eddd: 00 .byte 0x00
  46609. {
  46610. case 1: /* ipRouteDest */
  46611. case 7: /* ipRouteNextHop */
  46612. case 11: /* ipRouteMask */
  46613. od->instance = MIB_OBJECT_TAB;
  46614. 802edde: 2302 movs r3, #2
  46615. 802ede0: 7013 strb r3, [r2, #0]
  46616. od->access = MIB_OBJECT_READ_WRITE;
  46617. 802ede2: 2303 movs r3, #3
  46618. 802ede4: 7053 strb r3, [r2, #1]
  46619. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  46620. 802ede6: 2340 movs r3, #64 ; 0x40
  46621. 802ede8: e007 b.n 802edfa <ip_rteentry_get_object_def+0x46>
  46622. case 5: /* ipRouteMetric3 */
  46623. case 6: /* ipRouteMetric4 */
  46624. case 8: /* ipRouteType */
  46625. case 10: /* ipRouteAge */
  46626. case 12: /* ipRouteMetric5 */
  46627. od->instance = MIB_OBJECT_TAB;
  46628. 802edea: 2302 movs r3, #2
  46629. 802edec: 7013 strb r3, [r2, #0]
  46630. od->access = MIB_OBJECT_READ_WRITE;
  46631. 802edee: 2103 movs r1, #3
  46632. 802edf0: e002 b.n 802edf8 <ip_rteentry_get_object_def+0x44>
  46633. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  46634. od->v_len = sizeof(s32_t);
  46635. break;
  46636. case 9: /* ipRouteProto */
  46637. od->instance = MIB_OBJECT_TAB;
  46638. 802edf2: 2302 movs r3, #2
  46639. 802edf4: 7013 strb r3, [r2, #0]
  46640. od->access = MIB_OBJECT_READ_ONLY;
  46641. 802edf6: 2101 movs r1, #1
  46642. 802edf8: 7051 strb r1, [r2, #1]
  46643. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  46644. 802edfa: 7093 strb r3, [r2, #2]
  46645. od->v_len = sizeof(s32_t);
  46646. 802edfc: 2304 movs r3, #4
  46647. 802edfe: e006 b.n 802ee0e <ip_rteentry_get_object_def+0x5a>
  46648. break;
  46649. case 13: /* ipRouteInfo */
  46650. /** @note returning zeroDotZero (0.0) no routing protocol specific MIB */
  46651. od->instance = MIB_OBJECT_TAB;
  46652. 802ee00: 2302 movs r3, #2
  46653. 802ee02: 7013 strb r3, [r2, #0]
  46654. od->access = MIB_OBJECT_READ_ONLY;
  46655. 802ee04: 2301 movs r3, #1
  46656. 802ee06: 7053 strb r3, [r2, #1]
  46657. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
  46658. 802ee08: 2306 movs r3, #6
  46659. 802ee0a: 7093 strb r3, [r2, #2]
  46660. od->v_len = iprouteinfo.len * sizeof(s32_t);
  46661. 802ee0c: 2308 movs r3, #8
  46662. 802ee0e: 8093 strh r3, [r2, #4]
  46663. break;
  46664. 802ee10: 4770 bx lr
  46665. }
  46666. }
  46667. else
  46668. {
  46669. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_rteentry_get_object_def: no scalar\n"));
  46670. od->instance = MIB_OBJECT_NONE;
  46671. 802ee12: 2300 movs r3, #0
  46672. 802ee14: 7013 strb r3, [r2, #0]
  46673. 802ee16: 4770 bx lr
  46674. 0802ee18 <icmp_get_object_def>:
  46675. icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  46676. {
  46677. /* return to object name, adding index depth (1) */
  46678. ident_len += 1;
  46679. ident -= 1;
  46680. if ((ident_len == 2) &&
  46681. 802ee18: 2801 cmp r0, #1
  46682. 802ee1a: d110 bne.n 802ee3e <icmp_get_object_def+0x26>
  46683. (ident[0] > 0) && (ident[0] < 27))
  46684. 802ee1c: f851 3c04 ldr.w r3, [r1, #-4]
  46685. icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  46686. {
  46687. /* return to object name, adding index depth (1) */
  46688. ident_len += 1;
  46689. ident -= 1;
  46690. if ((ident_len == 2) &&
  46691. 802ee20: 2b00 cmp r3, #0
  46692. 802ee22: dd0c ble.n 802ee3e <icmp_get_object_def+0x26>
  46693. (ident[0] > 0) && (ident[0] < 27))
  46694. 802ee24: 2b1a cmp r3, #26
  46695. 802ee26: dc0a bgt.n 802ee3e <icmp_get_object_def+0x26>
  46696. {
  46697. od->id_inst_len = ident_len;
  46698. 802ee28: 2302 movs r3, #2
  46699. 802ee2a: 7193 strb r3, [r2, #6]
  46700. od->id_inst_ptr = ident;
  46701. od->instance = MIB_OBJECT_SCALAR;
  46702. od->access = MIB_OBJECT_READ_ONLY;
  46703. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  46704. 802ee2c: 2341 movs r3, #65 ; 0x41
  46705. static void
  46706. icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  46707. {
  46708. /* return to object name, adding index depth (1) */
  46709. ident_len += 1;
  46710. ident -= 1;
  46711. 802ee2e: 3904 subs r1, #4
  46712. od->id_inst_len = ident_len;
  46713. od->id_inst_ptr = ident;
  46714. od->instance = MIB_OBJECT_SCALAR;
  46715. od->access = MIB_OBJECT_READ_ONLY;
  46716. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  46717. 802ee30: 7093 strb r3, [r2, #2]
  46718. od->v_len = sizeof(u32_t);
  46719. 802ee32: 2304 movs r3, #4
  46720. ident -= 1;
  46721. if ((ident_len == 2) &&
  46722. (ident[0] > 0) && (ident[0] < 27))
  46723. {
  46724. od->id_inst_len = ident_len;
  46725. od->id_inst_ptr = ident;
  46726. 802ee34: 6091 str r1, [r2, #8]
  46727. od->instance = MIB_OBJECT_SCALAR;
  46728. 802ee36: 7010 strb r0, [r2, #0]
  46729. od->access = MIB_OBJECT_READ_ONLY;
  46730. 802ee38: 7050 strb r0, [r2, #1]
  46731. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  46732. od->v_len = sizeof(u32_t);
  46733. 802ee3a: 8093 strh r3, [r2, #4]
  46734. 802ee3c: 4770 bx lr
  46735. }
  46736. else
  46737. {
  46738. LWIP_DEBUGF(SNMP_MIB_DEBUG,("icmp_get_object_def: no scalar\n"));
  46739. od->instance = MIB_OBJECT_NONE;
  46740. 802ee3e: 2300 movs r3, #0
  46741. 802ee40: 7013 strb r3, [r2, #0]
  46742. 802ee42: 4770 bx lr
  46743. 0802ee44 <icmp_get_value>:
  46744. u32_t *uint_ptr = (u32_t*)value;
  46745. u8_t id;
  46746. LWIP_UNUSED_ARG(len);
  46747. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  46748. id = (u8_t)od->id_inst_ptr[0];
  46749. 802ee44: 6883 ldr r3, [r0, #8]
  46750. switch (id)
  46751. 802ee46: 781b ldrb r3, [r3, #0]
  46752. 802ee48: 3b01 subs r3, #1
  46753. 802ee4a: 2b19 cmp r3, #25
  46754. 802ee4c: d843 bhi.n 802eed6 <icmp_get_value+0x92>
  46755. 802ee4e: e8df f003 tbb [pc, r3]
  46756. 802ee52: 0f0d .short 0x0f0d
  46757. 802ee54: 17151311 .word 0x17151311
  46758. 802ee58: 1f1d1b19 .word 0x1f1d1b19
  46759. 802ee5c: 27252321 .word 0x27252321
  46760. 802ee60: 2f2d2b29 .word 0x2f2d2b29
  46761. 802ee64: 37353331 .word 0x37353331
  46762. 802ee68: 3f3d3b39 .word 0x3f3d3b39
  46763. {
  46764. case 1: /* icmpInMsgs */
  46765. *uint_ptr = icmpinmsgs;
  46766. 802ee6c: 4b1a ldr r3, [pc, #104] ; (802eed8 <icmp_get_value+0x94>)
  46767. 802ee6e: e030 b.n 802eed2 <icmp_get_value+0x8e>
  46768. break;
  46769. case 2: /* icmpInErrors */
  46770. *uint_ptr = icmpinerrors;
  46771. 802ee70: 4b1a ldr r3, [pc, #104] ; (802eedc <icmp_get_value+0x98>)
  46772. 802ee72: e02e b.n 802eed2 <icmp_get_value+0x8e>
  46773. break;
  46774. case 3: /* icmpInDestUnreachs */
  46775. *uint_ptr = icmpindestunreachs;
  46776. 802ee74: 4b1a ldr r3, [pc, #104] ; (802eee0 <icmp_get_value+0x9c>)
  46777. 802ee76: e02c b.n 802eed2 <icmp_get_value+0x8e>
  46778. break;
  46779. case 4: /* icmpInTimeExcds */
  46780. *uint_ptr = icmpintimeexcds;
  46781. 802ee78: 4b1a ldr r3, [pc, #104] ; (802eee4 <icmp_get_value+0xa0>)
  46782. 802ee7a: e02a b.n 802eed2 <icmp_get_value+0x8e>
  46783. break;
  46784. case 5: /* icmpInParmProbs */
  46785. *uint_ptr = icmpinparmprobs;
  46786. 802ee7c: 4b1a ldr r3, [pc, #104] ; (802eee8 <icmp_get_value+0xa4>)
  46787. 802ee7e: e028 b.n 802eed2 <icmp_get_value+0x8e>
  46788. break;
  46789. case 6: /* icmpInSrcQuenchs */
  46790. *uint_ptr = icmpinsrcquenchs;
  46791. 802ee80: 4b1a ldr r3, [pc, #104] ; (802eeec <icmp_get_value+0xa8>)
  46792. 802ee82: e026 b.n 802eed2 <icmp_get_value+0x8e>
  46793. break;
  46794. case 7: /* icmpInRedirects */
  46795. *uint_ptr = icmpinredirects;
  46796. 802ee84: 4b1a ldr r3, [pc, #104] ; (802eef0 <icmp_get_value+0xac>)
  46797. 802ee86: e024 b.n 802eed2 <icmp_get_value+0x8e>
  46798. break;
  46799. case 8: /* icmpInEchos */
  46800. *uint_ptr = icmpinechos;
  46801. 802ee88: 4b1a ldr r3, [pc, #104] ; (802eef4 <icmp_get_value+0xb0>)
  46802. 802ee8a: e022 b.n 802eed2 <icmp_get_value+0x8e>
  46803. break;
  46804. case 9: /* icmpInEchoReps */
  46805. *uint_ptr = icmpinechoreps;
  46806. 802ee8c: 4b1a ldr r3, [pc, #104] ; (802eef8 <icmp_get_value+0xb4>)
  46807. 802ee8e: e020 b.n 802eed2 <icmp_get_value+0x8e>
  46808. break;
  46809. case 10: /* icmpInTimestamps */
  46810. *uint_ptr = icmpintimestamps;
  46811. 802ee90: 4b1a ldr r3, [pc, #104] ; (802eefc <icmp_get_value+0xb8>)
  46812. 802ee92: e01e b.n 802eed2 <icmp_get_value+0x8e>
  46813. break;
  46814. case 11: /* icmpInTimestampReps */
  46815. *uint_ptr = icmpintimestampreps;
  46816. 802ee94: 4b1a ldr r3, [pc, #104] ; (802ef00 <icmp_get_value+0xbc>)
  46817. 802ee96: e01c b.n 802eed2 <icmp_get_value+0x8e>
  46818. break;
  46819. case 12: /* icmpInAddrMasks */
  46820. *uint_ptr = icmpinaddrmasks;
  46821. 802ee98: 4b1a ldr r3, [pc, #104] ; (802ef04 <icmp_get_value+0xc0>)
  46822. 802ee9a: e01a b.n 802eed2 <icmp_get_value+0x8e>
  46823. break;
  46824. case 13: /* icmpInAddrMaskReps */
  46825. *uint_ptr = icmpinaddrmaskreps;
  46826. 802ee9c: 4b1a ldr r3, [pc, #104] ; (802ef08 <icmp_get_value+0xc4>)
  46827. 802ee9e: e018 b.n 802eed2 <icmp_get_value+0x8e>
  46828. break;
  46829. case 14: /* icmpOutMsgs */
  46830. *uint_ptr = icmpoutmsgs;
  46831. 802eea0: 4b1a ldr r3, [pc, #104] ; (802ef0c <icmp_get_value+0xc8>)
  46832. 802eea2: e016 b.n 802eed2 <icmp_get_value+0x8e>
  46833. break;
  46834. case 15: /* icmpOutErrors */
  46835. *uint_ptr = icmpouterrors;
  46836. 802eea4: 4b1a ldr r3, [pc, #104] ; (802ef10 <icmp_get_value+0xcc>)
  46837. 802eea6: e014 b.n 802eed2 <icmp_get_value+0x8e>
  46838. break;
  46839. case 16: /* icmpOutDestUnreachs */
  46840. *uint_ptr = icmpoutdestunreachs;
  46841. 802eea8: 4b1a ldr r3, [pc, #104] ; (802ef14 <icmp_get_value+0xd0>)
  46842. 802eeaa: e012 b.n 802eed2 <icmp_get_value+0x8e>
  46843. break;
  46844. case 17: /* icmpOutTimeExcds */
  46845. *uint_ptr = icmpouttimeexcds;
  46846. 802eeac: 4b1a ldr r3, [pc, #104] ; (802ef18 <icmp_get_value+0xd4>)
  46847. 802eeae: e010 b.n 802eed2 <icmp_get_value+0x8e>
  46848. break;
  46849. case 18: /* icmpOutParmProbs */
  46850. *uint_ptr = icmpoutparmprobs;
  46851. 802eeb0: 4b1a ldr r3, [pc, #104] ; (802ef1c <icmp_get_value+0xd8>)
  46852. 802eeb2: e00e b.n 802eed2 <icmp_get_value+0x8e>
  46853. break;
  46854. case 19: /* icmpOutSrcQuenchs */
  46855. *uint_ptr = icmpoutsrcquenchs;
  46856. 802eeb4: 4b1a ldr r3, [pc, #104] ; (802ef20 <icmp_get_value+0xdc>)
  46857. 802eeb6: e00c b.n 802eed2 <icmp_get_value+0x8e>
  46858. break;
  46859. case 20: /* icmpOutRedirects */
  46860. *uint_ptr = icmpoutredirects;
  46861. 802eeb8: 4b1a ldr r3, [pc, #104] ; (802ef24 <icmp_get_value+0xe0>)
  46862. 802eeba: e00a b.n 802eed2 <icmp_get_value+0x8e>
  46863. break;
  46864. case 21: /* icmpOutEchos */
  46865. *uint_ptr = icmpoutechos;
  46866. 802eebc: 4b1a ldr r3, [pc, #104] ; (802ef28 <icmp_get_value+0xe4>)
  46867. 802eebe: e008 b.n 802eed2 <icmp_get_value+0x8e>
  46868. break;
  46869. case 22: /* icmpOutEchoReps */
  46870. *uint_ptr = icmpoutechoreps;
  46871. 802eec0: 4b1a ldr r3, [pc, #104] ; (802ef2c <icmp_get_value+0xe8>)
  46872. 802eec2: e006 b.n 802eed2 <icmp_get_value+0x8e>
  46873. break;
  46874. case 23: /* icmpOutTimestamps */
  46875. *uint_ptr = icmpouttimestamps;
  46876. 802eec4: 4b1a ldr r3, [pc, #104] ; (802ef30 <icmp_get_value+0xec>)
  46877. 802eec6: e004 b.n 802eed2 <icmp_get_value+0x8e>
  46878. break;
  46879. case 24: /* icmpOutTimestampReps */
  46880. *uint_ptr = icmpouttimestampreps;
  46881. 802eec8: 4b1a ldr r3, [pc, #104] ; (802ef34 <icmp_get_value+0xf0>)
  46882. 802eeca: e002 b.n 802eed2 <icmp_get_value+0x8e>
  46883. break;
  46884. case 25: /* icmpOutAddrMasks */
  46885. *uint_ptr = icmpoutaddrmasks;
  46886. 802eecc: 4b1a ldr r3, [pc, #104] ; (802ef38 <icmp_get_value+0xf4>)
  46887. 802eece: e000 b.n 802eed2 <icmp_get_value+0x8e>
  46888. break;
  46889. case 26: /* icmpOutAddrMaskReps */
  46890. *uint_ptr = icmpoutaddrmaskreps;
  46891. 802eed0: 4b1a ldr r3, [pc, #104] ; (802ef3c <icmp_get_value+0xf8>)
  46892. 802eed2: 681b ldr r3, [r3, #0]
  46893. 802eed4: 6013 str r3, [r2, #0]
  46894. 802eed6: 4770 bx lr
  46895. 802eed8: 2000e128 .word 0x2000e128
  46896. 802eedc: 2000e124 .word 0x2000e124
  46897. 802eee0: 2000e100 .word 0x2000e100
  46898. 802eee4: 2000e1e4 .word 0x2000e1e4
  46899. 802eee8: 2000e218 .word 0x2000e218
  46900. 802eeec: 2000e110 .word 0x2000e110
  46901. 802eef0: 2000e13c .word 0x2000e13c
  46902. 802eef4: 2000e1dc .word 0x2000e1dc
  46903. 802eef8: 2000e154 .word 0x2000e154
  46904. 802eefc: 2000e144 .word 0x2000e144
  46905. 802ef00: 2000e184 .word 0x2000e184
  46906. 802ef04: 2000e21c .word 0x2000e21c
  46907. 802ef08: 2000e1b8 .word 0x2000e1b8
  46908. 802ef0c: 2000e1a8 .word 0x2000e1a8
  46909. 802ef10: 2000e22c .word 0x2000e22c
  46910. 802ef14: 2000e1c0 .word 0x2000e1c0
  46911. 802ef18: 2000e174 .word 0x2000e174
  46912. 802ef1c: 2000e138 .word 0x2000e138
  46913. 802ef20: 2000e18c .word 0x2000e18c
  46914. 802ef24: 2000e148 .word 0x2000e148
  46915. 802ef28: 2000e228 .word 0x2000e228
  46916. 802ef2c: 2000e1c8 .word 0x2000e1c8
  46917. 802ef30: 2000e194 .word 0x2000e194
  46918. 802ef34: 2000e178 .word 0x2000e178
  46919. 802ef38: 2000e140 .word 0x2000e140
  46920. 802ef3c: 2000e1a0 .word 0x2000e1a0
  46921. 0802ef40 <tcp_get_value>:
  46922. s32_t *sint_ptr = (s32_t*)value;
  46923. u8_t id;
  46924. LWIP_UNUSED_ARG(len);
  46925. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  46926. id = (u8_t)od->id_inst_ptr[0];
  46927. 802ef40: 6883 ldr r3, [r0, #8]
  46928. switch (id)
  46929. 802ef42: 781b ldrb r3, [r3, #0]
  46930. 802ef44: 3b01 subs r3, #1
  46931. 802ef46: 2b0e cmp r3, #14
  46932. 802ef48: d836 bhi.n 802efb8 <tcp_get_value+0x78>
  46933. 802ef4a: e8df f003 tbb [pc, r3]
  46934. 802ef4e: 0a08 .short 0x0a08
  46935. 802ef50: 1412100d .word 0x1412100d
  46936. 802ef54: 2a1a1816 .word 0x2a1a1816
  46937. 802ef58: 30352e2c .word 0x30352e2c
  46938. 802ef5c: 32 .byte 0x32
  46939. 802ef5d: 00 .byte 0x00
  46940. {
  46941. case 1: /* tcpRtoAlgorithm, vanj(4) */
  46942. *sint_ptr = 4;
  46943. 802ef5e: 2304 movs r3, #4
  46944. 802ef60: e029 b.n 802efb6 <tcp_get_value+0x76>
  46945. break;
  46946. case 2: /* tcpRtoMin */
  46947. /* @todo not the actual value, a guess,
  46948. needs to be calculated */
  46949. *sint_ptr = 1000;
  46950. 802ef62: f44f 737a mov.w r3, #1000 ; 0x3e8
  46951. 802ef66: e026 b.n 802efb6 <tcp_get_value+0x76>
  46952. break;
  46953. case 3: /* tcpRtoMax */
  46954. /* @todo not the actual value, a guess,
  46955. needs to be calculated */
  46956. *sint_ptr = 60000;
  46957. 802ef68: f64e 2360 movw r3, #60000 ; 0xea60
  46958. 802ef6c: e023 b.n 802efb6 <tcp_get_value+0x76>
  46959. break;
  46960. case 4: /* tcpMaxConn */
  46961. *sint_ptr = MEMP_NUM_TCP_PCB;
  46962. 802ef6e: 230c movs r3, #12
  46963. 802ef70: e021 b.n 802efb6 <tcp_get_value+0x76>
  46964. break;
  46965. case 5: /* tcpActiveOpens */
  46966. *uint_ptr = tcpactiveopens;
  46967. 802ef72: 4b12 ldr r3, [pc, #72] ; (802efbc <tcp_get_value+0x7c>)
  46968. 802ef74: e01e b.n 802efb4 <tcp_get_value+0x74>
  46969. break;
  46970. case 6: /* tcpPassiveOpens */
  46971. *uint_ptr = tcppassiveopens;
  46972. 802ef76: 4b12 ldr r3, [pc, #72] ; (802efc0 <tcp_get_value+0x80>)
  46973. 802ef78: e01c b.n 802efb4 <tcp_get_value+0x74>
  46974. break;
  46975. case 7: /* tcpAttemptFails */
  46976. *uint_ptr = tcpattemptfails;
  46977. 802ef7a: 4b12 ldr r3, [pc, #72] ; (802efc4 <tcp_get_value+0x84>)
  46978. 802ef7c: e01a b.n 802efb4 <tcp_get_value+0x74>
  46979. break;
  46980. case 8: /* tcpEstabResets */
  46981. *uint_ptr = tcpestabresets;
  46982. 802ef7e: 4b12 ldr r3, [pc, #72] ; (802efc8 <tcp_get_value+0x88>)
  46983. 802ef80: e018 b.n 802efb4 <tcp_get_value+0x74>
  46984. break;
  46985. case 9: /* tcpCurrEstab */
  46986. {
  46987. u16_t tcpcurrestab = 0;
  46988. struct tcp_pcb *pcb = tcp_active_pcbs;
  46989. 802ef82: 4b12 ldr r3, [pc, #72] ; (802efcc <tcp_get_value+0x8c>)
  46990. case 8: /* tcpEstabResets */
  46991. *uint_ptr = tcpestabresets;
  46992. break;
  46993. case 9: /* tcpCurrEstab */
  46994. {
  46995. u16_t tcpcurrestab = 0;
  46996. 802ef84: 2100 movs r1, #0
  46997. struct tcp_pcb *pcb = tcp_active_pcbs;
  46998. 802ef86: 681b ldr r3, [r3, #0]
  46999. while (pcb != NULL)
  47000. 802ef88: e007 b.n 802ef9a <tcp_get_value+0x5a>
  47001. {
  47002. if ((pcb->state == ESTABLISHED) ||
  47003. 802ef8a: 7e18 ldrb r0, [r3, #24]
  47004. 802ef8c: 2804 cmp r0, #4
  47005. 802ef8e: d001 beq.n 802ef94 <tcp_get_value+0x54>
  47006. 802ef90: 2807 cmp r0, #7
  47007. 802ef92: d101 bne.n 802ef98 <tcp_get_value+0x58>
  47008. (pcb->state == CLOSE_WAIT))
  47009. {
  47010. tcpcurrestab++;
  47011. 802ef94: 3101 adds r1, #1
  47012. 802ef96: b289 uxth r1, r1
  47013. }
  47014. pcb = pcb->next;
  47015. 802ef98: 68db ldr r3, [r3, #12]
  47016. break;
  47017. case 9: /* tcpCurrEstab */
  47018. {
  47019. u16_t tcpcurrestab = 0;
  47020. struct tcp_pcb *pcb = tcp_active_pcbs;
  47021. while (pcb != NULL)
  47022. 802ef9a: 2b00 cmp r3, #0
  47023. 802ef9c: d1f5 bne.n 802ef8a <tcp_get_value+0x4a>
  47024. {
  47025. tcpcurrestab++;
  47026. }
  47027. pcb = pcb->next;
  47028. }
  47029. *uint_ptr = tcpcurrestab;
  47030. 802ef9e: 6011 str r1, [r2, #0]
  47031. }
  47032. break;
  47033. 802efa0: 4770 bx lr
  47034. case 10: /* tcpInSegs */
  47035. *uint_ptr = tcpinsegs;
  47036. 802efa2: 4b0b ldr r3, [pc, #44] ; (802efd0 <tcp_get_value+0x90>)
  47037. 802efa4: e006 b.n 802efb4 <tcp_get_value+0x74>
  47038. break;
  47039. case 11: /* tcpOutSegs */
  47040. *uint_ptr = tcpoutsegs;
  47041. 802efa6: 4b0b ldr r3, [pc, #44] ; (802efd4 <tcp_get_value+0x94>)
  47042. 802efa8: e004 b.n 802efb4 <tcp_get_value+0x74>
  47043. break;
  47044. case 12: /* tcpRetransSegs */
  47045. *uint_ptr = tcpretranssegs;
  47046. 802efaa: 4b0b ldr r3, [pc, #44] ; (802efd8 <tcp_get_value+0x98>)
  47047. 802efac: e002 b.n 802efb4 <tcp_get_value+0x74>
  47048. break;
  47049. case 14: /* tcpInErrs */
  47050. *uint_ptr = tcpinerrs;
  47051. 802efae: 4b0b ldr r3, [pc, #44] ; (802efdc <tcp_get_value+0x9c>)
  47052. 802efb0: e000 b.n 802efb4 <tcp_get_value+0x74>
  47053. break;
  47054. case 15: /* tcpOutRsts */
  47055. *uint_ptr = tcpoutrsts;
  47056. 802efb2: 4b0b ldr r3, [pc, #44] ; (802efe0 <tcp_get_value+0xa0>)
  47057. 802efb4: 681b ldr r3, [r3, #0]
  47058. 802efb6: 6013 str r3, [r2, #0]
  47059. 802efb8: 4770 bx lr
  47060. 802efba: bf00 nop
  47061. 802efbc: 2000e11c .word 0x2000e11c
  47062. 802efc0: 2000e150 .word 0x2000e150
  47063. 802efc4: 2000e19c .word 0x2000e19c
  47064. 802efc8: 2000e130 .word 0x2000e130
  47065. 802efcc: 20010d78 .word 0x20010d78
  47066. 802efd0: 2000e1ac .word 0x2000e1ac
  47067. 802efd4: 2000e1f8 .word 0x2000e1f8
  47068. 802efd8: 2000e1cc .word 0x2000e1cc
  47069. 802efdc: 2000e158 .word 0x2000e158
  47070. 802efe0: 2000e1bc .word 0x2000e1bc
  47071. 0802efe4 <udp_get_object_def>:
  47072. udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  47073. {
  47074. /* return to object name, adding index depth (1) */
  47075. ident_len += 1;
  47076. ident -= 1;
  47077. if ((ident_len == 2) &&
  47078. 802efe4: 2801 cmp r0, #1
  47079. 802efe6: d110 bne.n 802f00a <udp_get_object_def+0x26>
  47080. (ident[0] > 0) && (ident[0] < 6))
  47081. 802efe8: f851 3c04 ldr.w r3, [r1, #-4]
  47082. udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  47083. {
  47084. /* return to object name, adding index depth (1) */
  47085. ident_len += 1;
  47086. ident -= 1;
  47087. if ((ident_len == 2) &&
  47088. 802efec: 2b00 cmp r3, #0
  47089. 802efee: dd0c ble.n 802f00a <udp_get_object_def+0x26>
  47090. (ident[0] > 0) && (ident[0] < 6))
  47091. 802eff0: 2b05 cmp r3, #5
  47092. 802eff2: dc0a bgt.n 802f00a <udp_get_object_def+0x26>
  47093. {
  47094. od->id_inst_len = ident_len;
  47095. 802eff4: 2302 movs r3, #2
  47096. 802eff6: 7193 strb r3, [r2, #6]
  47097. od->id_inst_ptr = ident;
  47098. od->instance = MIB_OBJECT_SCALAR;
  47099. od->access = MIB_OBJECT_READ_ONLY;
  47100. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  47101. 802eff8: 2341 movs r3, #65 ; 0x41
  47102. static void
  47103. udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  47104. {
  47105. /* return to object name, adding index depth (1) */
  47106. ident_len += 1;
  47107. ident -= 1;
  47108. 802effa: 3904 subs r1, #4
  47109. od->id_inst_len = ident_len;
  47110. od->id_inst_ptr = ident;
  47111. od->instance = MIB_OBJECT_SCALAR;
  47112. od->access = MIB_OBJECT_READ_ONLY;
  47113. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  47114. 802effc: 7093 strb r3, [r2, #2]
  47115. od->v_len = sizeof(u32_t);
  47116. 802effe: 2304 movs r3, #4
  47117. ident -= 1;
  47118. if ((ident_len == 2) &&
  47119. (ident[0] > 0) && (ident[0] < 6))
  47120. {
  47121. od->id_inst_len = ident_len;
  47122. od->id_inst_ptr = ident;
  47123. 802f000: 6091 str r1, [r2, #8]
  47124. od->instance = MIB_OBJECT_SCALAR;
  47125. 802f002: 7010 strb r0, [r2, #0]
  47126. od->access = MIB_OBJECT_READ_ONLY;
  47127. 802f004: 7050 strb r0, [r2, #1]
  47128. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  47129. od->v_len = sizeof(u32_t);
  47130. 802f006: 8093 strh r3, [r2, #4]
  47131. 802f008: 4770 bx lr
  47132. }
  47133. else
  47134. {
  47135. LWIP_DEBUGF(SNMP_MIB_DEBUG,("udp_get_object_def: no scalar\n"));
  47136. od->instance = MIB_OBJECT_NONE;
  47137. 802f00a: 2300 movs r3, #0
  47138. 802f00c: 7013 strb r3, [r2, #0]
  47139. 802f00e: 4770 bx lr
  47140. 0802f010 <udp_get_value>:
  47141. u32_t *uint_ptr = (u32_t*)value;
  47142. u8_t id;
  47143. LWIP_UNUSED_ARG(len);
  47144. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  47145. id = (u8_t)od->id_inst_ptr[0];
  47146. 802f010: 6883 ldr r3, [r0, #8]
  47147. switch (id)
  47148. 802f012: 781b ldrb r3, [r3, #0]
  47149. 802f014: 3b01 subs r3, #1
  47150. 802f016: 2b03 cmp r3, #3
  47151. 802f018: d80c bhi.n 802f034 <udp_get_value+0x24>
  47152. 802f01a: e8df f003 tbb [pc, r3]
  47153. 802f01e: 0402 .short 0x0402
  47154. 802f020: 0806 .short 0x0806
  47155. {
  47156. case 1: /* udpInDatagrams */
  47157. *uint_ptr = udpindatagrams;
  47158. 802f022: 4b05 ldr r3, [pc, #20] ; (802f038 <udp_get_value+0x28>)
  47159. 802f024: e004 b.n 802f030 <udp_get_value+0x20>
  47160. break;
  47161. case 2: /* udpNoPorts */
  47162. *uint_ptr = udpnoports;
  47163. 802f026: 4b05 ldr r3, [pc, #20] ; (802f03c <udp_get_value+0x2c>)
  47164. 802f028: e002 b.n 802f030 <udp_get_value+0x20>
  47165. break;
  47166. case 3: /* udpInErrors */
  47167. *uint_ptr = udpinerrors;
  47168. 802f02a: 4b05 ldr r3, [pc, #20] ; (802f040 <udp_get_value+0x30>)
  47169. 802f02c: e000 b.n 802f030 <udp_get_value+0x20>
  47170. break;
  47171. case 4: /* udpOutDatagrams */
  47172. *uint_ptr = udpoutdatagrams;
  47173. 802f02e: 4b05 ldr r3, [pc, #20] ; (802f044 <udp_get_value+0x34>)
  47174. 802f030: 681b ldr r3, [r3, #0]
  47175. 802f032: 6013 str r3, [r2, #0]
  47176. 802f034: 4770 bx lr
  47177. 802f036: bf00 nop
  47178. 802f038: 2000e1d8 .word 0x2000e1d8
  47179. 802f03c: 2000e190 .word 0x2000e190
  47180. 802f040: 2000e200 .word 0x2000e200
  47181. 802f044: 2000e188 .word 0x2000e188
  47182. 0802f048 <snmp_get_value>:
  47183. u32_t *uint_ptr = (u32_t*)value;
  47184. u8_t id;
  47185. LWIP_UNUSED_ARG(len);
  47186. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  47187. id = (u8_t)od->id_inst_ptr[0];
  47188. 802f048: 6883 ldr r3, [r0, #8]
  47189. switch (id)
  47190. 802f04a: 781b ldrb r3, [r3, #0]
  47191. 802f04c: 3b01 subs r3, #1
  47192. 802f04e: 2b1d cmp r3, #29
  47193. 802f050: d84b bhi.n 802f0ea <snmp_get_value+0xa2>
  47194. 802f052: e8df f003 tbb [pc, r3]
  47195. 802f056: 110f .short 0x110f
  47196. 802f058: 19171513 .word 0x19171513
  47197. 802f05c: 1f1d1b4a .word 0x1f1d1b4a
  47198. 802f060: 27252321 .word 0x27252321
  47199. 802f064: 2f2d2b29 .word 0x2f2d2b29
  47200. 802f068: 37353331 .word 0x37353331
  47201. 802f06c: 3d3b394a .word 0x3d3b394a
  47202. 802f070: 4643413f .word 0x4643413f
  47203. {
  47204. case 1: /* snmpInPkts */
  47205. *uint_ptr = snmpinpkts;
  47206. 802f074: 4b1d ldr r3, [pc, #116] ; (802f0ec <snmp_get_value+0xa4>)
  47207. 802f076: e032 b.n 802f0de <snmp_get_value+0x96>
  47208. break;
  47209. case 2: /* snmpOutPkts */
  47210. *uint_ptr = snmpoutpkts;
  47211. 802f078: 4b1d ldr r3, [pc, #116] ; (802f0f0 <snmp_get_value+0xa8>)
  47212. 802f07a: e030 b.n 802f0de <snmp_get_value+0x96>
  47213. break;
  47214. case 3: /* snmpInBadVersions */
  47215. *uint_ptr = snmpinbadversions;
  47216. 802f07c: 4b1d ldr r3, [pc, #116] ; (802f0f4 <snmp_get_value+0xac>)
  47217. 802f07e: e02e b.n 802f0de <snmp_get_value+0x96>
  47218. break;
  47219. case 4: /* snmpInBadCommunityNames */
  47220. *uint_ptr = snmpinbadcommunitynames;
  47221. 802f080: 4b1d ldr r3, [pc, #116] ; (802f0f8 <snmp_get_value+0xb0>)
  47222. 802f082: e02c b.n 802f0de <snmp_get_value+0x96>
  47223. break;
  47224. case 5: /* snmpInBadCommunityUses */
  47225. *uint_ptr = snmpinbadcommunityuses;
  47226. 802f084: 4b1d ldr r3, [pc, #116] ; (802f0fc <snmp_get_value+0xb4>)
  47227. 802f086: e02a b.n 802f0de <snmp_get_value+0x96>
  47228. break;
  47229. case 6: /* snmpInASNParseErrs */
  47230. *uint_ptr = snmpinasnparseerrs;
  47231. 802f088: 4b1d ldr r3, [pc, #116] ; (802f100 <snmp_get_value+0xb8>)
  47232. 802f08a: e028 b.n 802f0de <snmp_get_value+0x96>
  47233. break;
  47234. case 8: /* snmpInTooBigs */
  47235. *uint_ptr = snmpintoobigs;
  47236. 802f08c: 4b1d ldr r3, [pc, #116] ; (802f104 <snmp_get_value+0xbc>)
  47237. 802f08e: e026 b.n 802f0de <snmp_get_value+0x96>
  47238. break;
  47239. case 9: /* snmpInNoSuchNames */
  47240. *uint_ptr = snmpinnosuchnames;
  47241. 802f090: 4b1d ldr r3, [pc, #116] ; (802f108 <snmp_get_value+0xc0>)
  47242. 802f092: e024 b.n 802f0de <snmp_get_value+0x96>
  47243. break;
  47244. case 10: /* snmpInBadValues */
  47245. *uint_ptr = snmpinbadvalues;
  47246. 802f094: 4b1d ldr r3, [pc, #116] ; (802f10c <snmp_get_value+0xc4>)
  47247. 802f096: e022 b.n 802f0de <snmp_get_value+0x96>
  47248. break;
  47249. case 11: /* snmpInReadOnlys */
  47250. *uint_ptr = snmpinreadonlys;
  47251. 802f098: 4b1d ldr r3, [pc, #116] ; (802f110 <snmp_get_value+0xc8>)
  47252. 802f09a: e020 b.n 802f0de <snmp_get_value+0x96>
  47253. break;
  47254. case 12: /* snmpInGenErrs */
  47255. *uint_ptr = snmpingenerrs;
  47256. 802f09c: 4b1d ldr r3, [pc, #116] ; (802f114 <snmp_get_value+0xcc>)
  47257. 802f09e: e01e b.n 802f0de <snmp_get_value+0x96>
  47258. break;
  47259. case 13: /* snmpInTotalReqVars */
  47260. *uint_ptr = snmpintotalreqvars;
  47261. 802f0a0: 4b1d ldr r3, [pc, #116] ; (802f118 <snmp_get_value+0xd0>)
  47262. 802f0a2: e01c b.n 802f0de <snmp_get_value+0x96>
  47263. break;
  47264. case 14: /* snmpInTotalSetVars */
  47265. *uint_ptr = snmpintotalsetvars;
  47266. 802f0a4: 4b1d ldr r3, [pc, #116] ; (802f11c <snmp_get_value+0xd4>)
  47267. 802f0a6: e01a b.n 802f0de <snmp_get_value+0x96>
  47268. break;
  47269. case 15: /* snmpInGetRequests */
  47270. *uint_ptr = snmpingetrequests;
  47271. 802f0a8: 4b1d ldr r3, [pc, #116] ; (802f120 <snmp_get_value+0xd8>)
  47272. 802f0aa: e018 b.n 802f0de <snmp_get_value+0x96>
  47273. break;
  47274. case 16: /* snmpInGetNexts */
  47275. *uint_ptr = snmpingetnexts;
  47276. 802f0ac: 4b1d ldr r3, [pc, #116] ; (802f124 <snmp_get_value+0xdc>)
  47277. 802f0ae: e016 b.n 802f0de <snmp_get_value+0x96>
  47278. break;
  47279. case 17: /* snmpInSetRequests */
  47280. *uint_ptr = snmpinsetrequests;
  47281. 802f0b0: 4b1d ldr r3, [pc, #116] ; (802f128 <snmp_get_value+0xe0>)
  47282. 802f0b2: e014 b.n 802f0de <snmp_get_value+0x96>
  47283. break;
  47284. case 18: /* snmpInGetResponses */
  47285. *uint_ptr = snmpingetresponses;
  47286. 802f0b4: 4b1d ldr r3, [pc, #116] ; (802f12c <snmp_get_value+0xe4>)
  47287. 802f0b6: e012 b.n 802f0de <snmp_get_value+0x96>
  47288. break;
  47289. case 19: /* snmpInTraps */
  47290. *uint_ptr = snmpintraps;
  47291. 802f0b8: 4b1d ldr r3, [pc, #116] ; (802f130 <snmp_get_value+0xe8>)
  47292. 802f0ba: e010 b.n 802f0de <snmp_get_value+0x96>
  47293. break;
  47294. case 20: /* snmpOutTooBigs */
  47295. *uint_ptr = snmpouttoobigs;
  47296. 802f0bc: 4b1d ldr r3, [pc, #116] ; (802f134 <snmp_get_value+0xec>)
  47297. 802f0be: e00e b.n 802f0de <snmp_get_value+0x96>
  47298. break;
  47299. case 21: /* snmpOutNoSuchNames */
  47300. *uint_ptr = snmpoutnosuchnames;
  47301. 802f0c0: 4b1d ldr r3, [pc, #116] ; (802f138 <snmp_get_value+0xf0>)
  47302. 802f0c2: e00c b.n 802f0de <snmp_get_value+0x96>
  47303. break;
  47304. case 22: /* snmpOutBadValues */
  47305. *uint_ptr = snmpoutbadvalues;
  47306. 802f0c4: 4b1d ldr r3, [pc, #116] ; (802f13c <snmp_get_value+0xf4>)
  47307. 802f0c6: e00a b.n 802f0de <snmp_get_value+0x96>
  47308. break;
  47309. case 24: /* snmpOutGenErrs */
  47310. *uint_ptr = snmpoutgenerrs;
  47311. 802f0c8: 4b1d ldr r3, [pc, #116] ; (802f140 <snmp_get_value+0xf8>)
  47312. 802f0ca: e008 b.n 802f0de <snmp_get_value+0x96>
  47313. break;
  47314. case 25: /* snmpOutGetRequests */
  47315. *uint_ptr = snmpoutgetrequests;
  47316. 802f0cc: 4b1d ldr r3, [pc, #116] ; (802f144 <snmp_get_value+0xfc>)
  47317. 802f0ce: e006 b.n 802f0de <snmp_get_value+0x96>
  47318. break;
  47319. case 26: /* snmpOutGetNexts */
  47320. *uint_ptr = snmpoutgetnexts;
  47321. 802f0d0: 4b1d ldr r3, [pc, #116] ; (802f148 <snmp_get_value+0x100>)
  47322. 802f0d2: e004 b.n 802f0de <snmp_get_value+0x96>
  47323. break;
  47324. case 27: /* snmpOutSetRequests */
  47325. *uint_ptr = snmpoutsetrequests;
  47326. 802f0d4: 4b1d ldr r3, [pc, #116] ; (802f14c <snmp_get_value+0x104>)
  47327. 802f0d6: e002 b.n 802f0de <snmp_get_value+0x96>
  47328. break;
  47329. case 28: /* snmpOutGetResponses */
  47330. *uint_ptr = snmpoutgetresponses;
  47331. 802f0d8: 4b1d ldr r3, [pc, #116] ; (802f150 <snmp_get_value+0x108>)
  47332. 802f0da: e000 b.n 802f0de <snmp_get_value+0x96>
  47333. break;
  47334. case 29: /* snmpOutTraps */
  47335. *uint_ptr = snmpouttraps;
  47336. 802f0dc: 4b1d ldr r3, [pc, #116] ; (802f154 <snmp_get_value+0x10c>)
  47337. 802f0de: 681b ldr r3, [r3, #0]
  47338. 802f0e0: e002 b.n 802f0e8 <snmp_get_value+0xa0>
  47339. break;
  47340. case 30: /* snmpEnableAuthenTraps */
  47341. *uint_ptr = *snmpenableauthentraps_ptr;
  47342. 802f0e2: 4b1d ldr r3, [pc, #116] ; (802f158 <snmp_get_value+0x110>)
  47343. 802f0e4: 681b ldr r3, [r3, #0]
  47344. 802f0e6: 781b ldrb r3, [r3, #0]
  47345. 802f0e8: 6013 str r3, [r2, #0]
  47346. 802f0ea: 4770 bx lr
  47347. 802f0ec: 2000e134 .word 0x2000e134
  47348. 802f0f0: 2000e204 .word 0x2000e204
  47349. 802f0f4: 2000e1f0 .word 0x2000e1f0
  47350. 802f0f8: 2000e108 .word 0x2000e108
  47351. 802f0fc: 2000e10c .word 0x2000e10c
  47352. 802f100: 2000e1f4 .word 0x2000e1f4
  47353. 802f104: 2000e1b4 .word 0x2000e1b4
  47354. 802f108: 2000e234 .word 0x2000e234
  47355. 802f10c: 2000e1d0 .word 0x2000e1d0
  47356. 802f110: 2000e1a4 .word 0x2000e1a4
  47357. 802f114: 2000e17c .word 0x2000e17c
  47358. 802f118: 2000e1d4 .word 0x2000e1d4
  47359. 802f11c: 2000e114 .word 0x2000e114
  47360. 802f120: 2000e168 .word 0x2000e168
  47361. 802f124: 2000e0ec .word 0x2000e0ec
  47362. 802f128: 2000e210 .word 0x2000e210
  47363. 802f12c: 2000e164 .word 0x2000e164
  47364. 802f130: 2000e0fc .word 0x2000e0fc
  47365. 802f134: 2000e14c .word 0x2000e14c
  47366. 802f138: 2000e118 .word 0x2000e118
  47367. 802f13c: 2000e0f8 .word 0x2000e0f8
  47368. 802f140: 2000e238 .word 0x2000e238
  47369. 802f144: 2000e170 .word 0x2000e170
  47370. 802f148: 2000e208 .word 0x2000e208
  47371. 802f14c: 2000e214 .word 0x2000e214
  47372. 802f150: 2000e0f4 .word 0x2000e0f4
  47373. 802f154: 2000e16c .word 0x2000e16c
  47374. 802f158: 20001760 .word 0x20001760
  47375. 0802f15c <snmp_set_value>:
  47376. {
  47377. u8_t id;
  47378. LWIP_UNUSED_ARG(len);
  47379. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  47380. id = (u8_t)od->id_inst_ptr[0];
  47381. 802f15c: 6883 ldr r3, [r0, #8]
  47382. if (id == 30)
  47383. 802f15e: 781b ldrb r3, [r3, #0]
  47384. 802f160: 2b1e cmp r3, #30
  47385. 802f162: d103 bne.n 802f16c <snmp_set_value+0x10>
  47386. {
  47387. /* snmpEnableAuthenTraps */
  47388. /* @todo @fixme: which kind of pointer is 'value'? s32_t or u8_t??? */
  47389. u8_t *ptr = (u8_t*)value;
  47390. *snmpenableauthentraps_ptr = *ptr;
  47391. 802f164: 4b02 ldr r3, [pc, #8] ; (802f170 <snmp_set_value+0x14>)
  47392. 802f166: 7812 ldrb r2, [r2, #0]
  47393. 802f168: 681b ldr r3, [r3, #0]
  47394. 802f16a: 701a strb r2, [r3, #0]
  47395. 802f16c: 4770 bx lr
  47396. 802f16e: bf00 nop
  47397. 802f170: 20001760 .word 0x20001760
  47398. 0802f174 <ifentry_get_object_def>:
  47399. u8_t id;
  47400. /* return to object name, adding index depth (1) */
  47401. ident_len += 1;
  47402. ident -= 1;
  47403. if (ident_len == 2)
  47404. 802f174: 2801 cmp r0, #1
  47405. * @param ident points to objectname.index
  47406. * @param od points to object definition.
  47407. */
  47408. static void
  47409. ifentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  47410. {
  47411. 802f176: b513 push {r0, r1, r4, lr}
  47412. 802f178: 4614 mov r4, r2
  47413. u8_t id;
  47414. /* return to object name, adding index depth (1) */
  47415. ident_len += 1;
  47416. ident -= 1;
  47417. if (ident_len == 2)
  47418. 802f17a: d149 bne.n 802f210 <ifentry_get_object_def+0x9c>
  47419. {
  47420. od->id_inst_len = ident_len;
  47421. 802f17c: 2302 movs r3, #2
  47422. 802f17e: 7193 strb r3, [r2, #6]
  47423. {
  47424. u8_t id;
  47425. /* return to object name, adding index depth (1) */
  47426. ident_len += 1;
  47427. ident -= 1;
  47428. 802f180: 1f0a subs r2, r1, #4
  47429. if (ident_len == 2)
  47430. {
  47431. od->id_inst_len = ident_len;
  47432. od->id_inst_ptr = ident;
  47433. 802f182: 60a2 str r2, [r4, #8]
  47434. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  47435. id = (u8_t)ident[0];
  47436. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ifentry.%"U16_F"\n",(u16_t)id));
  47437. switch (id)
  47438. 802f184: f811 2c04 ldrb.w r2, [r1, #-4]
  47439. 802f188: 3a01 subs r2, #1
  47440. 802f18a: 2a15 cmp r2, #21
  47441. 802f18c: d840 bhi.n 802f210 <ifentry_get_object_def+0x9c>
  47442. 802f18e: e8df f002 tbb [pc, r2]
  47443. 802f192: 0e0b .short 0x0e0b
  47444. 802f194: 19140b0b .word 0x19140b0b
  47445. 802f198: 302b0b27 .word 0x302b0b27
  47446. 802f19c: 30303030 .word 0x30303030
  47447. 802f1a0: 30303030 .word 0x30303030
  47448. 802f1a4: 37143030 .word 0x37143030
  47449. {
  47450. case 1: /* ifIndex */
  47451. case 3: /* ifType */
  47452. case 4: /* ifMtu */
  47453. case 8: /* ifOperStatus */
  47454. od->instance = MIB_OBJECT_TAB;
  47455. 802f1a8: 7023 strb r3, [r4, #0]
  47456. od->access = MIB_OBJECT_READ_ONLY;
  47457. 802f1aa: 2201 movs r2, #1
  47458. 802f1ac: e01a b.n 802f1e4 <ifentry_get_object_def+0x70>
  47459. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  47460. od->v_len = sizeof(s32_t);
  47461. break;
  47462. case 2: /* ifDescr */
  47463. od->instance = MIB_OBJECT_TAB;
  47464. od->access = MIB_OBJECT_READ_ONLY;
  47465. 802f1ae: 2201 movs r2, #1
  47466. 802f1b0: 7062 strb r2, [r4, #1]
  47467. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  47468. 802f1b2: 2204 movs r2, #4
  47469. od->access = MIB_OBJECT_READ_ONLY;
  47470. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  47471. od->v_len = sizeof(s32_t);
  47472. break;
  47473. case 2: /* ifDescr */
  47474. od->instance = MIB_OBJECT_TAB;
  47475. 802f1b4: 7023 strb r3, [r4, #0]
  47476. od->access = MIB_OBJECT_READ_ONLY;
  47477. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  47478. 802f1b6: 70a2 strb r2, [r4, #2]
  47479. 802f1b8: e028 b.n 802f20c <ifentry_get_object_def+0x98>
  47480. /** @todo this should be some sort of sizeof(struct netif.name) */
  47481. od->v_len = 2;
  47482. break;
  47483. case 5: /* ifSpeed */
  47484. case 21: /* ifOutQLen */
  47485. od->instance = MIB_OBJECT_TAB;
  47486. 802f1ba: 7023 strb r3, [r4, #0]
  47487. od->access = MIB_OBJECT_READ_ONLY;
  47488. 802f1bc: 2301 movs r3, #1
  47489. 802f1be: 7063 strb r3, [r4, #1]
  47490. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE);
  47491. 802f1c0: 2342 movs r3, #66 ; 0x42
  47492. 802f1c2: e01a b.n 802f1fa <ifentry_get_object_def+0x86>
  47493. break;
  47494. case 6: /* ifPhysAddress */
  47495. {
  47496. struct netif *netif;
  47497. snmp_ifindextonetif(ident[1], &netif);
  47498. 802f1c4: 6808 ldr r0, [r1, #0]
  47499. 802f1c6: a901 add r1, sp, #4
  47500. 802f1c8: f001 f800 bl 80301cc <snmp_ifindextonetif>
  47501. od->instance = MIB_OBJECT_TAB;
  47502. 802f1cc: 2302 movs r3, #2
  47503. 802f1ce: 7023 strb r3, [r4, #0]
  47504. od->access = MIB_OBJECT_READ_ONLY;
  47505. 802f1d0: 2301 movs r3, #1
  47506. 802f1d2: 7063 strb r3, [r4, #1]
  47507. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  47508. 802f1d4: 2304 movs r3, #4
  47509. 802f1d6: 70a3 strb r3, [r4, #2]
  47510. od->v_len = netif->hwaddr_len;
  47511. 802f1d8: 9b01 ldr r3, [sp, #4]
  47512. 802f1da: f893 3026 ldrb.w r3, [r3, #38] ; 0x26
  47513. 802f1de: e015 b.n 802f20c <ifentry_get_object_def+0x98>
  47514. }
  47515. break;
  47516. case 7: /* ifAdminStatus */
  47517. od->instance = MIB_OBJECT_TAB;
  47518. 802f1e0: 7023 strb r3, [r4, #0]
  47519. od->access = MIB_OBJECT_READ_WRITE;
  47520. 802f1e2: 2203 movs r2, #3
  47521. 802f1e4: 7062 strb r2, [r4, #1]
  47522. 802f1e6: e008 b.n 802f1fa <ifentry_get_object_def+0x86>
  47523. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  47524. od->v_len = sizeof(s32_t);
  47525. break;
  47526. case 9: /* ifLastChange */
  47527. od->instance = MIB_OBJECT_TAB;
  47528. 802f1e8: 7023 strb r3, [r4, #0]
  47529. od->access = MIB_OBJECT_READ_ONLY;
  47530. 802f1ea: 2301 movs r3, #1
  47531. 802f1ec: 7063 strb r3, [r4, #1]
  47532. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS);
  47533. 802f1ee: 2343 movs r3, #67 ; 0x43
  47534. 802f1f0: e003 b.n 802f1fa <ifentry_get_object_def+0x86>
  47535. case 16: /* ifOutOctets */
  47536. case 17: /* ifOutUcastPkts */
  47537. case 18: /* ifOutNUcastPkts */
  47538. case 19: /* ifOutDiscarts */
  47539. case 20: /* ifOutErrors */
  47540. od->instance = MIB_OBJECT_TAB;
  47541. 802f1f2: 7023 strb r3, [r4, #0]
  47542. od->access = MIB_OBJECT_READ_ONLY;
  47543. 802f1f4: 2301 movs r3, #1
  47544. 802f1f6: 7063 strb r3, [r4, #1]
  47545. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  47546. 802f1f8: 2341 movs r3, #65 ; 0x41
  47547. 802f1fa: 70a3 strb r3, [r4, #2]
  47548. od->v_len = sizeof(u32_t);
  47549. 802f1fc: 2304 movs r3, #4
  47550. 802f1fe: e005 b.n 802f20c <ifentry_get_object_def+0x98>
  47551. break;
  47552. case 22: /* ifSpecific */
  47553. /** @note returning zeroDotZero (0.0) no media specific MIB support */
  47554. od->instance = MIB_OBJECT_TAB;
  47555. 802f200: 7023 strb r3, [r4, #0]
  47556. od->access = MIB_OBJECT_READ_ONLY;
  47557. 802f202: 2301 movs r3, #1
  47558. 802f204: 7063 strb r3, [r4, #1]
  47559. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
  47560. 802f206: 2306 movs r3, #6
  47561. 802f208: 70a3 strb r3, [r4, #2]
  47562. od->v_len = ifspecific.len * sizeof(s32_t);
  47563. 802f20a: 2308 movs r3, #8
  47564. 802f20c: 80a3 strh r3, [r4, #4]
  47565. break;
  47566. 802f20e: e001 b.n 802f214 <ifentry_get_object_def+0xa0>
  47567. };
  47568. }
  47569. else
  47570. {
  47571. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ifentry_get_object_def: no scalar\n"));
  47572. od->instance = MIB_OBJECT_NONE;
  47573. 802f210: 2300 movs r3, #0
  47574. 802f212: 7023 strb r3, [r4, #0]
  47575. }
  47576. }
  47577. 802f214: bd1c pop {r2, r3, r4, pc}
  47578. 802f216: 0000 movs r0, r0
  47579. 0802f218 <udpentry_get_value>:
  47580. }
  47581. }
  47582. static void
  47583. udpentry_get_value(struct obj_def *od, u16_t len, void *value)
  47584. {
  47585. 802f218: b537 push {r0, r1, r2, r4, r5, lr}
  47586. 802f21a: 4604 mov r4, r0
  47587. struct udp_pcb *pcb;
  47588. ip_addr_t ip;
  47589. u16_t port;
  47590. LWIP_UNUSED_ARG(len);
  47591. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  47592. 802f21c: 6880 ldr r0, [r0, #8]
  47593. 802f21e: a901 add r1, sp, #4
  47594. 802f220: 3004 adds r0, #4
  47595. }
  47596. }
  47597. static void
  47598. udpentry_get_value(struct obj_def *od, u16_t len, void *value)
  47599. {
  47600. 802f222: 4615 mov r5, r2
  47601. struct udp_pcb *pcb;
  47602. ip_addr_t ip;
  47603. u16_t port;
  47604. LWIP_UNUSED_ARG(len);
  47605. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  47606. 802f224: f000 fff0 bl 8030208 <snmp_oidtoip>
  47607. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  47608. port = (u16_t)od->id_inst_ptr[5];
  47609. 802f228: 68a1 ldr r1, [r4, #8]
  47610. pcb = udp_pcbs;
  47611. 802f22a: 4b0c ldr r3, [pc, #48] ; (802f25c <udpentry_get_value+0x44>)
  47612. u16_t port;
  47613. LWIP_UNUSED_ARG(len);
  47614. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  47615. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  47616. port = (u16_t)od->id_inst_ptr[5];
  47617. 802f22c: 8a8a ldrh r2, [r1, #20]
  47618. pcb = udp_pcbs;
  47619. 802f22e: 681b ldr r3, [r3, #0]
  47620. while ((pcb != NULL) &&
  47621. !(ip_addr_cmp(&pcb->local_ip, &ip) &&
  47622. 802f230: 9801 ldr r0, [sp, #4]
  47623. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  47624. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  47625. port = (u16_t)od->id_inst_ptr[5];
  47626. pcb = udp_pcbs;
  47627. while ((pcb != NULL) &&
  47628. 802f232: e000 b.n 802f236 <udpentry_get_value+0x1e>
  47629. !(ip_addr_cmp(&pcb->local_ip, &ip) &&
  47630. (pcb->local_port == port)))
  47631. {
  47632. pcb = pcb->next;
  47633. 802f234: 68db ldr r3, [r3, #12]
  47634. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  47635. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  47636. port = (u16_t)od->id_inst_ptr[5];
  47637. pcb = udp_pcbs;
  47638. while ((pcb != NULL) &&
  47639. 802f236: b17b cbz r3, 802f258 <udpentry_get_value+0x40>
  47640. 802f238: 681c ldr r4, [r3, #0]
  47641. 802f23a: 4284 cmp r4, r0
  47642. 802f23c: d1fa bne.n 802f234 <udpentry_get_value+0x1c>
  47643. !(ip_addr_cmp(&pcb->local_ip, &ip) &&
  47644. (pcb->local_port == port)))
  47645. 802f23e: 8a5c ldrh r4, [r3, #18]
  47646. LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
  47647. port = (u16_t)od->id_inst_ptr[5];
  47648. pcb = udp_pcbs;
  47649. while ((pcb != NULL) &&
  47650. !(ip_addr_cmp(&pcb->local_ip, &ip) &&
  47651. 802f240: 4294 cmp r4, r2
  47652. 802f242: d1f7 bne.n 802f234 <udpentry_get_value+0x1c>
  47653. 802f244: e003 b.n 802f24e <udpentry_get_value+0x36>
  47654. switch (id)
  47655. {
  47656. case 1: /* udpLocalAddress */
  47657. {
  47658. ip_addr_t *dst = (ip_addr_t*)value;
  47659. *dst = pcb->local_ip;
  47660. 802f246: 6028 str r0, [r5, #0]
  47661. }
  47662. break;
  47663. 802f248: e006 b.n 802f258 <udpentry_get_value+0x40>
  47664. case 2: /* udpLocalPort */
  47665. {
  47666. s32_t *sint_ptr = (s32_t*)value;
  47667. *sint_ptr = pcb->local_port;
  47668. 802f24a: 602a str r2, [r5, #0]
  47669. }
  47670. break;
  47671. 802f24c: e004 b.n 802f258 <udpentry_get_value+0x40>
  47672. if (pcb != NULL)
  47673. {
  47674. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  47675. id = (u8_t)od->id_inst_ptr[0];
  47676. switch (id)
  47677. 802f24e: 780b ldrb r3, [r1, #0]
  47678. 802f250: 2b01 cmp r3, #1
  47679. 802f252: d0f8 beq.n 802f246 <udpentry_get_value+0x2e>
  47680. 802f254: 2b02 cmp r3, #2
  47681. 802f256: d0f8 beq.n 802f24a <udpentry_get_value+0x32>
  47682. *sint_ptr = pcb->local_port;
  47683. }
  47684. break;
  47685. }
  47686. }
  47687. }
  47688. 802f258: bd3e pop {r1, r2, r3, r4, r5, pc}
  47689. 802f25a: bf00 nop
  47690. 802f25c: 20010d94 .word 0x20010d94
  47691. 0802f260 <ip_addrentry_get_value>:
  47692. }
  47693. }
  47694. static void
  47695. ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
  47696. {
  47697. 802f260: b573 push {r0, r1, r4, r5, r6, lr}
  47698. 802f262: 4606 mov r6, r0
  47699. u16_t ifidx;
  47700. ip_addr_t ip;
  47701. struct netif *netif = netif_list;
  47702. LWIP_UNUSED_ARG(len);
  47703. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  47704. 802f264: 6880 ldr r0, [r0, #8]
  47705. ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
  47706. {
  47707. u8_t id;
  47708. u16_t ifidx;
  47709. ip_addr_t ip;
  47710. struct netif *netif = netif_list;
  47711. 802f266: 4b18 ldr r3, [pc, #96] ; (802f2c8 <ip_addrentry_get_value+0x68>)
  47712. LWIP_UNUSED_ARG(len);
  47713. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  47714. 802f268: a901 add r1, sp, #4
  47715. 802f26a: 3004 adds r0, #4
  47716. ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
  47717. {
  47718. u8_t id;
  47719. u16_t ifidx;
  47720. ip_addr_t ip;
  47721. struct netif *netif = netif_list;
  47722. 802f26c: 681c ldr r4, [r3, #0]
  47723. }
  47724. }
  47725. static void
  47726. ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
  47727. {
  47728. 802f26e: 4615 mov r5, r2
  47729. u16_t ifidx;
  47730. ip_addr_t ip;
  47731. struct netif *netif = netif_list;
  47732. LWIP_UNUSED_ARG(len);
  47733. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  47734. 802f270: f000 ffca bl 8030208 <snmp_oidtoip>
  47735. ifidx = 0;
  47736. while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
  47737. 802f274: 9901 ldr r1, [sp, #4]
  47738. ip_addr_t ip;
  47739. struct netif *netif = netif_list;
  47740. LWIP_UNUSED_ARG(len);
  47741. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  47742. ifidx = 0;
  47743. 802f276: 2300 movs r3, #0
  47744. while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
  47745. 802f278: e002 b.n 802f280 <ip_addrentry_get_value+0x20>
  47746. {
  47747. netif = netif->next;
  47748. ifidx++;
  47749. 802f27a: 3301 adds r3, #1
  47750. LWIP_UNUSED_ARG(len);
  47751. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  47752. ifidx = 0;
  47753. while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
  47754. {
  47755. netif = netif->next;
  47756. 802f27c: 6824 ldr r4, [r4, #0]
  47757. ifidx++;
  47758. 802f27e: b29b uxth r3, r3
  47759. struct netif *netif = netif_list;
  47760. LWIP_UNUSED_ARG(len);
  47761. snmp_oidtoip(&od->id_inst_ptr[1], &ip);
  47762. ifidx = 0;
  47763. while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
  47764. 802f280: b304 cbz r4, 802f2c4 <ip_addrentry_get_value+0x64>
  47765. 802f282: 6862 ldr r2, [r4, #4]
  47766. 802f284: 4291 cmp r1, r2
  47767. 802f286: d1f8 bne.n 802f27a <ip_addrentry_get_value+0x1a>
  47768. 802f288: e00a b.n 802f2a0 <ip_addrentry_get_value+0x40>
  47769. switch (id)
  47770. {
  47771. case 1: /* ipAdEntAddr */
  47772. {
  47773. ip_addr_t *dst = (ip_addr_t*)value;
  47774. *dst = netif->ip_addr;
  47775. 802f28a: 6863 ldr r3, [r4, #4]
  47776. 802f28c: e006 b.n 802f29c <ip_addrentry_get_value+0x3c>
  47777. }
  47778. break;
  47779. case 2: /* ipAdEntIfIndex */
  47780. {
  47781. s32_t *sint_ptr = (s32_t*)value;
  47782. *sint_ptr = ifidx + 1;
  47783. 802f28e: 3301 adds r3, #1
  47784. 802f290: e004 b.n 802f29c <ip_addrentry_get_value+0x3c>
  47785. }
  47786. break;
  47787. case 3: /* ipAdEntNetMask */
  47788. {
  47789. ip_addr_t *dst = (ip_addr_t*)value;
  47790. *dst = netif->netmask;
  47791. 802f292: 68a3 ldr r3, [r4, #8]
  47792. 802f294: e002 b.n 802f29c <ip_addrentry_get_value+0x3c>
  47793. {
  47794. s32_t *sint_ptr = (s32_t*)value;
  47795. /* lwIP oddity, there's no broadcast
  47796. address in the netif we can rely on */
  47797. *sint_ptr = IPADDR_BROADCAST & 1;
  47798. 802f296: 2301 movs r3, #1
  47799. 802f298: e000 b.n 802f29c <ip_addrentry_get_value+0x3c>
  47800. *sint_ptr = (IP_HLEN + ((IP_REASS_MAX_PBUFS/2) *
  47801. (PBUF_POOL_BUFSIZE - PBUF_LINK_HLEN - IP_HLEN)));
  47802. #else
  47803. /** @todo returning MTU would be a bad thing and
  47804. returning a wild guess like '576' isn't good either */
  47805. *sint_ptr = 0;
  47806. 802f29a: 2300 movs r3, #0
  47807. 802f29c: 602b str r3, [r5, #0]
  47808. #endif
  47809. }
  47810. break;
  47811. 802f29e: e011 b.n 802f2c4 <ip_addrentry_get_value+0x64>
  47812. }
  47813. if (netif != NULL)
  47814. {
  47815. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  47816. id = (u8_t)od->id_inst_ptr[0];
  47817. 802f2a0: 68b2 ldr r2, [r6, #8]
  47818. switch (id)
  47819. 802f2a2: 7812 ldrb r2, [r2, #0]
  47820. 802f2a4: 3a01 subs r2, #1
  47821. 802f2a6: 2a04 cmp r2, #4
  47822. 802f2a8: d80c bhi.n 802f2c4 <ip_addrentry_get_value+0x64>
  47823. 802f2aa: a101 add r1, pc, #4 ; (adr r1, 802f2b0 <ip_addrentry_get_value+0x50>)
  47824. 802f2ac: f851 f022 ldr.w pc, [r1, r2, lsl #2]
  47825. 802f2b0: 0802f28b .word 0x0802f28b
  47826. 802f2b4: 0802f28f .word 0x0802f28f
  47827. 802f2b8: 0802f293 .word 0x0802f293
  47828. 802f2bc: 0802f297 .word 0x0802f297
  47829. 802f2c0: 0802f29b .word 0x0802f29b
  47830. #endif
  47831. }
  47832. break;
  47833. }
  47834. }
  47835. }
  47836. 802f2c4: bd7c pop {r2, r3, r4, r5, r6, pc}
  47837. 802f2c6: bf00 nop
  47838. 802f2c8: 20010d6c .word 0x20010d6c
  47839. 0802f2cc <ip_ntomentry_get_value>:
  47840. }
  47841. }
  47842. static void
  47843. ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
  47844. {
  47845. 802f2cc: b530 push {r4, r5, lr}
  47846. struct netif *netif;
  47847. LWIP_UNUSED_ARG(len);
  47848. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  47849. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  47850. 802f2ce: 6883 ldr r3, [r0, #8]
  47851. }
  47852. }
  47853. static void
  47854. ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
  47855. {
  47856. 802f2d0: b085 sub sp, #20
  47857. 802f2d2: 4605 mov r5, r0
  47858. struct netif *netif;
  47859. LWIP_UNUSED_ARG(len);
  47860. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  47861. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  47862. 802f2d4: a903 add r1, sp, #12
  47863. 802f2d6: 6858 ldr r0, [r3, #4]
  47864. }
  47865. }
  47866. static void
  47867. ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
  47868. {
  47869. 802f2d8: 4614 mov r4, r2
  47870. struct netif *netif;
  47871. LWIP_UNUSED_ARG(len);
  47872. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  47873. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  47874. 802f2da: f000 ff77 bl 80301cc <snmp_ifindextonetif>
  47875. snmp_oidtoip(&od->id_inst_ptr[2], &ip);
  47876. 802f2de: 68a8 ldr r0, [r5, #8]
  47877. 802f2e0: a902 add r1, sp, #8
  47878. 802f2e2: 3008 adds r0, #8
  47879. 802f2e4: f000 ff90 bl 8030208 <snmp_oidtoip>
  47880. #if LWIP_ARP /** @todo implement a netif_find_addr */
  47881. if (etharp_find_addr(netif, &ip, &ethaddr_ret, &ipaddr_ret) > -1)
  47882. 802f2e8: 9803 ldr r0, [sp, #12]
  47883. 802f2ea: a902 add r1, sp, #8
  47884. 802f2ec: 466a mov r2, sp
  47885. 802f2ee: ab01 add r3, sp, #4
  47886. 802f2f0: f002 ffca bl 8032288 <etharp_find_addr>
  47887. 802f2f4: 2800 cmp r0, #0
  47888. 802f2f6: db15 blt.n 802f324 <ip_ntomentry_get_value+0x58>
  47889. {
  47890. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  47891. id = (u8_t)od->id_inst_ptr[0];
  47892. 802f2f8: 68ab ldr r3, [r5, #8]
  47893. switch (id)
  47894. 802f2fa: 781a ldrb r2, [r3, #0]
  47895. 802f2fc: 3a01 subs r2, #1
  47896. 802f2fe: 2a03 cmp r2, #3
  47897. 802f300: d810 bhi.n 802f324 <ip_ntomentry_get_value+0x58>
  47898. 802f302: e8df f002 tbb [pc, r2]
  47899. 802f306: 0402 .short 0x0402
  47900. 802f308: 0d0a .short 0x0d0a
  47901. {
  47902. case 1: /* ipNetToMediaIfIndex */
  47903. {
  47904. s32_t *sint_ptr = (s32_t*)value;
  47905. *sint_ptr = od->id_inst_ptr[1];
  47906. 802f30a: 685b ldr r3, [r3, #4]
  47907. 802f30c: e009 b.n 802f322 <ip_ntomentry_get_value+0x56>
  47908. break;
  47909. case 2: /* ipNetToMediaPhysAddress */
  47910. {
  47911. struct eth_addr *dst = (struct eth_addr*)value;
  47912. *dst = *ethaddr_ret;
  47913. 802f30e: 9b00 ldr r3, [sp, #0]
  47914. 802f310: 681a ldr r2, [r3, #0]
  47915. 802f312: 6022 str r2, [r4, #0]
  47916. 802f314: 889b ldrh r3, [r3, #4]
  47917. 802f316: 80a3 strh r3, [r4, #4]
  47918. }
  47919. break;
  47920. 802f318: e004 b.n 802f324 <ip_ntomentry_get_value+0x58>
  47921. case 3: /* ipNetToMediaNetAddress */
  47922. {
  47923. ip_addr_t *dst = (ip_addr_t*)value;
  47924. *dst = *ipaddr_ret;
  47925. 802f31a: 9b01 ldr r3, [sp, #4]
  47926. 802f31c: 681b ldr r3, [r3, #0]
  47927. 802f31e: e000 b.n 802f322 <ip_ntomentry_get_value+0x56>
  47928. break;
  47929. case 4: /* ipNetToMediaType */
  47930. {
  47931. s32_t *sint_ptr = (s32_t*)value;
  47932. /* dynamic (?) */
  47933. *sint_ptr = 3;
  47934. 802f320: 2303 movs r3, #3
  47935. 802f322: 6023 str r3, [r4, #0]
  47936. }
  47937. break;
  47938. }
  47939. }
  47940. #endif /* LWIP_ARP */
  47941. }
  47942. 802f324: b005 add sp, #20
  47943. 802f326: bd30 pop {r4, r5, pc}
  47944. 0802f328 <atentry_get_value>:
  47945. }
  47946. }
  47947. static void
  47948. atentry_get_value(struct obj_def *od, u16_t len, void *value)
  47949. {
  47950. 802f328: b530 push {r4, r5, lr}
  47951. struct netif *netif;
  47952. LWIP_UNUSED_ARG(len);
  47953. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  47954. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  47955. 802f32a: 6883 ldr r3, [r0, #8]
  47956. }
  47957. }
  47958. static void
  47959. atentry_get_value(struct obj_def *od, u16_t len, void *value)
  47960. {
  47961. 802f32c: b085 sub sp, #20
  47962. 802f32e: 4605 mov r5, r0
  47963. struct netif *netif;
  47964. LWIP_UNUSED_ARG(len);
  47965. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  47966. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  47967. 802f330: a903 add r1, sp, #12
  47968. 802f332: 6858 ldr r0, [r3, #4]
  47969. }
  47970. }
  47971. static void
  47972. atentry_get_value(struct obj_def *od, u16_t len, void *value)
  47973. {
  47974. 802f334: 4614 mov r4, r2
  47975. struct netif *netif;
  47976. LWIP_UNUSED_ARG(len);
  47977. LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
  47978. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  47979. 802f336: f000 ff49 bl 80301cc <snmp_ifindextonetif>
  47980. snmp_oidtoip(&od->id_inst_ptr[2], &ip);
  47981. 802f33a: 68a8 ldr r0, [r5, #8]
  47982. 802f33c: a902 add r1, sp, #8
  47983. 802f33e: 3008 adds r0, #8
  47984. 802f340: f000 ff62 bl 8030208 <snmp_oidtoip>
  47985. #if LWIP_ARP /** @todo implement a netif_find_addr */
  47986. if (etharp_find_addr(netif, &ip, &ethaddr_ret, &ipaddr_ret) > -1)
  47987. 802f344: 9803 ldr r0, [sp, #12]
  47988. 802f346: a902 add r1, sp, #8
  47989. 802f348: 466a mov r2, sp
  47990. 802f34a: ab01 add r3, sp, #4
  47991. 802f34c: f002 ff9c bl 8032288 <etharp_find_addr>
  47992. 802f350: 2800 cmp r0, #0
  47993. 802f352: db12 blt.n 802f37a <atentry_get_value+0x52>
  47994. {
  47995. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  47996. id = (u8_t)od->id_inst_ptr[0];
  47997. 802f354: 68aa ldr r2, [r5, #8]
  47998. switch (id)
  47999. 802f356: 7813 ldrb r3, [r2, #0]
  48000. 802f358: 2b02 cmp r3, #2
  48001. 802f35a: d005 beq.n 802f368 <atentry_get_value+0x40>
  48002. 802f35c: 2b03 cmp r3, #3
  48003. 802f35e: d009 beq.n 802f374 <atentry_get_value+0x4c>
  48004. 802f360: 2b01 cmp r3, #1
  48005. 802f362: d10a bne.n 802f37a <atentry_get_value+0x52>
  48006. {
  48007. case 1: /* atIfIndex */
  48008. {
  48009. s32_t *sint_ptr = (s32_t*)value;
  48010. *sint_ptr = od->id_inst_ptr[1];
  48011. 802f364: 6853 ldr r3, [r2, #4]
  48012. 802f366: e007 b.n 802f378 <atentry_get_value+0x50>
  48013. break;
  48014. case 2: /* atPhysAddress */
  48015. {
  48016. struct eth_addr *dst = (struct eth_addr*)value;
  48017. *dst = *ethaddr_ret;
  48018. 802f368: 9b00 ldr r3, [sp, #0]
  48019. 802f36a: 681a ldr r2, [r3, #0]
  48020. 802f36c: 6022 str r2, [r4, #0]
  48021. 802f36e: 889b ldrh r3, [r3, #4]
  48022. 802f370: 80a3 strh r3, [r4, #4]
  48023. }
  48024. break;
  48025. 802f372: e002 b.n 802f37a <atentry_get_value+0x52>
  48026. case 3: /* atNetAddress */
  48027. {
  48028. ip_addr_t *dst = (ip_addr_t*)value;
  48029. *dst = *ipaddr_ret;
  48030. 802f374: 9b01 ldr r3, [sp, #4]
  48031. 802f376: 681b ldr r3, [r3, #0]
  48032. 802f378: 6023 str r3, [r4, #0]
  48033. }
  48034. break;
  48035. }
  48036. }
  48037. #endif /* LWIP_ARP */
  48038. }
  48039. 802f37a: b005 add sp, #20
  48040. 802f37c: bd30 pop {r4, r5, pc}
  48041. 802f37e: 0000 movs r0, r0
  48042. 0802f380 <system_set_test>:
  48043. u8_t id, set_ok;
  48044. LWIP_UNUSED_ARG(value);
  48045. set_ok = 0;
  48046. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  48047. id = (u8_t)od->id_inst_ptr[0];
  48048. 802f380: 6883 ldr r3, [r0, #8]
  48049. switch (id)
  48050. 802f382: 781b ldrb r3, [r3, #0]
  48051. 802f384: 2b05 cmp r3, #5
  48052. 802f386: d007 beq.n 802f398 <system_set_test+0x18>
  48053. 802f388: 2b06 cmp r3, #6
  48054. 802f38a: d00f beq.n 802f3ac <system_set_test+0x2c>
  48055. 802f38c: 2b04 cmp r3, #4
  48056. 802f38e: d111 bne.n 802f3b4 <system_set_test+0x34>
  48057. {
  48058. case 4: /* sysContact */
  48059. if ((syscontact_ptr != syscontact_default) &&
  48060. 802f390: 4b09 ldr r3, [pc, #36] ; (802f3b8 <system_set_test+0x38>)
  48061. 802f392: 681a ldr r2, [r3, #0]
  48062. 802f394: 4b09 ldr r3, [pc, #36] ; (802f3bc <system_set_test+0x3c>)
  48063. 802f396: e002 b.n 802f39e <system_set_test+0x1e>
  48064. {
  48065. set_ok = 1;
  48066. }
  48067. break;
  48068. case 5: /* sysName */
  48069. if ((sysname_ptr != sysname_default) &&
  48070. 802f398: 4b09 ldr r3, [pc, #36] ; (802f3c0 <system_set_test+0x40>)
  48071. 802f39a: 681a ldr r2, [r3, #0]
  48072. 802f39c: 4b09 ldr r3, [pc, #36] ; (802f3c4 <system_set_test+0x44>)
  48073. 802f39e: 429a cmp r2, r3
  48074. 802f3a0: d008 beq.n 802f3b4 <system_set_test+0x34>
  48075. system_set_test(struct obj_def *od, u16_t len, void *value)
  48076. {
  48077. u8_t id, set_ok;
  48078. LWIP_UNUSED_ARG(value);
  48079. set_ok = 0;
  48080. 802f3a2: 29ff cmp r1, #255 ; 0xff
  48081. 802f3a4: bf8c ite hi
  48082. 802f3a6: 2000 movhi r0, #0
  48083. 802f3a8: 2001 movls r0, #1
  48084. 802f3aa: 4770 bx lr
  48085. {
  48086. set_ok = 1;
  48087. }
  48088. break;
  48089. case 6: /* sysLocation */
  48090. if ((syslocation_ptr != syslocation_default) &&
  48091. 802f3ac: 4b06 ldr r3, [pc, #24] ; (802f3c8 <system_set_test+0x48>)
  48092. 802f3ae: 681a ldr r2, [r3, #0]
  48093. 802f3b0: 4b06 ldr r3, [pc, #24] ; (802f3cc <system_set_test+0x4c>)
  48094. 802f3b2: e7f4 b.n 802f39e <system_set_test+0x1e>
  48095. system_set_test(struct obj_def *od, u16_t len, void *value)
  48096. {
  48097. u8_t id, set_ok;
  48098. LWIP_UNUSED_ARG(value);
  48099. set_ok = 0;
  48100. 802f3b4: 2000 movs r0, #0
  48101. set_ok = 1;
  48102. }
  48103. break;
  48104. };
  48105. return set_ok;
  48106. }
  48107. 802f3b6: 4770 bx lr
  48108. 802f3b8: 200017dc .word 0x200017dc
  48109. 802f3bc: 0803affc .word 0x0803affc
  48110. 802f3c0: 20001768 .word 0x20001768
  48111. 802f3c4: 0803ad14 .word 0x0803ad14
  48112. 802f3c8: 200018f4 .word 0x200018f4
  48113. 802f3cc: 0803ad44 .word 0x0803ad44
  48114. 0802f3d0 <atentry_get_object_def>:
  48115. {
  48116. /* return to object name, adding index depth (5) */
  48117. ident_len += 5;
  48118. ident -= 5;
  48119. if (ident_len == 6)
  48120. 802f3d0: 2801 cmp r0, #1
  48121. 802f3d2: d120 bne.n 802f416 <atentry_get_object_def+0x46>
  48122. {
  48123. od->id_inst_len = ident_len;
  48124. 802f3d4: 2006 movs r0, #6
  48125. static void
  48126. atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  48127. {
  48128. /* return to object name, adding index depth (5) */
  48129. ident_len += 5;
  48130. ident -= 5;
  48131. 802f3d6: f1a1 0314 sub.w r3, r1, #20
  48132. if (ident_len == 6)
  48133. {
  48134. od->id_inst_len = ident_len;
  48135. 802f3da: 7190 strb r0, [r2, #6]
  48136. od->id_inst_ptr = ident;
  48137. 802f3dc: 6093 str r3, [r2, #8]
  48138. switch (ident[0])
  48139. 802f3de: f851 3c14 ldr.w r3, [r1, #-20]
  48140. 802f3e2: 2b02 cmp r3, #2
  48141. 802f3e4: d008 beq.n 802f3f8 <atentry_get_object_def+0x28>
  48142. 802f3e6: 2b03 cmp r3, #3
  48143. 802f3e8: d00d beq.n 802f406 <atentry_get_object_def+0x36>
  48144. 802f3ea: 2b01 cmp r3, #1
  48145. 802f3ec: d113 bne.n 802f416 <atentry_get_object_def+0x46>
  48146. {
  48147. case 1: /* atIfIndex */
  48148. od->instance = MIB_OBJECT_TAB;
  48149. 802f3ee: 2302 movs r3, #2
  48150. od->access = MIB_OBJECT_READ_WRITE;
  48151. 802f3f0: 2103 movs r1, #3
  48152. od->id_inst_ptr = ident;
  48153. switch (ident[0])
  48154. {
  48155. case 1: /* atIfIndex */
  48156. od->instance = MIB_OBJECT_TAB;
  48157. 802f3f2: 7013 strb r3, [r2, #0]
  48158. od->access = MIB_OBJECT_READ_WRITE;
  48159. 802f3f4: 7051 strb r1, [r2, #1]
  48160. 802f3f6: e00a b.n 802f40e <atentry_get_object_def+0x3e>
  48161. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  48162. od->v_len = sizeof(s32_t);
  48163. break;
  48164. case 2: /* atPhysAddress */
  48165. od->instance = MIB_OBJECT_TAB;
  48166. 802f3f8: 7013 strb r3, [r2, #0]
  48167. od->access = MIB_OBJECT_READ_WRITE;
  48168. 802f3fa: 2303 movs r3, #3
  48169. 802f3fc: 7053 strb r3, [r2, #1]
  48170. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  48171. 802f3fe: 2304 movs r3, #4
  48172. 802f400: 7093 strb r3, [r2, #2]
  48173. od->v_len = 6; /** @todo try to use netif::hwaddr_len */
  48174. 802f402: 8090 strh r0, [r2, #4]
  48175. break;
  48176. 802f404: 4770 bx lr
  48177. case 3: /* atNetAddress */
  48178. od->instance = MIB_OBJECT_TAB;
  48179. 802f406: 2102 movs r1, #2
  48180. od->access = MIB_OBJECT_READ_WRITE;
  48181. 802f408: 7053 strb r3, [r2, #1]
  48182. od->access = MIB_OBJECT_READ_WRITE;
  48183. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  48184. od->v_len = 6; /** @todo try to use netif::hwaddr_len */
  48185. break;
  48186. case 3: /* atNetAddress */
  48187. od->instance = MIB_OBJECT_TAB;
  48188. 802f40a: 7011 strb r1, [r2, #0]
  48189. od->access = MIB_OBJECT_READ_WRITE;
  48190. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  48191. 802f40c: 2340 movs r3, #64 ; 0x40
  48192. 802f40e: 7093 strb r3, [r2, #2]
  48193. od->v_len = 4;
  48194. 802f410: 2304 movs r3, #4
  48195. 802f412: 8093 strh r3, [r2, #4]
  48196. break;
  48197. 802f414: 4770 bx lr
  48198. }
  48199. }
  48200. else
  48201. {
  48202. LWIP_DEBUGF(SNMP_MIB_DEBUG,("atentry_get_object_def: no scalar\n"));
  48203. od->instance = MIB_OBJECT_NONE;
  48204. 802f416: 2300 movs r3, #0
  48205. 802f418: 7013 strb r3, [r2, #0]
  48206. 802f41a: 4770 bx lr
  48207. 0802f41c <ip_get_object_def>:
  48208. u8_t id;
  48209. /* return to object name, adding index depth (1) */
  48210. ident_len += 1;
  48211. ident -= 1;
  48212. if (ident_len == 2)
  48213. 802f41c: 2801 cmp r0, #1
  48214. #endif /* LWIP_ARP */
  48215. }
  48216. static void
  48217. ip_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  48218. {
  48219. 802f41e: b510 push {r4, lr}
  48220. u8_t id;
  48221. /* return to object name, adding index depth (1) */
  48222. ident_len += 1;
  48223. ident -= 1;
  48224. if (ident_len == 2)
  48225. 802f420: d121 bne.n 802f466 <ip_get_object_def+0x4a>
  48226. {
  48227. od->id_inst_len = ident_len;
  48228. 802f422: 2402 movs r4, #2
  48229. {
  48230. u8_t id;
  48231. /* return to object name, adding index depth (1) */
  48232. ident_len += 1;
  48233. ident -= 1;
  48234. 802f424: 1f0b subs r3, r1, #4
  48235. if (ident_len == 2)
  48236. {
  48237. od->id_inst_len = ident_len;
  48238. 802f426: 7194 strb r4, [r2, #6]
  48239. od->id_inst_ptr = ident;
  48240. 802f428: 6093 str r3, [r2, #8]
  48241. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  48242. id = (u8_t)ident[0];
  48243. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ip.%"U16_F".0\n",(u16_t)id));
  48244. switch (id)
  48245. 802f42a: f811 3c04 ldrb.w r3, [r1, #-4]
  48246. 802f42e: 2b17 cmp r3, #23
  48247. 802f430: d819 bhi.n 802f466 <ip_get_object_def+0x4a>
  48248. 802f432: 490e ldr r1, [pc, #56] ; (802f46c <ip_get_object_def+0x50>)
  48249. 802f434: 4099 lsls r1, r3
  48250. 802f436: d40b bmi.n 802f450 <ip_get_object_def+0x34>
  48251. 802f438: f44f 2180 mov.w r1, #262144 ; 0x40000
  48252. 802f43c: 4099 lsls r1, r3
  48253. 802f43e: d40c bmi.n 802f45a <ip_get_object_def+0x3e>
  48254. 802f440: f04f 41c0 mov.w r1, #1610612736 ; 0x60000000
  48255. 802f444: 4099 lsls r1, r3
  48256. 802f446: d50e bpl.n 802f466 <ip_get_object_def+0x4a>
  48257. {
  48258. case 1: /* ipForwarding */
  48259. case 2: /* ipDefaultTTL */
  48260. od->instance = MIB_OBJECT_SCALAR;
  48261. od->access = MIB_OBJECT_READ_WRITE;
  48262. 802f448: 2303 movs r3, #3
  48263. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ip.%"U16_F".0\n",(u16_t)id));
  48264. switch (id)
  48265. {
  48266. case 1: /* ipForwarding */
  48267. case 2: /* ipDefaultTTL */
  48268. od->instance = MIB_OBJECT_SCALAR;
  48269. 802f44a: 7010 strb r0, [r2, #0]
  48270. od->access = MIB_OBJECT_READ_WRITE;
  48271. 802f44c: 7053 strb r3, [r2, #1]
  48272. 802f44e: e006 b.n 802f45e <ip_get_object_def+0x42>
  48273. case 18: /* ipFragFails */
  48274. case 19: /* ipFragCreates */
  48275. case 23: /* ipRoutingDiscards */
  48276. od->instance = MIB_OBJECT_SCALAR;
  48277. od->access = MIB_OBJECT_READ_ONLY;
  48278. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  48279. 802f450: 2341 movs r3, #65 ; 0x41
  48280. case 16: /* ipReasmFails */
  48281. case 17: /* ipFragOKs */
  48282. case 18: /* ipFragFails */
  48283. case 19: /* ipFragCreates */
  48284. case 23: /* ipRoutingDiscards */
  48285. od->instance = MIB_OBJECT_SCALAR;
  48286. 802f452: 7010 strb r0, [r2, #0]
  48287. od->access = MIB_OBJECT_READ_ONLY;
  48288. 802f454: 7050 strb r0, [r2, #1]
  48289. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  48290. 802f456: 7093 strb r3, [r2, #2]
  48291. 802f458: e002 b.n 802f460 <ip_get_object_def+0x44>
  48292. od->v_len = sizeof(u32_t);
  48293. break;
  48294. case 13: /* ipReasmTimeout */
  48295. od->instance = MIB_OBJECT_SCALAR;
  48296. 802f45a: 7010 strb r0, [r2, #0]
  48297. od->access = MIB_OBJECT_READ_ONLY;
  48298. 802f45c: 7050 strb r0, [r2, #1]
  48299. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  48300. 802f45e: 7094 strb r4, [r2, #2]
  48301. od->v_len = sizeof(s32_t);
  48302. 802f460: 2304 movs r3, #4
  48303. 802f462: 8093 strh r3, [r2, #4]
  48304. break;
  48305. 802f464: bd10 pop {r4, pc}
  48306. };
  48307. }
  48308. else
  48309. {
  48310. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_get_object_def: no scalar\n"));
  48311. od->instance = MIB_OBJECT_NONE;
  48312. 802f466: 2300 movs r3, #0
  48313. 802f468: 7013 strb r3, [r2, #0]
  48314. 802f46a: bd10 pop {r4, pc}
  48315. 802f46c: 1ffbf100 .word 0x1ffbf100
  48316. 0802f470 <ip_addrentry_get_object_def>:
  48317. {
  48318. /* return to object name, adding index depth (4) */
  48319. ident_len += 4;
  48320. ident -= 4;
  48321. if (ident_len == 5)
  48322. 802f470: 2801 cmp r0, #1
  48323. 802f472: d11c bne.n 802f4ae <ip_addrentry_get_object_def+0x3e>
  48324. {
  48325. u8_t id;
  48326. od->id_inst_len = ident_len;
  48327. 802f474: 2305 movs r3, #5
  48328. 802f476: 7193 strb r3, [r2, #6]
  48329. static void
  48330. ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  48331. {
  48332. /* return to object name, adding index depth (4) */
  48333. ident_len += 4;
  48334. ident -= 4;
  48335. 802f478: f1a1 0310 sub.w r3, r1, #16
  48336. if (ident_len == 5)
  48337. {
  48338. u8_t id;
  48339. od->id_inst_len = ident_len;
  48340. od->id_inst_ptr = ident;
  48341. 802f47c: 6093 str r3, [r2, #8]
  48342. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  48343. id = (u8_t)ident[0];
  48344. switch (id)
  48345. 802f47e: f811 3c10 ldrb.w r3, [r1, #-16]
  48346. 802f482: 2b05 cmp r3, #5
  48347. 802f484: d813 bhi.n 802f4ae <ip_addrentry_get_object_def+0x3e>
  48348. 802f486: f04f 5130 mov.w r1, #738197504 ; 0x2c000000
  48349. 802f48a: 4099 lsls r1, r3
  48350. 802f48c: d408 bmi.n 802f4a0 <ip_addrentry_get_object_def+0x30>
  48351. 802f48e: f04f 41a0 mov.w r1, #1342177280 ; 0x50000000
  48352. 802f492: 4099 lsls r1, r3
  48353. 802f494: d50b bpl.n 802f4ae <ip_addrentry_get_object_def+0x3e>
  48354. {
  48355. case 1: /* ipAdEntAddr */
  48356. case 3: /* ipAdEntNetMask */
  48357. od->instance = MIB_OBJECT_TAB;
  48358. 802f496: 2302 movs r3, #2
  48359. 802f498: 7013 strb r3, [r2, #0]
  48360. od->access = MIB_OBJECT_READ_ONLY;
  48361. 802f49a: 7050 strb r0, [r2, #1]
  48362. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  48363. 802f49c: 2340 movs r3, #64 ; 0x40
  48364. 802f49e: e002 b.n 802f4a6 <ip_addrentry_get_object_def+0x36>
  48365. od->v_len = 4;
  48366. break;
  48367. case 2: /* ipAdEntIfIndex */
  48368. case 4: /* ipAdEntBcastAddr */
  48369. case 5: /* ipAdEntReasmMaxSize */
  48370. od->instance = MIB_OBJECT_TAB;
  48371. 802f4a0: 2302 movs r3, #2
  48372. 802f4a2: 7013 strb r3, [r2, #0]
  48373. od->access = MIB_OBJECT_READ_ONLY;
  48374. 802f4a4: 7050 strb r0, [r2, #1]
  48375. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  48376. 802f4a6: 7093 strb r3, [r2, #2]
  48377. od->v_len = sizeof(s32_t);
  48378. 802f4a8: 2304 movs r3, #4
  48379. 802f4aa: 8093 strh r3, [r2, #4]
  48380. break;
  48381. 802f4ac: 4770 bx lr
  48382. }
  48383. }
  48384. else
  48385. {
  48386. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_addrentry_get_object_def: no scalar\n"));
  48387. od->instance = MIB_OBJECT_NONE;
  48388. 802f4ae: 2300 movs r3, #0
  48389. 802f4b0: 7013 strb r3, [r2, #0]
  48390. 802f4b2: 4770 bx lr
  48391. 0802f4b4 <ip_ntomentry_get_object_def>:
  48392. {
  48393. /* return to object name, adding index depth (5) */
  48394. ident_len += 5;
  48395. ident -= 5;
  48396. if (ident_len == 6)
  48397. 802f4b4: 2801 cmp r0, #1
  48398. 802f4b6: d123 bne.n 802f500 <ip_ntomentry_get_object_def+0x4c>
  48399. {
  48400. u8_t id;
  48401. od->id_inst_len = ident_len;
  48402. 802f4b8: 2306 movs r3, #6
  48403. 802f4ba: 7193 strb r3, [r2, #6]
  48404. static void
  48405. ip_ntomentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  48406. {
  48407. /* return to object name, adding index depth (5) */
  48408. ident_len += 5;
  48409. ident -= 5;
  48410. 802f4bc: f1a1 0314 sub.w r3, r1, #20
  48411. if (ident_len == 6)
  48412. {
  48413. u8_t id;
  48414. od->id_inst_len = ident_len;
  48415. od->id_inst_ptr = ident;
  48416. 802f4c0: 6093 str r3, [r2, #8]
  48417. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  48418. id = (u8_t)ident[0];
  48419. switch (id)
  48420. 802f4c2: f811 3c14 ldrb.w r3, [r1, #-20]
  48421. 802f4c6: 3b01 subs r3, #1
  48422. 802f4c8: 2b03 cmp r3, #3
  48423. 802f4ca: d819 bhi.n 802f500 <ip_ntomentry_get_object_def+0x4c>
  48424. 802f4cc: e8df f003 tbb [pc, r3]
  48425. 802f4d0: 020f0702 .word 0x020f0702
  48426. {
  48427. case 1: /* ipNetToMediaIfIndex */
  48428. case 4: /* ipNetToMediaType */
  48429. od->instance = MIB_OBJECT_TAB;
  48430. 802f4d4: 2302 movs r3, #2
  48431. od->access = MIB_OBJECT_READ_WRITE;
  48432. 802f4d6: 2103 movs r1, #3
  48433. id = (u8_t)ident[0];
  48434. switch (id)
  48435. {
  48436. case 1: /* ipNetToMediaIfIndex */
  48437. case 4: /* ipNetToMediaType */
  48438. od->instance = MIB_OBJECT_TAB;
  48439. 802f4d8: 7013 strb r3, [r2, #0]
  48440. od->access = MIB_OBJECT_READ_WRITE;
  48441. 802f4da: 7051 strb r1, [r2, #1]
  48442. 802f4dc: e00c b.n 802f4f8 <ip_ntomentry_get_object_def+0x44>
  48443. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  48444. od->v_len = sizeof(s32_t);
  48445. break;
  48446. case 2: /* ipNetToMediaPhysAddress */
  48447. od->instance = MIB_OBJECT_TAB;
  48448. 802f4de: 2302 movs r3, #2
  48449. 802f4e0: 7013 strb r3, [r2, #0]
  48450. od->access = MIB_OBJECT_READ_WRITE;
  48451. 802f4e2: 2303 movs r3, #3
  48452. 802f4e4: 7053 strb r3, [r2, #1]
  48453. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  48454. 802f4e6: 2304 movs r3, #4
  48455. 802f4e8: 7093 strb r3, [r2, #2]
  48456. od->v_len = 6; /** @todo try to use netif::hwaddr_len */
  48457. 802f4ea: 2306 movs r3, #6
  48458. 802f4ec: e006 b.n 802f4fc <ip_ntomentry_get_object_def+0x48>
  48459. break;
  48460. case 3: /* ipNetToMediaNetAddress */
  48461. od->instance = MIB_OBJECT_TAB;
  48462. 802f4ee: 2302 movs r3, #2
  48463. 802f4f0: 7013 strb r3, [r2, #0]
  48464. od->access = MIB_OBJECT_READ_WRITE;
  48465. 802f4f2: 2303 movs r3, #3
  48466. 802f4f4: 7053 strb r3, [r2, #1]
  48467. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  48468. 802f4f6: 2340 movs r3, #64 ; 0x40
  48469. 802f4f8: 7093 strb r3, [r2, #2]
  48470. od->v_len = 4;
  48471. 802f4fa: 2304 movs r3, #4
  48472. 802f4fc: 8093 strh r3, [r2, #4]
  48473. break;
  48474. 802f4fe: 4770 bx lr
  48475. }
  48476. }
  48477. else
  48478. {
  48479. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_ntomentry_get_object_def: no scalar\n"));
  48480. od->instance = MIB_OBJECT_NONE;
  48481. 802f500: 2300 movs r3, #0
  48482. 802f502: 7013 strb r3, [r2, #0]
  48483. 802f504: 4770 bx lr
  48484. 802f506: 0000 movs r0, r0
  48485. 0802f508 <tcp_get_object_def>:
  48486. u8_t id;
  48487. /* return to object name, adding index depth (1) */
  48488. ident_len += 1;
  48489. ident -= 1;
  48490. if (ident_len == 2)
  48491. 802f508: 2801 cmp r0, #1
  48492. #if LWIP_TCP
  48493. /** @todo tcp grp */
  48494. static void
  48495. tcp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  48496. {
  48497. 802f50a: b510 push {r4, lr}
  48498. u8_t id;
  48499. /* return to object name, adding index depth (1) */
  48500. ident_len += 1;
  48501. ident -= 1;
  48502. if (ident_len == 2)
  48503. 802f50c: d121 bne.n 802f552 <tcp_get_object_def+0x4a>
  48504. {
  48505. od->id_inst_len = ident_len;
  48506. 802f50e: 2402 movs r4, #2
  48507. {
  48508. u8_t id;
  48509. /* return to object name, adding index depth (1) */
  48510. ident_len += 1;
  48511. ident -= 1;
  48512. 802f510: 1f0b subs r3, r1, #4
  48513. if (ident_len == 2)
  48514. {
  48515. od->id_inst_len = ident_len;
  48516. 802f512: 7194 strb r4, [r2, #6]
  48517. od->id_inst_ptr = ident;
  48518. 802f514: 6093 str r3, [r2, #8]
  48519. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  48520. id = (u8_t)ident[0];
  48521. LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def tcp.%"U16_F".0\n",(u16_t)id));
  48522. switch (id)
  48523. 802f516: f811 3c04 ldrb.w r3, [r1, #-4]
  48524. 802f51a: 2b0f cmp r3, #15
  48525. 802f51c: d819 bhi.n 802f552 <tcp_get_object_def+0x4a>
  48526. 802f51e: 490e ldr r1, [pc, #56] ; (802f558 <tcp_get_object_def+0x50>)
  48527. 802f520: 4099 lsls r1, r3
  48528. 802f522: d40b bmi.n 802f53c <tcp_get_object_def+0x34>
  48529. 802f524: f44f 0180 mov.w r1, #4194304 ; 0x400000
  48530. 802f528: 4099 lsls r1, r3
  48531. 802f52a: d40b bmi.n 802f544 <tcp_get_object_def+0x3c>
  48532. 802f52c: f04f 41f0 mov.w r1, #2013265920 ; 0x78000000
  48533. 802f530: 4099 lsls r1, r3
  48534. 802f532: d50e bpl.n 802f552 <tcp_get_object_def+0x4a>
  48535. {
  48536. case 1: /* tcpRtoAlgorithm */
  48537. case 2: /* tcpRtoMin */
  48538. case 3: /* tcpRtoMax */
  48539. case 4: /* tcpMaxConn */
  48540. od->instance = MIB_OBJECT_SCALAR;
  48541. 802f534: 7010 strb r0, [r2, #0]
  48542. od->access = MIB_OBJECT_READ_ONLY;
  48543. 802f536: 7050 strb r0, [r2, #1]
  48544. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  48545. 802f538: 7094 strb r4, [r2, #2]
  48546. 802f53a: e007 b.n 802f54c <tcp_get_object_def+0x44>
  48547. case 10: /* tcpInSegs */
  48548. case 11: /* tcpOutSegs */
  48549. case 12: /* tcpRetransSegs */
  48550. case 14: /* tcpInErrs */
  48551. case 15: /* tcpOutRsts */
  48552. od->instance = MIB_OBJECT_SCALAR;
  48553. 802f53c: 7010 strb r0, [r2, #0]
  48554. od->access = MIB_OBJECT_READ_ONLY;
  48555. 802f53e: 7050 strb r0, [r2, #1]
  48556. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  48557. 802f540: 2341 movs r3, #65 ; 0x41
  48558. 802f542: e002 b.n 802f54a <tcp_get_object_def+0x42>
  48559. od->v_len = sizeof(u32_t);
  48560. break;
  48561. case 9: /* tcpCurrEstab */
  48562. od->instance = MIB_OBJECT_TAB;
  48563. 802f544: 7014 strb r4, [r2, #0]
  48564. od->access = MIB_OBJECT_READ_ONLY;
  48565. 802f546: 7050 strb r0, [r2, #1]
  48566. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE);
  48567. 802f548: 2342 movs r3, #66 ; 0x42
  48568. 802f54a: 7093 strb r3, [r2, #2]
  48569. od->v_len = sizeof(u32_t);
  48570. 802f54c: 2304 movs r3, #4
  48571. 802f54e: 8093 strh r3, [r2, #4]
  48572. break;
  48573. 802f550: bd10 pop {r4, pc}
  48574. };
  48575. }
  48576. else
  48577. {
  48578. LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcp_get_object_def: no scalar\n"));
  48579. od->instance = MIB_OBJECT_NONE;
  48580. 802f552: 2300 movs r3, #0
  48581. 802f554: 7013 strb r3, [r2, #0]
  48582. 802f556: bd10 pop {r4, pc}
  48583. 802f558: 07bb0000 .word 0x07bb0000
  48584. 0802f55c <udpentry_get_object_def>:
  48585. {
  48586. /* return to object name, adding index depth (5) */
  48587. ident_len += 5;
  48588. ident -= 5;
  48589. if (ident_len == 6)
  48590. 802f55c: 2801 cmp r0, #1
  48591. 802f55e: d116 bne.n 802f58e <udpentry_get_object_def+0x32>
  48592. {
  48593. od->id_inst_len = ident_len;
  48594. 802f560: 2306 movs r3, #6
  48595. 802f562: 7193 strb r3, [r2, #6]
  48596. static void
  48597. udpentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  48598. {
  48599. /* return to object name, adding index depth (5) */
  48600. ident_len += 5;
  48601. ident -= 5;
  48602. 802f564: f1a1 0314 sub.w r3, r1, #20
  48603. if (ident_len == 6)
  48604. {
  48605. od->id_inst_len = ident_len;
  48606. od->id_inst_ptr = ident;
  48607. 802f568: 6093 str r3, [r2, #8]
  48608. switch (ident[0])
  48609. 802f56a: f851 3c14 ldr.w r3, [r1, #-20]
  48610. 802f56e: 2b01 cmp r3, #1
  48611. 802f570: d002 beq.n 802f578 <udpentry_get_object_def+0x1c>
  48612. 802f572: 2b02 cmp r3, #2
  48613. 802f574: d10b bne.n 802f58e <udpentry_get_object_def+0x32>
  48614. 802f576: e004 b.n 802f582 <udpentry_get_object_def+0x26>
  48615. {
  48616. case 1: /* udpLocalAddress */
  48617. od->instance = MIB_OBJECT_TAB;
  48618. 802f578: 2102 movs r1, #2
  48619. od->access = MIB_OBJECT_READ_ONLY;
  48620. 802f57a: 7053 strb r3, [r2, #1]
  48621. od->id_inst_ptr = ident;
  48622. switch (ident[0])
  48623. {
  48624. case 1: /* udpLocalAddress */
  48625. od->instance = MIB_OBJECT_TAB;
  48626. 802f57c: 7011 strb r1, [r2, #0]
  48627. od->access = MIB_OBJECT_READ_ONLY;
  48628. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
  48629. 802f57e: 2340 movs r3, #64 ; 0x40
  48630. 802f580: e001 b.n 802f586 <udpentry_get_object_def+0x2a>
  48631. od->v_len = 4;
  48632. break;
  48633. case 2: /* udpLocalPort */
  48634. od->instance = MIB_OBJECT_TAB;
  48635. 802f582: 7013 strb r3, [r2, #0]
  48636. od->access = MIB_OBJECT_READ_ONLY;
  48637. 802f584: 7050 strb r0, [r2, #1]
  48638. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  48639. 802f586: 7093 strb r3, [r2, #2]
  48640. od->v_len = sizeof(s32_t);
  48641. 802f588: 2304 movs r3, #4
  48642. 802f58a: 8093 strh r3, [r2, #4]
  48643. break;
  48644. 802f58c: 4770 bx lr
  48645. }
  48646. }
  48647. else
  48648. {
  48649. LWIP_DEBUGF(SNMP_MIB_DEBUG,("udpentry_get_object_def: no scalar\n"));
  48650. od->instance = MIB_OBJECT_NONE;
  48651. 802f58e: 2300 movs r3, #0
  48652. 802f590: 7013 strb r3, [r2, #0]
  48653. 802f592: 4770 bx lr
  48654. 0802f594 <snmp_get_object_def>:
  48655. snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  48656. {
  48657. /* return to object name, adding index depth (1) */
  48658. ident_len += 1;
  48659. ident -= 1;
  48660. if (ident_len == 2)
  48661. 802f594: 2801 cmp r0, #1
  48662. }
  48663. }
  48664. static void
  48665. snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  48666. {
  48667. 802f596: b510 push {r4, lr}
  48668. /* return to object name, adding index depth (1) */
  48669. ident_len += 1;
  48670. ident -= 1;
  48671. if (ident_len == 2)
  48672. 802f598: d119 bne.n 802f5ce <snmp_get_object_def+0x3a>
  48673. {
  48674. u8_t id;
  48675. od->id_inst_len = ident_len;
  48676. 802f59a: 2302 movs r3, #2
  48677. 802f59c: 7193 strb r3, [r2, #6]
  48678. static void
  48679. snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
  48680. {
  48681. /* return to object name, adding index depth (1) */
  48682. ident_len += 1;
  48683. ident -= 1;
  48684. 802f59e: 1f0c subs r4, r1, #4
  48685. od->id_inst_len = ident_len;
  48686. od->id_inst_ptr = ident;
  48687. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  48688. id = (u8_t)ident[0];
  48689. switch (id)
  48690. 802f5a0: f811 1c04 ldrb.w r1, [r1, #-4]
  48691. if (ident_len == 2)
  48692. {
  48693. u8_t id;
  48694. od->id_inst_len = ident_len;
  48695. od->id_inst_ptr = ident;
  48696. 802f5a4: 6094 str r4, [r2, #8]
  48697. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  48698. id = (u8_t)ident[0];
  48699. switch (id)
  48700. 802f5a6: 291e cmp r1, #30
  48701. 802f5a8: d811 bhi.n 802f5ce <snmp_get_object_def+0x3a>
  48702. 802f5aa: 4c0a ldr r4, [pc, #40] ; (802f5d4 <snmp_get_object_def+0x40>)
  48703. 802f5ac: 408c lsls r4, r1
  48704. 802f5ae: d403 bmi.n 802f5b8 <snmp_get_object_def+0x24>
  48705. 802f5b0: fa13 f101 lsls.w r1, r3, r1
  48706. 802f5b4: d404 bmi.n 802f5c0 <snmp_get_object_def+0x2c>
  48707. 802f5b6: e00a b.n 802f5ce <snmp_get_object_def+0x3a>
  48708. case 25: /* snmpOutGetRequests */
  48709. case 26: /* snmpOutGetNexts */
  48710. case 27: /* snmpOutSetRequests */
  48711. case 28: /* snmpOutGetResponses */
  48712. case 29: /* snmpOutTraps */
  48713. od->instance = MIB_OBJECT_SCALAR;
  48714. 802f5b8: 7010 strb r0, [r2, #0]
  48715. od->access = MIB_OBJECT_READ_ONLY;
  48716. 802f5ba: 7050 strb r0, [r2, #1]
  48717. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  48718. 802f5bc: 2341 movs r3, #65 ; 0x41
  48719. 802f5be: e002 b.n 802f5c6 <snmp_get_object_def+0x32>
  48720. od->v_len = sizeof(u32_t);
  48721. break;
  48722. case 30: /* snmpEnableAuthenTraps */
  48723. od->instance = MIB_OBJECT_SCALAR;
  48724. od->access = MIB_OBJECT_READ_WRITE;
  48725. 802f5c0: 2103 movs r1, #3
  48726. od->access = MIB_OBJECT_READ_ONLY;
  48727. od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
  48728. od->v_len = sizeof(u32_t);
  48729. break;
  48730. case 30: /* snmpEnableAuthenTraps */
  48731. od->instance = MIB_OBJECT_SCALAR;
  48732. 802f5c2: 7010 strb r0, [r2, #0]
  48733. od->access = MIB_OBJECT_READ_WRITE;
  48734. 802f5c4: 7051 strb r1, [r2, #1]
  48735. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
  48736. 802f5c6: 7093 strb r3, [r2, #2]
  48737. od->v_len = sizeof(s32_t);
  48738. 802f5c8: 2304 movs r3, #4
  48739. 802f5ca: 8093 strh r3, [r2, #4]
  48740. break;
  48741. 802f5cc: bd10 pop {r4, pc}
  48742. };
  48743. }
  48744. else
  48745. {
  48746. LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_get_object_def: no scalar\n"));
  48747. od->instance = MIB_OBJECT_NONE;
  48748. 802f5ce: 2300 movs r3, #0
  48749. 802f5d0: 7013 strb r3, [r2, #0]
  48750. 802f5d2: bd10 pop {r4, pc}
  48751. 802f5d4: 7efffefc .word 0x7efffefc
  48752. 0802f5d8 <snmp_set_test>:
  48753. u8_t id, set_ok;
  48754. LWIP_UNUSED_ARG(len);
  48755. set_ok = 0;
  48756. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  48757. id = (u8_t)od->id_inst_ptr[0];
  48758. 802f5d8: 6883 ldr r3, [r0, #8]
  48759. if (id == 30)
  48760. 802f5da: 781b ldrb r3, [r3, #0]
  48761. 802f5dc: 2b1e cmp r3, #30
  48762. 802f5de: d10f bne.n 802f600 <snmp_set_test+0x28>
  48763. {
  48764. /* snmpEnableAuthenTraps */
  48765. s32_t *sint_ptr = (s32_t*)value;
  48766. if (snmpenableauthentraps_ptr != &snmpenableauthentraps_default)
  48767. 802f5e0: 4b08 ldr r3, [pc, #32] ; (802f604 <snmp_set_test+0x2c>)
  48768. 802f5e2: 6810 ldr r0, [r2, #0]
  48769. 802f5e4: 6819 ldr r1, [r3, #0]
  48770. 802f5e6: 4b08 ldr r3, [pc, #32] ; (802f608 <snmp_set_test+0x30>)
  48771. 802f5e8: 4299 cmp r1, r3
  48772. 802f5ea: d005 beq.n 802f5f8 <snmp_set_test+0x20>
  48773. {
  48774. /* we should have writable non-volatile mem here */
  48775. if ((*sint_ptr == 1) || (*sint_ptr == 2))
  48776. 802f5ec: 3801 subs r0, #1
  48777. snmp_set_test(struct obj_def *od, u16_t len, void *value)
  48778. {
  48779. u8_t id, set_ok;
  48780. LWIP_UNUSED_ARG(len);
  48781. set_ok = 0;
  48782. 802f5ee: 2801 cmp r0, #1
  48783. 802f5f0: bf8c ite hi
  48784. 802f5f2: 2000 movhi r0, #0
  48785. 802f5f4: 2001 movls r0, #1
  48786. 802f5f6: 4770 bx lr
  48787. 802f5f8: 1e83 subs r3, r0, #2
  48788. 802f5fa: 4258 negs r0, r3
  48789. 802f5fc: 4158 adcs r0, r3
  48790. 802f5fe: 4770 bx lr
  48791. 802f600: 2000 movs r0, #0
  48792. set_ok = 1;
  48793. }
  48794. }
  48795. }
  48796. return set_ok;
  48797. }
  48798. 802f602: 4770 bx lr
  48799. 802f604: 20001760 .word 0x20001760
  48800. 802f608: 0803adf8 .word 0x0803adf8
  48801. 0802f60c <ocstrncpy>:
  48802. * @param dst points to destination
  48803. * @param src points to source
  48804. * @param n number of octets to copy.
  48805. */
  48806. void ocstrncpy(u8_t *dst, u8_t *src, u16_t n)
  48807. {
  48808. 802f60c: b510 push {r4, lr}
  48809. u16_t i = n;
  48810. while (i > 0) {
  48811. 802f60e: 2300 movs r3, #0
  48812. 802f610: e002 b.n 802f618 <ocstrncpy+0xc>
  48813. i--;
  48814. *dst++ = *src++;
  48815. 802f612: 5ccc ldrb r4, [r1, r3]
  48816. 802f614: 54c4 strb r4, [r0, r3]
  48817. 802f616: 3301 adds r3, #1
  48818. * @param n number of octets to copy.
  48819. */
  48820. void ocstrncpy(u8_t *dst, u8_t *src, u16_t n)
  48821. {
  48822. u16_t i = n;
  48823. while (i > 0) {
  48824. 802f618: b29c uxth r4, r3
  48825. 802f61a: 42a2 cmp r2, r4
  48826. 802f61c: d1f9 bne.n 802f612 <ocstrncpy+0x6>
  48827. i--;
  48828. *dst++ = *src++;
  48829. }
  48830. }
  48831. 802f61e: bd10 pop {r4, pc}
  48832. 0802f620 <system_set_value>:
  48833. {
  48834. u8_t id;
  48835. LWIP_ASSERT("invalid len", len <= 0xff);
  48836. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  48837. id = (u8_t)od->id_inst_ptr[0];
  48838. 802f620: 6883 ldr r3, [r0, #8]
  48839. switch (id)
  48840. 802f622: 781b ldrb r3, [r3, #0]
  48841. 802f624: 2b05 cmp r3, #5
  48842. return set_ok;
  48843. }
  48844. static void
  48845. system_set_value(struct obj_def *od, u16_t len, void *value)
  48846. {
  48847. 802f626: b510 push {r4, lr}
  48848. 802f628: 460c mov r4, r1
  48849. 802f62a: 4611 mov r1, r2
  48850. u8_t id;
  48851. LWIP_ASSERT("invalid len", len <= 0xff);
  48852. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  48853. id = (u8_t)od->id_inst_ptr[0];
  48854. switch (id)
  48855. 802f62c: d00a beq.n 802f644 <system_set_value+0x24>
  48856. 802f62e: 2b06 cmp r3, #6
  48857. 802f630: d00f beq.n 802f652 <system_set_value+0x32>
  48858. 802f632: 2b04 cmp r3, #4
  48859. 802f634: d115 bne.n 802f662 <system_set_value+0x42>
  48860. {
  48861. case 4: /* sysContact */
  48862. ocstrncpy(syscontact_ptr, (u8_t*)value, len);
  48863. 802f636: 4b0b ldr r3, [pc, #44] ; (802f664 <system_set_value+0x44>)
  48864. 802f638: 4622 mov r2, r4
  48865. 802f63a: 6818 ldr r0, [r3, #0]
  48866. 802f63c: f7ff ffe6 bl 802f60c <ocstrncpy>
  48867. *syscontact_len_ptr = (u8_t)len;
  48868. 802f640: 4b09 ldr r3, [pc, #36] ; (802f668 <system_set_value+0x48>)
  48869. 802f642: e00c b.n 802f65e <system_set_value+0x3e>
  48870. break;
  48871. case 5: /* sysName */
  48872. ocstrncpy(sysname_ptr, (u8_t*)value, len);
  48873. 802f644: 4b09 ldr r3, [pc, #36] ; (802f66c <system_set_value+0x4c>)
  48874. 802f646: 4622 mov r2, r4
  48875. 802f648: 6818 ldr r0, [r3, #0]
  48876. 802f64a: f7ff ffdf bl 802f60c <ocstrncpy>
  48877. *sysname_len_ptr = (u8_t)len;
  48878. 802f64e: 4b08 ldr r3, [pc, #32] ; (802f670 <system_set_value+0x50>)
  48879. 802f650: e005 b.n 802f65e <system_set_value+0x3e>
  48880. break;
  48881. case 6: /* sysLocation */
  48882. ocstrncpy(syslocation_ptr, (u8_t*)value, len);
  48883. 802f652: 4b08 ldr r3, [pc, #32] ; (802f674 <system_set_value+0x54>)
  48884. 802f654: 4622 mov r2, r4
  48885. 802f656: 6818 ldr r0, [r3, #0]
  48886. 802f658: f7ff ffd8 bl 802f60c <ocstrncpy>
  48887. *syslocation_len_ptr = (u8_t)len;
  48888. 802f65c: 4b06 ldr r3, [pc, #24] ; (802f678 <system_set_value+0x58>)
  48889. 802f65e: 681b ldr r3, [r3, #0]
  48890. 802f660: 701c strb r4, [r3, #0]
  48891. 802f662: bd10 pop {r4, pc}
  48892. 802f664: 200017dc .word 0x200017dc
  48893. 802f668: 20001660 .word 0x20001660
  48894. 802f66c: 20001768 .word 0x20001768
  48895. 802f670: 2000165c .word 0x2000165c
  48896. 802f674: 200018f4 .word 0x200018f4
  48897. 802f678: 20001848 .word 0x20001848
  48898. 0802f67c <objectidncpy>:
  48899. *
  48900. * @param dst points to destination
  48901. * @param src points to source
  48902. * @param n number of sub identifiers to copy.
  48903. */
  48904. void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
  48905. 802f67c: 3904 subs r1, #4
  48906. {
  48907. u8_t i = n;
  48908. while(i > 0) {
  48909. 802f67e: e005 b.n 802f68c <objectidncpy+0x10>
  48910. i--;
  48911. *dst++ = *src++;
  48912. 802f680: f851 3f04 ldr.w r3, [r1, #4]!
  48913. */
  48914. void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
  48915. {
  48916. u8_t i = n;
  48917. while(i > 0) {
  48918. i--;
  48919. 802f684: 3a01 subs r2, #1
  48920. *dst++ = *src++;
  48921. 802f686: f840 3b04 str.w r3, [r0], #4
  48922. */
  48923. void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
  48924. {
  48925. u8_t i = n;
  48926. while(i > 0) {
  48927. i--;
  48928. 802f68a: b2d2 uxtb r2, r2
  48929. * @param n number of sub identifiers to copy.
  48930. */
  48931. void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
  48932. {
  48933. u8_t i = n;
  48934. while(i > 0) {
  48935. 802f68c: 2a00 cmp r2, #0
  48936. 802f68e: d1f7 bne.n 802f680 <objectidncpy+0x4>
  48937. i--;
  48938. *dst++ = *src++;
  48939. }
  48940. }
  48941. 802f690: 4770 bx lr
  48942. 802f692: 0000 movs r0, r0
  48943. 0802f694 <ifentry_get_value>:
  48944. * @param len return value space (in bytes)
  48945. * @param value points to (varbind) space to copy value into.
  48946. */
  48947. static void
  48948. ifentry_get_value(struct obj_def *od, u16_t len, void *value)
  48949. {
  48950. 802f694: b573 push {r0, r1, r4, r5, r6, lr}
  48951. struct netif *netif;
  48952. u8_t id;
  48953. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  48954. 802f696: 6883 ldr r3, [r0, #8]
  48955. * @param len return value space (in bytes)
  48956. * @param value points to (varbind) space to copy value into.
  48957. */
  48958. static void
  48959. ifentry_get_value(struct obj_def *od, u16_t len, void *value)
  48960. {
  48961. 802f698: 4606 mov r6, r0
  48962. 802f69a: 460d mov r5, r1
  48963. struct netif *netif;
  48964. u8_t id;
  48965. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  48966. 802f69c: 6858 ldr r0, [r3, #4]
  48967. 802f69e: a901 add r1, sp, #4
  48968. * @param len return value space (in bytes)
  48969. * @param value points to (varbind) space to copy value into.
  48970. */
  48971. static void
  48972. ifentry_get_value(struct obj_def *od, u16_t len, void *value)
  48973. {
  48974. 802f6a0: 4614 mov r4, r2
  48975. struct netif *netif;
  48976. u8_t id;
  48977. snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
  48978. 802f6a2: f000 fd93 bl 80301cc <snmp_ifindextonetif>
  48979. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  48980. id = (u8_t)od->id_inst_ptr[0];
  48981. 802f6a6: 68b3 ldr r3, [r6, #8]
  48982. switch (id)
  48983. 802f6a8: 781a ldrb r2, [r3, #0]
  48984. 802f6aa: 3a01 subs r2, #1
  48985. 802f6ac: 2a15 cmp r2, #21
  48986. 802f6ae: d85c bhi.n 802f76a <ifentry_get_value+0xd6>
  48987. 802f6b0: e8df f002 tbb [pc, r2]
  48988. 802f6b4: 15110d0b .word 0x15110d0b
  48989. 802f6b8: 2e221b18 .word 0x2e221b18
  48990. 802f6bc: 403d3a37 .word 0x403d3a37
  48991. 802f6c0: 46525243 .word 0x46525243
  48992. 802f6c4: 524f4c49 .word 0x524f4c49
  48993. 802f6c8: 5552 .short 0x5552
  48994. {
  48995. case 1: /* ifIndex */
  48996. {
  48997. s32_t *sint_ptr = (s32_t*)value;
  48998. *sint_ptr = od->id_inst_ptr[1];
  48999. 802f6ca: 685b ldr r3, [r3, #4]
  49000. 802f6cc: e045 b.n 802f75a <ifentry_get_value+0xc6>
  49001. }
  49002. break;
  49003. case 2: /* ifDescr */
  49004. ocstrncpy((u8_t*)value, (u8_t*)netif->name, len);
  49005. 802f6ce: 9901 ldr r1, [sp, #4]
  49006. 802f6d0: 4620 mov r0, r4
  49007. 802f6d2: 312e adds r1, #46 ; 0x2e
  49008. 802f6d4: e00c b.n 802f6f0 <ifentry_get_value+0x5c>
  49009. break;
  49010. case 3: /* ifType */
  49011. {
  49012. s32_t *sint_ptr = (s32_t*)value;
  49013. *sint_ptr = netif->link_type;
  49014. 802f6d6: 9b01 ldr r3, [sp, #4]
  49015. 802f6d8: f893 3031 ldrb.w r3, [r3, #49] ; 0x31
  49016. 802f6dc: e03d b.n 802f75a <ifentry_get_value+0xc6>
  49017. }
  49018. break;
  49019. case 4: /* ifMtu */
  49020. {
  49021. s32_t *sint_ptr = (s32_t*)value;
  49022. *sint_ptr = netif->mtu;
  49023. 802f6de: 9b01 ldr r3, [sp, #4]
  49024. 802f6e0: 8c9b ldrh r3, [r3, #36] ; 0x24
  49025. 802f6e2: e03a b.n 802f75a <ifentry_get_value+0xc6>
  49026. }
  49027. break;
  49028. case 5: /* ifSpeed */
  49029. {
  49030. u32_t *uint_ptr = (u32_t*)value;
  49031. *uint_ptr = netif->link_speed;
  49032. 802f6e4: 9b01 ldr r3, [sp, #4]
  49033. 802f6e6: 6b5b ldr r3, [r3, #52] ; 0x34
  49034. 802f6e8: e037 b.n 802f75a <ifentry_get_value+0xc6>
  49035. }
  49036. break;
  49037. case 6: /* ifPhysAddress */
  49038. ocstrncpy((u8_t*)value, netif->hwaddr, len);
  49039. 802f6ea: 9901 ldr r1, [sp, #4]
  49040. 802f6ec: 4620 mov r0, r4
  49041. 802f6ee: 3127 adds r1, #39 ; 0x27
  49042. 802f6f0: 462a mov r2, r5
  49043. 802f6f2: f7ff ff8b bl 802f60c <ocstrncpy>
  49044. break;
  49045. 802f6f6: e038 b.n 802f76a <ifentry_get_value+0xd6>
  49046. case 7: /* ifAdminStatus */
  49047. {
  49048. s32_t *sint_ptr = (s32_t*)value;
  49049. if (netif_is_up(netif))
  49050. 802f6f8: 9b01 ldr r3, [sp, #4]
  49051. 802f6fa: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
  49052. 802f6fe: 07d9 lsls r1, r3, #31
  49053. 802f700: d50d bpl.n 802f71e <ifentry_get_value+0x8a>
  49054. {
  49055. if (netif_is_link_up(netif))
  49056. 802f702: f003 0310 and.w r3, r3, #16
  49057. 802f706: b2db uxtb r3, r3
  49058. 802f708: b103 cbz r3, 802f70c <ifentry_get_value+0x78>
  49059. 802f70a: e006 b.n 802f71a <ifentry_get_value+0x86>
  49060. {
  49061. *sint_ptr = 1; /* up */
  49062. }
  49063. else
  49064. {
  49065. *sint_ptr = 7; /* lowerLayerDown */
  49066. 802f70c: 2307 movs r3, #7
  49067. 802f70e: e024 b.n 802f75a <ifentry_get_value+0xc6>
  49068. }
  49069. break;
  49070. case 8: /* ifOperStatus */
  49071. {
  49072. s32_t *sint_ptr = (s32_t*)value;
  49073. if (netif_is_up(netif))
  49074. 802f710: 9b01 ldr r3, [sp, #4]
  49075. 802f712: f893 302d ldrb.w r3, [r3, #45] ; 0x2d
  49076. 802f716: 07da lsls r2, r3, #31
  49077. 802f718: d501 bpl.n 802f71e <ifentry_get_value+0x8a>
  49078. {
  49079. *sint_ptr = 1;
  49080. 802f71a: 2301 movs r3, #1
  49081. 802f71c: e01d b.n 802f75a <ifentry_get_value+0xc6>
  49082. }
  49083. else
  49084. {
  49085. *sint_ptr = 2;
  49086. 802f71e: 2302 movs r3, #2
  49087. 802f720: e01b b.n 802f75a <ifentry_get_value+0xc6>
  49088. }
  49089. break;
  49090. case 9: /* ifLastChange */
  49091. {
  49092. u32_t *uint_ptr = (u32_t*)value;
  49093. *uint_ptr = netif->ts;
  49094. 802f722: 9b01 ldr r3, [sp, #4]
  49095. 802f724: 6b9b ldr r3, [r3, #56] ; 0x38
  49096. 802f726: e018 b.n 802f75a <ifentry_get_value+0xc6>
  49097. }
  49098. break;
  49099. case 10: /* ifInOctets */
  49100. {
  49101. u32_t *uint_ptr = (u32_t*)value;
  49102. *uint_ptr = netif->ifinoctets;
  49103. 802f728: 9b01 ldr r3, [sp, #4]
  49104. 802f72a: 6bdb ldr r3, [r3, #60] ; 0x3c
  49105. 802f72c: e015 b.n 802f75a <ifentry_get_value+0xc6>
  49106. }
  49107. break;
  49108. case 11: /* ifInUcastPkts */
  49109. {
  49110. u32_t *uint_ptr = (u32_t*)value;
  49111. *uint_ptr = netif->ifinucastpkts;
  49112. 802f72e: 9b01 ldr r3, [sp, #4]
  49113. 802f730: 6c1b ldr r3, [r3, #64] ; 0x40
  49114. 802f732: e012 b.n 802f75a <ifentry_get_value+0xc6>
  49115. }
  49116. break;
  49117. case 12: /* ifInNUcastPkts */
  49118. {
  49119. u32_t *uint_ptr = (u32_t*)value;
  49120. *uint_ptr = netif->ifinnucastpkts;
  49121. 802f734: 9b01 ldr r3, [sp, #4]
  49122. 802f736: 6c5b ldr r3, [r3, #68] ; 0x44
  49123. 802f738: e00f b.n 802f75a <ifentry_get_value+0xc6>
  49124. }
  49125. break;
  49126. case 13: /* ifInDiscarts */
  49127. {
  49128. u32_t *uint_ptr = (u32_t*)value;
  49129. *uint_ptr = netif->ifindiscards;
  49130. 802f73a: 9b01 ldr r3, [sp, #4]
  49131. 802f73c: 6c9b ldr r3, [r3, #72] ; 0x48
  49132. 802f73e: e00c b.n 802f75a <ifentry_get_value+0xc6>
  49133. }
  49134. break;
  49135. case 16: /* ifOutOctets */
  49136. {
  49137. u32_t *uint_ptr = (u32_t*)value;
  49138. *uint_ptr = netif->ifoutoctets;
  49139. 802f740: 9b01 ldr r3, [sp, #4]
  49140. 802f742: 6cdb ldr r3, [r3, #76] ; 0x4c
  49141. 802f744: e009 b.n 802f75a <ifentry_get_value+0xc6>
  49142. }
  49143. break;
  49144. case 17: /* ifOutUcastPkts */
  49145. {
  49146. u32_t *uint_ptr = (u32_t*)value;
  49147. *uint_ptr = netif->ifoutucastpkts;
  49148. 802f746: 9b01 ldr r3, [sp, #4]
  49149. 802f748: 6d1b ldr r3, [r3, #80] ; 0x50
  49150. 802f74a: e006 b.n 802f75a <ifentry_get_value+0xc6>
  49151. }
  49152. break;
  49153. case 18: /* ifOutNUcastPkts */
  49154. {
  49155. u32_t *uint_ptr = (u32_t*)value;
  49156. *uint_ptr = netif->ifoutnucastpkts;
  49157. 802f74c: 9b01 ldr r3, [sp, #4]
  49158. 802f74e: 6d5b ldr r3, [r3, #84] ; 0x54
  49159. 802f750: e003 b.n 802f75a <ifentry_get_value+0xc6>
  49160. }
  49161. break;
  49162. case 19: /* ifOutDiscarts */
  49163. {
  49164. u32_t *uint_ptr = (u32_t*)value;
  49165. *uint_ptr = netif->ifoutdiscards;
  49166. 802f752: 9b01 ldr r3, [sp, #4]
  49167. 802f754: 6d9b ldr r3, [r3, #88] ; 0x58
  49168. 802f756: e000 b.n 802f75a <ifentry_get_value+0xc6>
  49169. break;
  49170. case 21: /* ifOutQLen */
  49171. /** @todo figure out if this must be 0 (no queue) or 1? */
  49172. {
  49173. u32_t *uint_ptr = (u32_t*)value;
  49174. *uint_ptr = 0;
  49175. 802f758: 2300 movs r3, #0
  49176. 802f75a: 6023 str r3, [r4, #0]
  49177. }
  49178. break;
  49179. 802f75c: e005 b.n 802f76a <ifentry_get_value+0xd6>
  49180. case 22: /* ifSpecific */
  49181. objectidncpy((s32_t*)value, (s32_t*)ifspecific.id, (u8_t)(len / sizeof(s32_t)));
  49182. 802f75e: 4620 mov r0, r4
  49183. 802f760: 4902 ldr r1, [pc, #8] ; (802f76c <ifentry_get_value+0xd8>)
  49184. 802f762: f3c5 0287 ubfx r2, r5, #2, #8
  49185. 802f766: f7ff ff89 bl 802f67c <objectidncpy>
  49186. break;
  49187. };
  49188. }
  49189. 802f76a: bd7c pop {r2, r3, r4, r5, r6, pc}
  49190. 802f76c: 0803ae80 .word 0x0803ae80
  49191. 0802f770 <ip_rteentry_get_value>:
  49192. }
  49193. }
  49194. static void
  49195. ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
  49196. {
  49197. 802f770: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
  49198. struct netif *netif;
  49199. ip_addr_t dest;
  49200. s32_t *ident;
  49201. u8_t id;
  49202. ident = od->id_inst_ptr;
  49203. 802f772: 6885 ldr r5, [r0, #8]
  49204. }
  49205. }
  49206. static void
  49207. ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
  49208. {
  49209. 802f774: 460f mov r7, r1
  49210. ip_addr_t dest;
  49211. s32_t *ident;
  49212. u8_t id;
  49213. ident = od->id_inst_ptr;
  49214. snmp_oidtoip(&ident[1], &dest);
  49215. 802f776: 1d28 adds r0, r5, #4
  49216. 802f778: a901 add r1, sp, #4
  49217. }
  49218. }
  49219. static void
  49220. ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
  49221. {
  49222. 802f77a: 4614 mov r4, r2
  49223. ip_addr_t dest;
  49224. s32_t *ident;
  49225. u8_t id;
  49226. ident = od->id_inst_ptr;
  49227. snmp_oidtoip(&ident[1], &dest);
  49228. 802f77c: f000 fd44 bl 8030208 <snmp_oidtoip>
  49229. if (ip_addr_isany(&dest))
  49230. 802f780: 9b01 ldr r3, [sp, #4]
  49231. 802f782: b91b cbnz r3, 802f78c <ip_rteentry_get_value+0x1c>
  49232. {
  49233. /* ip_route() uses default netif for default route */
  49234. netif = netif_default;
  49235. 802f784: 4a23 ldr r2, [pc, #140] ; (802f814 <ip_rteentry_get_value+0xa4>)
  49236. 802f786: 6810 ldr r0, [r2, #0]
  49237. !ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) )
  49238. {
  49239. netif = netif->next;
  49240. }
  49241. }
  49242. if (netif != NULL)
  49243. 802f788: b960 cbnz r0, 802f7a4 <ip_rteentry_get_value+0x34>
  49244. 802f78a: e041 b.n 802f810 <ip_rteentry_get_value+0xa0>
  49245. netif = netif_default;
  49246. }
  49247. else
  49248. {
  49249. /* not using ip_route(), need exact match! */
  49250. netif = netif_list;
  49251. 802f78c: 4a22 ldr r2, [pc, #136] ; (802f818 <ip_rteentry_get_value+0xa8>)
  49252. 802f78e: 6810 ldr r0, [r2, #0]
  49253. while ((netif != NULL) &&
  49254. 802f790: e000 b.n 802f794 <ip_rteentry_get_value+0x24>
  49255. !ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) )
  49256. {
  49257. netif = netif->next;
  49258. 802f792: 6800 ldr r0, [r0, #0]
  49259. }
  49260. else
  49261. {
  49262. /* not using ip_route(), need exact match! */
  49263. netif = netif_list;
  49264. while ((netif != NULL) &&
  49265. 802f794: 2800 cmp r0, #0
  49266. 802f796: d03b beq.n 802f810 <ip_rteentry_get_value+0xa0>
  49267. !ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) )
  49268. 802f798: 6846 ldr r6, [r0, #4]
  49269. 802f79a: ea83 0206 eor.w r2, r3, r6
  49270. 802f79e: 6886 ldr r6, [r0, #8]
  49271. }
  49272. else
  49273. {
  49274. /* not using ip_route(), need exact match! */
  49275. netif = netif_list;
  49276. while ((netif != NULL) &&
  49277. 802f7a0: 4232 tst r2, r6
  49278. 802f7a2: d1f6 bne.n 802f792 <ip_rteentry_get_value+0x22>
  49279. }
  49280. if (netif != NULL)
  49281. {
  49282. LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
  49283. id = (u8_t)ident[0];
  49284. switch (id)
  49285. 802f7a4: 782d ldrb r5, [r5, #0]
  49286. 802f7a6: 3d01 subs r5, #1
  49287. 802f7a8: 2d0c cmp r5, #12
  49288. 802f7aa: d831 bhi.n 802f810 <ip_rteentry_get_value+0xa0>
  49289. 802f7ac: e8df f005 tbb [pc, r5]
  49290. 802f7b0: 14110d07 .word 0x14110d07
  49291. 802f7b4: 1c171414 .word 0x1c171414
  49292. 802f7b8: 14252321 .word 0x14252321
  49293. 802f7bc: 2a .byte 0x2a
  49294. 802f7bd: 00 .byte 0x00
  49295. {
  49296. case 1: /* ipRouteDest */
  49297. {
  49298. ip_addr_t *dst = (ip_addr_t*)value;
  49299. if (ip_addr_isany(&dest))
  49300. 802f7be: b903 cbnz r3, 802f7c2 <ip_rteentry_get_value+0x52>
  49301. 802f7c0: e01e b.n 802f800 <ip_rteentry_get_value+0x90>
  49302. ip_addr_set_zero(dst);
  49303. }
  49304. else
  49305. {
  49306. /* netifs have netaddress dest */
  49307. ip_addr_get_network(dst, &netif->ip_addr, &netif->netmask);
  49308. 802f7c2: 6882 ldr r2, [r0, #8]
  49309. 802f7c4: 6843 ldr r3, [r0, #4]
  49310. 802f7c6: 4013 ands r3, r2
  49311. 802f7c8: e01a b.n 802f800 <ip_rteentry_get_value+0x90>
  49312. break;
  49313. case 2: /* ipRouteIfIndex */
  49314. {
  49315. s32_t *sint_ptr = (s32_t*)value;
  49316. snmp_netiftoifindex(netif, sint_ptr);
  49317. 802f7ca: 4621 mov r1, r4
  49318. 802f7cc: f000 fd0c bl 80301e8 <snmp_netiftoifindex>
  49319. }
  49320. break;
  49321. 802f7d0: e01e b.n 802f810 <ip_rteentry_get_value+0xa0>
  49322. case 3: /* ipRouteMetric1 */
  49323. {
  49324. s32_t *sint_ptr = (s32_t*)value;
  49325. if (ip_addr_isany(&dest))
  49326. 802f7d2: b983 cbnz r3, 802f7f6 <ip_rteentry_get_value+0x86>
  49327. {
  49328. /* default rte has metric 1 */
  49329. *sint_ptr = 1;
  49330. 802f7d4: 2301 movs r3, #1
  49331. 802f7d6: e013 b.n 802f800 <ip_rteentry_get_value+0x90>
  49332. case 6: /* ipRouteMetric4 */
  49333. case 12: /* ipRouteMetric5 */
  49334. {
  49335. s32_t *sint_ptr = (s32_t*)value;
  49336. /* not used */
  49337. *sint_ptr = -1;
  49338. 802f7d8: f04f 33ff mov.w r3, #4294967295
  49339. 802f7dc: e010 b.n 802f800 <ip_rteentry_get_value+0x90>
  49340. break;
  49341. case 7: /* ipRouteNextHop */
  49342. {
  49343. ip_addr_t *dst = (ip_addr_t*)value;
  49344. if (ip_addr_isany(&dest))
  49345. 802f7de: b90b cbnz r3, 802f7e4 <ip_rteentry_get_value+0x74>
  49346. {
  49347. /* default rte: gateway */
  49348. *dst = netif->gw;
  49349. 802f7e0: 68c3 ldr r3, [r0, #12]
  49350. 802f7e2: e00d b.n 802f800 <ip_rteentry_get_value+0x90>
  49351. }
  49352. else
  49353. {
  49354. /* other rtes: netif ip_addr */
  49355. *dst = netif->ip_addr;
  49356. 802f7e4: 6843 ldr r3, [r0, #4]
  49357. 802f7e6: e00b b.n 802f800 <ip_rteentry_get_value+0x90>
  49358. break;
  49359. case 8: /* ipRouteType */
  49360. {
  49361. s32_t *sint_ptr = (s32_t*)value;
  49362. if (ip_addr_isany(&dest))
  49363. 802f7e8: b90b cbnz r3, 802f7ee <ip_rteentry_get_value+0x7e>
  49364. {
  49365. /* default rte is indirect */
  49366. *sint_ptr = 4;
  49367. 802f7ea: 2304 movs r3, #4
  49368. 802f7ec: e008 b.n 802f800 <ip_rteentry_get_value+0x90>
  49369. }
  49370. else
  49371. {
  49372. /* other rtes are direct */
  49373. *sint_ptr = 3;
  49374. 802f7ee: 2303 movs r3, #3
  49375. 802f7f0: e006 b.n 802f800 <ip_rteentry_get_value+0x90>
  49376. break;
  49377. case 9: /* ipRouteProto */
  49378. {
  49379. s32_t *sint_ptr = (s32_t*)value;
  49380. /* locally defined routes */
  49381. *sint_ptr = 2;
  49382. 802f7f2: 2302 movs r3, #2
  49383. 802f7f4: e004 b.n 802f800 <ip_rteentry_get_value+0x90>
  49384. case 10: /* ipRouteAge */
  49385. {
  49386. s32_t *sint_ptr = (s32_t*)value;
  49387. /** @todo (sysuptime - timestamp last change) / 100
  49388. @see snmp_insert_iprteidx_tree() */
  49389. *sint_ptr = 0;
  49390. 802f7f6: 2300 movs r3, #0
  49391. 802f7f8: e002 b.n 802f800 <ip_rteentry_get_value+0x90>
  49392. break;
  49393. case 11: /* ipRouteMask */
  49394. {
  49395. ip_addr_t *dst = (ip_addr_t*)value;
  49396. if (ip_addr_isany(&dest))
  49397. 802f7fa: b903 cbnz r3, 802f7fe <ip_rteentry_get_value+0x8e>
  49398. 802f7fc: e000 b.n 802f800 <ip_rteentry_get_value+0x90>
  49399. ip_addr_set_zero(dst);
  49400. }
  49401. else
  49402. {
  49403. /* other rtes use netmask */
  49404. *dst = netif->netmask;
  49405. 802f7fe: 6883 ldr r3, [r0, #8]
  49406. 802f800: 6023 str r3, [r4, #0]
  49407. 802f802: e005 b.n 802f810 <ip_rteentry_get_value+0xa0>
  49408. }
  49409. }
  49410. break;
  49411. case 13: /* ipRouteInfo */
  49412. objectidncpy((s32_t*)value, (s32_t*)iprouteinfo.id, (u8_t)(len / sizeof(s32_t)));
  49413. 802f804: 4620 mov r0, r4
  49414. 802f806: 4905 ldr r1, [pc, #20] ; (802f81c <ip_rteentry_get_value+0xac>)
  49415. 802f808: f3c7 0287 ubfx r2, r7, #2, #8
  49416. 802f80c: f7ff ff36 bl 802f67c <objectidncpy>
  49417. break;
  49418. }
  49419. }
  49420. }
  49421. 802f810: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc}
  49422. 802f812: bf00 nop
  49423. 802f814: 20010d70 .word 0x20010d70
  49424. 802f818: 20010d6c .word 0x20010d6c
  49425. 802f81c: 0803ac94 .word 0x0803ac94
  49426. 0802f820 <snmp_set_sysdesr>:
  49427. * @param str if non-NULL then copy str pointer
  49428. * @param len points to string length, excluding zero terminator
  49429. */
  49430. void snmp_set_sysdesr(u8_t *str, u8_t *len)
  49431. {
  49432. if (str != NULL)
  49433. 802f820: b118 cbz r0, 802f82a <snmp_set_sysdesr+0xa>
  49434. {
  49435. sysdescr_ptr = str;
  49436. 802f822: 4b02 ldr r3, [pc, #8] ; (802f82c <snmp_set_sysdesr+0xc>)
  49437. 802f824: 6018 str r0, [r3, #0]
  49438. sysdescr_len_ptr = len;
  49439. 802f826: 4b02 ldr r3, [pc, #8] ; (802f830 <snmp_set_sysdesr+0x10>)
  49440. 802f828: 6019 str r1, [r3, #0]
  49441. 802f82a: 4770 bx lr
  49442. 802f82c: 20001788 .word 0x20001788
  49443. 802f830: 20001804 .word 0x20001804
  49444. 0802f834 <snmp_get_sysuptime>:
  49445. {
  49446. sysuptime+=value;
  49447. }
  49448. void snmp_get_sysuptime(u32_t *value)
  49449. {
  49450. 802f834: b510 push {r4, lr}
  49451. 802f836: 4604 mov r4, r0
  49452. SNMP_GET_SYSUPTIME(sysuptime);
  49453. 802f838: f003 f975 bl 8032b26 <sys_now>
  49454. 802f83c: 230a movs r3, #10
  49455. 802f83e: 4a03 ldr r2, [pc, #12] ; (802f84c <snmp_get_sysuptime+0x18>)
  49456. 802f840: fbb0 f0f3 udiv r0, r0, r3
  49457. 802f844: 6010 str r0, [r2, #0]
  49458. *value = sysuptime;
  49459. 802f846: 6020 str r0, [r4, #0]
  49460. 802f848: bd10 pop {r4, pc}
  49461. 802f84a: bf00 nop
  49462. 802f84c: 2000e1c4 .word 0x2000e1c4
  49463. 0802f850 <system_get_value>:
  49464. * @param len return value space (in bytes)
  49465. * @param value points to (varbind) space to copy value into.
  49466. */
  49467. static void
  49468. system_get_value(struct obj_def *od, u16_t len, void *value)
  49469. {
  49470. 802f850: 4613 mov r3, r2
  49471. u8_t id;
  49472. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  49473. id = (u8_t)od->id_inst_ptr[0];
  49474. 802f852: 6882 ldr r2, [r0, #8]
  49475. switch (id)
  49476. 802f854: 7812 ldrb r2, [r2, #0]
  49477. 802f856: 3a01 subs r2, #1
  49478. * @param len return value space (in bytes)
  49479. * @param value points to (varbind) space to copy value into.
  49480. */
  49481. static void
  49482. system_get_value(struct obj_def *od, u16_t len, void *value)
  49483. {
  49484. 802f858: b510 push {r4, lr}
  49485. 802f85a: 460c mov r4, r1
  49486. u8_t id;
  49487. LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
  49488. id = (u8_t)od->id_inst_ptr[0];
  49489. switch (id)
  49490. 802f85c: 2a06 cmp r2, #6
  49491. 802f85e: d825 bhi.n 802f8ac <system_get_value+0x5c>
  49492. 802f860: e8df f002 tbb [pc, r2]
  49493. 802f864: 140f0704 .word 0x140f0704
  49494. 802f868: 1a17 .short 0x1a17
  49495. 802f86a: 22 .byte 0x22
  49496. 802f86b: 00 .byte 0x00
  49497. {
  49498. case 1: /* sysDescr */
  49499. ocstrncpy((u8_t*)value, sysdescr_ptr, len);
  49500. 802f86c: 4618 mov r0, r3
  49501. 802f86e: 4b10 ldr r3, [pc, #64] ; (802f8b0 <system_get_value+0x60>)
  49502. 802f870: e014 b.n 802f89c <system_get_value+0x4c>
  49503. break;
  49504. case 2: /* sysObjectID */
  49505. objectidncpy((s32_t*)value, (s32_t*)sysobjid.id, (u8_t)(len / sizeof(s32_t)));
  49506. 802f872: 4910 ldr r1, [pc, #64] ; (802f8b4 <system_get_value+0x64>)
  49507. 802f874: 4618 mov r0, r3
  49508. 802f876: f3c4 0287 ubfx r2, r4, #2, #8
  49509. s32_t *sint_ptr = (s32_t*)value;
  49510. *sint_ptr = sysservices;
  49511. }
  49512. break;
  49513. };
  49514. }
  49515. 802f87a: e8bd 4010 ldmia.w sp!, {r4, lr}
  49516. {
  49517. case 1: /* sysDescr */
  49518. ocstrncpy((u8_t*)value, sysdescr_ptr, len);
  49519. break;
  49520. case 2: /* sysObjectID */
  49521. objectidncpy((s32_t*)value, (s32_t*)sysobjid.id, (u8_t)(len / sizeof(s32_t)));
  49522. 802f87e: f7ff befd b.w 802f67c <objectidncpy>
  49523. break;
  49524. case 3: /* sysUpTime */
  49525. {
  49526. snmp_get_sysuptime((u32_t*)value);
  49527. 802f882: 4618 mov r0, r3
  49528. s32_t *sint_ptr = (s32_t*)value;
  49529. *sint_ptr = sysservices;
  49530. }
  49531. break;
  49532. };
  49533. }
  49534. 802f884: e8bd 4010 ldmia.w sp!, {r4, lr}
  49535. case 2: /* sysObjectID */
  49536. objectidncpy((s32_t*)value, (s32_t*)sysobjid.id, (u8_t)(len / sizeof(s32_t)));
  49537. break;
  49538. case 3: /* sysUpTime */
  49539. {
  49540. snmp_get_sysuptime((u32_t*)value);
  49541. 802f888: f7ff bfd4 b.w 802f834 <snmp_get_sysuptime>
  49542. }
  49543. break;
  49544. case 4: /* sysContact */
  49545. ocstrncpy((u8_t*)value, syscontact_ptr, len);
  49546. 802f88c: 4618 mov r0, r3
  49547. 802f88e: 4b0a ldr r3, [pc, #40] ; (802f8b8 <system_get_value+0x68>)
  49548. 802f890: e004 b.n 802f89c <system_get_value+0x4c>
  49549. break;
  49550. case 5: /* sysName */
  49551. ocstrncpy((u8_t*)value, sysname_ptr, len);
  49552. 802f892: 4618 mov r0, r3
  49553. 802f894: 4b09 ldr r3, [pc, #36] ; (802f8bc <system_get_value+0x6c>)
  49554. 802f896: e001 b.n 802f89c <system_get_value+0x4c>
  49555. break;
  49556. case 6: /* sysLocation */
  49557. ocstrncpy((u8_t*)value, syslocation_ptr, len);
  49558. 802f898: 4618 mov r0, r3
  49559. 802f89a: 4b09 ldr r3, [pc, #36] ; (802f8c0 <system_get_value+0x70>)
  49560. 802f89c: 6819 ldr r1, [r3, #0]
  49561. 802f89e: 4622 mov r2, r4
  49562. s32_t *sint_ptr = (s32_t*)value;
  49563. *sint_ptr = sysservices;
  49564. }
  49565. break;
  49566. };
  49567. }
  49568. 802f8a0: e8bd 4010 ldmia.w sp!, {r4, lr}
  49569. break;
  49570. case 5: /* sysName */
  49571. ocstrncpy((u8_t*)value, sysname_ptr, len);
  49572. break;
  49573. case 6: /* sysLocation */
  49574. ocstrncpy((u8_t*)value, syslocation_ptr, len);
  49575. 802f8a4: f7ff beb2 b.w 802f60c <ocstrncpy>
  49576. break;
  49577. case 7: /* sysServices */
  49578. {
  49579. s32_t *sint_ptr = (s32_t*)value;
  49580. *sint_ptr = sysservices;
  49581. 802f8a8: 2248 movs r2, #72 ; 0x48
  49582. 802f8aa: 601a str r2, [r3, #0]
  49583. 802f8ac: bd10 pop {r4, pc}
  49584. 802f8ae: bf00 nop
  49585. 802f8b0: 20001788 .word 0x20001788
  49586. 802f8b4: 200016b8 .word 0x200016b8
  49587. 802f8b8: 200017dc .word 0x200017dc
  49588. 802f8bc: 20001768 .word 0x20001768
  49589. 802f8c0: 200018f4 .word 0x200018f4
  49590. 0802f8c4 <snmp_set_syscontact>:
  49591. * @param ocstr if non-NULL then copy str pointer
  49592. * @param ocstrlen points to string length, excluding zero terminator
  49593. */
  49594. void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen)
  49595. {
  49596. if (ocstr != NULL)
  49597. 802f8c4: b118 cbz r0, 802f8ce <snmp_set_syscontact+0xa>
  49598. {
  49599. syscontact_ptr = ocstr;
  49600. 802f8c6: 4b02 ldr r3, [pc, #8] ; (802f8d0 <snmp_set_syscontact+0xc>)
  49601. 802f8c8: 6018 str r0, [r3, #0]
  49602. syscontact_len_ptr = ocstrlen;
  49603. 802f8ca: 4b02 ldr r3, [pc, #8] ; (802f8d4 <snmp_set_syscontact+0x10>)
  49604. 802f8cc: 6019 str r1, [r3, #0]
  49605. 802f8ce: 4770 bx lr
  49606. 802f8d0: 200017dc .word 0x200017dc
  49607. 802f8d4: 20001660 .word 0x20001660
  49608. 0802f8d8 <snmp_set_syslocation>:
  49609. * @param ocstr if non-NULL then copy str pointer
  49610. * @param ocstrlen points to string length, excluding zero terminator
  49611. */
  49612. void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen)
  49613. {
  49614. if (ocstr != NULL)
  49615. 802f8d8: b118 cbz r0, 802f8e2 <snmp_set_syslocation+0xa>
  49616. {
  49617. syslocation_ptr = ocstr;
  49618. 802f8da: 4b02 ldr r3, [pc, #8] ; (802f8e4 <snmp_set_syslocation+0xc>)
  49619. 802f8dc: 6018 str r0, [r3, #0]
  49620. syslocation_len_ptr = ocstrlen;
  49621. 802f8de: 4b02 ldr r3, [pc, #8] ; (802f8e8 <snmp_set_syslocation+0x10>)
  49622. 802f8e0: 6019 str r1, [r3, #0]
  49623. 802f8e2: 4770 bx lr
  49624. 802f8e4: 200018f4 .word 0x200018f4
  49625. 802f8e8: 20001848 .word 0x20001848
  49626. 0802f8ec <snmp_inc_iflist>:
  49627. {
  49628. (ni->ifoutdiscards)++;
  49629. }
  49630. void snmp_inc_iflist(void)
  49631. {
  49632. 802f8ec: b507 push {r0, r1, r2, lr}
  49633. struct mib_list_node *if_node = NULL;
  49634. snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node);
  49635. 802f8ee: 4806 ldr r0, [pc, #24] ; (802f908 <snmp_inc_iflist+0x1c>)
  49636. (ni->ifoutdiscards)++;
  49637. }
  49638. void snmp_inc_iflist(void)
  49639. {
  49640. struct mib_list_node *if_node = NULL;
  49641. 802f8f0: aa02 add r2, sp, #8
  49642. snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node);
  49643. 802f8f2: 8b81 ldrh r1, [r0, #28]
  49644. (ni->ifoutdiscards)++;
  49645. }
  49646. void snmp_inc_iflist(void)
  49647. {
  49648. struct mib_list_node *if_node = NULL;
  49649. 802f8f4: 2300 movs r3, #0
  49650. 802f8f6: f842 3d04 str.w r3, [r2, #-4]!
  49651. snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node);
  49652. 802f8fa: 3101 adds r1, #1
  49653. 802f8fc: f000 fccc bl 8030298 <snmp_mib_node_insert>
  49654. /* enable getnext traversal on filled table */
  49655. iftable.maxlength = 1;
  49656. 802f900: 4b02 ldr r3, [pc, #8] ; (802f90c <snmp_inc_iflist+0x20>)
  49657. 802f902: 2201 movs r2, #1
  49658. 802f904: 825a strh r2, [r3, #18]
  49659. }
  49660. 802f906: bd0e pop {r1, r2, r3, pc}
  49661. 802f908: 20001694 .word 0x20001694
  49662. 802f90c: 2000180c .word 0x2000180c
  49663. 0802f910 <snmp_insert_arpidx_tree>:
  49664. /**
  49665. * Inserts ARP table indexes (.xIfIndex.xNetAddress)
  49666. * into arp table index trees (both atTable and ipNetToMediaTable).
  49667. */
  49668. void snmp_insert_arpidx_tree(struct netif *ni, ip_addr_t *ip)
  49669. {
  49670. 802f910: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  49671. 802f914: b086 sub sp, #24
  49672. 802f916: 460c mov r4, r1
  49673. struct mib_list_node *at_node;
  49674. s32_t arpidx[5];
  49675. u8_t level, tree;
  49676. LWIP_ASSERT("ni != NULL", ni != NULL);
  49677. snmp_netiftoifindex(ni, &arpidx[0]);
  49678. 802f918: a901 add r1, sp, #4
  49679. 802f91a: f000 fc65 bl 80301e8 <snmp_netiftoifindex>
  49680. snmp_iptooid(ip, &arpidx[1]);
  49681. 802f91e: 4620 mov r0, r4
  49682. 802f920: a902 add r1, sp, #8
  49683. 802f922: f000 fc7e bl 8030222 <snmp_iptooid>
  49684. for (tree = 0; tree < 2; tree++)
  49685. {
  49686. if (tree == 0)
  49687. {
  49688. at_rn = &arptree_root;
  49689. 802f926: f8df 80a0 ldr.w r8, [pc, #160] ; 802f9c8 <snmp_insert_arpidx_tree+0xb8>
  49690. LWIP_ASSERT("ni != NULL", ni != NULL);
  49691. snmp_netiftoifindex(ni, &arpidx[0]);
  49692. snmp_iptooid(ip, &arpidx[1]);
  49693. for (tree = 0; tree < 2; tree++)
  49694. 802f92a: 2500 movs r5, #0
  49695. {
  49696. if (tree == 0)
  49697. {
  49698. at_rn = &arptree_root;
  49699. 802f92c: 4c1f ldr r4, [pc, #124] ; (802f9ac <snmp_insert_arpidx_tree+0x9c>)
  49700. else
  49701. {
  49702. at_rn->get_object_def = ip_ntomentry_get_object_def;
  49703. at_rn->get_value = ip_ntomentry_get_value;
  49704. }
  49705. at_rn->set_test = noleafs_set_test;
  49706. 802f92e: f8df 909c ldr.w r9, [pc, #156] ; 802f9cc <snmp_insert_arpidx_tree+0xbc>
  49707. at_rn->set_value = noleafs_set_value;
  49708. 802f932: f8df a09c ldr.w sl, [pc, #156] ; 802f9d0 <snmp_insert_arpidx_tree+0xc0>
  49709. for (tree = 0; tree < 2; tree++)
  49710. {
  49711. if (tree == 0)
  49712. {
  49713. at_rn = &arptree_root;
  49714. 802f936: 2d00 cmp r5, #0
  49715. 802f938: bf18 it ne
  49716. 802f93a: 4644 movne r4, r8
  49717. }
  49718. else
  49719. {
  49720. at_rn = &ipntomtree_root;
  49721. 802f93c: 2600 movs r6, #0
  49722. }
  49723. for (level = 0; level < 5; level++)
  49724. {
  49725. at_node = NULL;
  49726. 802f93e: 2300 movs r3, #0
  49727. 802f940: 9300 str r3, [sp, #0]
  49728. snmp_mib_node_insert(at_rn, arpidx[level], &at_node);
  49729. 802f942: ab01 add r3, sp, #4
  49730. 802f944: 4620 mov r0, r4
  49731. 802f946: f853 1026 ldr.w r1, [r3, r6, lsl #2]
  49732. 802f94a: aa00 add r2, sp, #0
  49733. 802f94c: b2f7 uxtb r7, r6
  49734. 802f94e: f000 fca3 bl 8030298 <snmp_mib_node_insert>
  49735. if ((level != 4) && (at_node != NULL))
  49736. 802f952: 2f04 cmp r7, #4
  49737. 802f954: d01d beq.n 802f992 <snmp_insert_arpidx_tree+0x82>
  49738. 802f956: 9b00 ldr r3, [sp, #0]
  49739. 802f958: b1db cbz r3, 802f992 <snmp_insert_arpidx_tree+0x82>
  49740. {
  49741. if (at_node->nptr == NULL)
  49742. 802f95a: 68dc ldr r4, [r3, #12]
  49743. 802f95c: b9cc cbnz r4, 802f992 <snmp_insert_arpidx_tree+0x82>
  49744. {
  49745. at_rn = snmp_mib_lrn_alloc();
  49746. 802f95e: f000 fc79 bl 8030254 <snmp_mib_lrn_alloc>
  49747. at_node->nptr = (struct mib_node*)at_rn;
  49748. 802f962: 9b00 ldr r3, [sp, #0]
  49749. snmp_mib_node_insert(at_rn, arpidx[level], &at_node);
  49750. if ((level != 4) && (at_node != NULL))
  49751. {
  49752. if (at_node->nptr == NULL)
  49753. {
  49754. at_rn = snmp_mib_lrn_alloc();
  49755. 802f964: 4604 mov r4, r0
  49756. at_node->nptr = (struct mib_node*)at_rn;
  49757. 802f966: 60d8 str r0, [r3, #12]
  49758. if (at_rn != NULL)
  49759. 802f968: b920 cbnz r0, 802f974 <snmp_insert_arpidx_tree+0x64>
  49760. LWIP_ASSERT("ni != NULL", ni != NULL);
  49761. snmp_netiftoifindex(ni, &arpidx[0]);
  49762. snmp_iptooid(ip, &arpidx[1]);
  49763. for (tree = 0; tree < 2; tree++)
  49764. 802f96a: 3501 adds r5, #1
  49765. 802f96c: b2ed uxtb r5, r5
  49766. 802f96e: 2d02 cmp r5, #2
  49767. 802f970: d1dc bne.n 802f92c <snmp_insert_arpidx_tree+0x1c>
  49768. 802f972: e012 b.n 802f99a <snmp_insert_arpidx_tree+0x8a>
  49769. {
  49770. at_rn = snmp_mib_lrn_alloc();
  49771. at_node->nptr = (struct mib_node*)at_rn;
  49772. if (at_rn != NULL)
  49773. {
  49774. if (level == 3)
  49775. 802f974: 2f03 cmp r7, #3
  49776. 802f976: d10c bne.n 802f992 <snmp_insert_arpidx_tree+0x82>
  49777. {
  49778. if (tree == 0)
  49779. 802f978: b91d cbnz r5, 802f982 <snmp_insert_arpidx_tree+0x72>
  49780. {
  49781. at_rn->get_object_def = atentry_get_object_def;
  49782. 802f97a: 4b0d ldr r3, [pc, #52] ; (802f9b0 <snmp_insert_arpidx_tree+0xa0>)
  49783. 802f97c: 6003 str r3, [r0, #0]
  49784. at_rn->get_value = atentry_get_value;
  49785. 802f97e: 4b0d ldr r3, [pc, #52] ; (802f9b4 <snmp_insert_arpidx_tree+0xa4>)
  49786. 802f980: e002 b.n 802f988 <snmp_insert_arpidx_tree+0x78>
  49787. }
  49788. else
  49789. {
  49790. at_rn->get_object_def = ip_ntomentry_get_object_def;
  49791. 802f982: 4b0d ldr r3, [pc, #52] ; (802f9b8 <snmp_insert_arpidx_tree+0xa8>)
  49792. 802f984: 6003 str r3, [r0, #0]
  49793. at_rn->get_value = ip_ntomentry_get_value;
  49794. 802f986: 4b0d ldr r3, [pc, #52] ; (802f9bc <snmp_insert_arpidx_tree+0xac>)
  49795. 802f988: 6063 str r3, [r4, #4]
  49796. }
  49797. at_rn->set_test = noleafs_set_test;
  49798. 802f98a: f8c4 9008 str.w r9, [r4, #8]
  49799. at_rn->set_value = noleafs_set_value;
  49800. 802f98e: f8c4 a00c str.w sl, [r4, #12]
  49801. 802f992: 3601 adds r6, #1
  49802. }
  49803. else
  49804. {
  49805. at_rn = &ipntomtree_root;
  49806. }
  49807. for (level = 0; level < 5; level++)
  49808. 802f994: 2e05 cmp r6, #5
  49809. 802f996: d1d2 bne.n 802f93e <snmp_insert_arpidx_tree+0x2e>
  49810. 802f998: e7e7 b.n 802f96a <snmp_insert_arpidx_tree+0x5a>
  49811. }
  49812. }
  49813. }
  49814. }
  49815. /* enable getnext traversal on filled tables */
  49816. at.maxlength = 1;
  49817. 802f99a: 4a09 ldr r2, [pc, #36] ; (802f9c0 <snmp_insert_arpidx_tree+0xb0>)
  49818. 802f99c: 2301 movs r3, #1
  49819. 802f99e: 8253 strh r3, [r2, #18]
  49820. ipntomtable.maxlength = 1;
  49821. 802f9a0: 4a08 ldr r2, [pc, #32] ; (802f9c4 <snmp_insert_arpidx_tree+0xb4>)
  49822. 802f9a2: 8253 strh r3, [r2, #18]
  49823. }
  49824. 802f9a4: b006 add sp, #24
  49825. 802f9a6: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  49826. 802f9aa: bf00 nop
  49827. 802f9ac: 200017e0 .word 0x200017e0
  49828. 802f9b0: 0802f3d1 .word 0x0802f3d1
  49829. 802f9b4: 0802f329 .word 0x0802f329
  49830. 802f9b8: 0802f4b5 .word 0x0802f4b5
  49831. 802f9bc: 0802f2cd .word 0x0802f2cd
  49832. 802f9c0: 20001604 .word 0x20001604
  49833. 802f9c4: 200015e8 .word 0x200015e8
  49834. 802f9c8: 200018d0 .word 0x200018d0
  49835. 802f9cc: 0802ebeb .word 0x0802ebeb
  49836. 802f9d0: 0802ebef .word 0x0802ebef
  49837. 0802f9d4 <snmp_delete_arpidx_tree>:
  49838. /**
  49839. * Removes ARP table indexes (.xIfIndex.xNetAddress)
  49840. * from arp table index trees.
  49841. */
  49842. void snmp_delete_arpidx_tree(struct netif *ni, ip_addr_t *ip)
  49843. {
  49844. 802f9d4: b5f0 push {r4, r5, r6, r7, lr}
  49845. 802f9d6: b091 sub sp, #68 ; 0x44
  49846. 802f9d8: 460c mov r4, r1
  49847. struct mib_list_rootnode *at_rn, *next, *del_rn[5];
  49848. struct mib_list_node *at_n, *del_n[5];
  49849. s32_t arpidx[5];
  49850. u8_t fc, tree, level, del_cnt;
  49851. snmp_netiftoifindex(ni, &arpidx[0]);
  49852. 802f9da: a90b add r1, sp, #44 ; 0x2c
  49853. 802f9dc: f000 fc04 bl 80301e8 <snmp_netiftoifindex>
  49854. snmp_iptooid(ip, &arpidx[1]);
  49855. 802f9e0: 4620 mov r0, r4
  49856. 802f9e2: a90c add r1, sp, #48 ; 0x30
  49857. 802f9e4: f000 fc1d bl 8030222 <snmp_iptooid>
  49858. for (tree = 0; tree < 2; tree++)
  49859. 802f9e8: 2700 movs r7, #0
  49860. {
  49861. /* mark nodes for deletion */
  49862. if (tree == 0)
  49863. {
  49864. at_rn = &arptree_root;
  49865. 802f9ea: 4b26 ldr r3, [pc, #152] ; (802fa84 <snmp_delete_arpidx_tree+0xb0>)
  49866. 802f9ec: 4d26 ldr r5, [pc, #152] ; (802fa88 <snmp_delete_arpidx_tree+0xb4>)
  49867. }
  49868. else
  49869. {
  49870. at_rn = &ipntomtree_root;
  49871. 802f9ee: 2600 movs r6, #0
  49872. for (tree = 0; tree < 2; tree++)
  49873. {
  49874. /* mark nodes for deletion */
  49875. if (tree == 0)
  49876. {
  49877. at_rn = &arptree_root;
  49878. 802f9f0: 2f00 cmp r7, #0
  49879. 802f9f2: bf08 it eq
  49880. 802f9f4: 461d moveq r5, r3
  49881. }
  49882. else
  49883. {
  49884. at_rn = &ipntomtree_root;
  49885. 802f9f6: 4634 mov r4, r6
  49886. }
  49887. level = 0;
  49888. del_cnt = 0;
  49889. while ((level < 5) && (at_rn != NULL))
  49890. {
  49891. fc = snmp_mib_node_find(at_rn, arpidx[level], &at_n);
  49892. 802f9f8: ab0b add r3, sp, #44 ; 0x2c
  49893. 802f9fa: 4628 mov r0, r5
  49894. 802f9fc: 58f1 ldr r1, [r6, r3]
  49895. 802f9fe: aa00 add r2, sp, #0
  49896. 802fa00: f000 fc85 bl 803030e <snmp_mib_node_find>
  49897. 802fa04: b2c0 uxtb r0, r0
  49898. if (fc == 0)
  49899. 802fa06: b198 cbz r0, 802fa30 <snmp_delete_arpidx_tree+0x5c>
  49900. {
  49901. /* arpidx[level] does not exist */
  49902. del_cnt = 0;
  49903. at_rn = NULL;
  49904. }
  49905. else if (fc == 1)
  49906. 802fa08: 2801 cmp r0, #1
  49907. 802fa0a: d10b bne.n 802fa24 <snmp_delete_arpidx_tree+0x50>
  49908. {
  49909. del_rn[del_cnt] = at_rn;
  49910. 802fa0c: ab10 add r3, sp, #64 ; 0x40
  49911. 802fa0e: eb03 0284 add.w r2, r3, r4, lsl #2
  49912. del_n[del_cnt] = at_n;
  49913. 802fa12: 9b00 ldr r3, [sp, #0]
  49914. del_cnt = 0;
  49915. at_rn = NULL;
  49916. }
  49917. else if (fc == 1)
  49918. {
  49919. del_rn[del_cnt] = at_rn;
  49920. 802fa14: f842 5c3c str.w r5, [r2, #-60]
  49921. del_n[del_cnt] = at_n;
  49922. del_cnt++;
  49923. 802fa18: 3401 adds r4, #1
  49924. at_rn = NULL;
  49925. }
  49926. else if (fc == 1)
  49927. {
  49928. del_rn[del_cnt] = at_rn;
  49929. del_n[del_cnt] = at_n;
  49930. 802fa1a: f842 3c28 str.w r3, [r2, #-40]
  49931. del_cnt++;
  49932. 802fa1e: b2e4 uxtb r4, r4
  49933. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  49934. 802fa20: 68dd ldr r5, [r3, #12]
  49935. 802fa22: e007 b.n 802fa34 <snmp_delete_arpidx_tree+0x60>
  49936. }
  49937. else if (fc == 2)
  49938. 802fa24: 2802 cmp r0, #2
  49939. 802fa26: d105 bne.n 802fa34 <snmp_delete_arpidx_tree+0x60>
  49940. {
  49941. /* reset delete (2 or more childs) */
  49942. del_cnt = 0;
  49943. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  49944. 802fa28: 9b00 ldr r3, [sp, #0]
  49945. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  49946. }
  49947. else if (fc == 2)
  49948. {
  49949. /* reset delete (2 or more childs) */
  49950. del_cnt = 0;
  49951. 802fa2a: 2400 movs r4, #0
  49952. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  49953. 802fa2c: 68dd ldr r5, [r3, #12]
  49954. 802fa2e: e001 b.n 802fa34 <snmp_delete_arpidx_tree+0x60>
  49955. {
  49956. fc = snmp_mib_node_find(at_rn, arpidx[level], &at_n);
  49957. if (fc == 0)
  49958. {
  49959. /* arpidx[level] does not exist */
  49960. del_cnt = 0;
  49961. 802fa30: 4604 mov r4, r0
  49962. at_rn = NULL;
  49963. 802fa32: 4605 mov r5, r0
  49964. 802fa34: 3604 adds r6, #4
  49965. {
  49966. at_rn = &ipntomtree_root;
  49967. }
  49968. level = 0;
  49969. del_cnt = 0;
  49970. while ((level < 5) && (at_rn != NULL))
  49971. 802fa36: 2e14 cmp r6, #20
  49972. 802fa38: d011 beq.n 802fa5e <snmp_delete_arpidx_tree+0x8a>
  49973. 802fa3a: 2d00 cmp r5, #0
  49974. 802fa3c: d1dc bne.n 802f9f8 <snmp_delete_arpidx_tree+0x24>
  49975. 802fa3e: e00e b.n 802fa5e <snmp_delete_arpidx_tree+0x8a>
  49976. level++;
  49977. }
  49978. /* delete marked index nodes */
  49979. while (del_cnt > 0)
  49980. {
  49981. del_cnt--;
  49982. 802fa40: 3c01 subs r4, #1
  49983. 802fa42: b2e4 uxtb r4, r4
  49984. at_rn = del_rn[del_cnt];
  49985. 802fa44: aa10 add r2, sp, #64 ; 0x40
  49986. 802fa46: eb02 0384 add.w r3, r2, r4, lsl #2
  49987. at_n = del_n[del_cnt];
  49988. 802fa4a: f853 1c28 ldr.w r1, [r3, #-40]
  49989. /* delete marked index nodes */
  49990. while (del_cnt > 0)
  49991. {
  49992. del_cnt--;
  49993. at_rn = del_rn[del_cnt];
  49994. 802fa4e: f853 0c3c ldr.w r0, [r3, #-60]
  49995. at_n = del_n[del_cnt];
  49996. 802fa52: 9100 str r1, [sp, #0]
  49997. next = snmp_mib_node_delete(at_rn, at_n);
  49998. 802fa54: f000 fc75 bl 8030342 <snmp_mib_node_delete>
  49999. if (next != NULL)
  50000. 802fa58: b108 cbz r0, 802fa5e <snmp_delete_arpidx_tree+0x8a>
  50001. {
  50002. LWIP_ASSERT("next_count == 0",next->count == 0);
  50003. snmp_mib_lrn_free(next);
  50004. 802fa5a: f000 fc19 bl 8030290 <snmp_mib_lrn_free>
  50005. at_rn = (struct mib_list_rootnode*)(at_n->nptr);
  50006. }
  50007. level++;
  50008. }
  50009. /* delete marked index nodes */
  50010. while (del_cnt > 0)
  50011. 802fa5e: 2c00 cmp r4, #0
  50012. 802fa60: d1ee bne.n 802fa40 <snmp_delete_arpidx_tree+0x6c>
  50013. u8_t fc, tree, level, del_cnt;
  50014. snmp_netiftoifindex(ni, &arpidx[0]);
  50015. snmp_iptooid(ip, &arpidx[1]);
  50016. for (tree = 0; tree < 2; tree++)
  50017. 802fa62: 3701 adds r7, #1
  50018. 802fa64: b2ff uxtb r7, r7
  50019. 802fa66: 2f02 cmp r7, #2
  50020. 802fa68: d1bf bne.n 802f9ea <snmp_delete_arpidx_tree+0x16>
  50021. snmp_mib_lrn_free(next);
  50022. }
  50023. }
  50024. }
  50025. /* disable getnext traversal on empty tables */
  50026. if(arptree_root.count == 0) at.maxlength = 0;
  50027. 802fa6a: 4b06 ldr r3, [pc, #24] ; (802fa84 <snmp_delete_arpidx_tree+0xb0>)
  50028. 802fa6c: 8b9b ldrh r3, [r3, #28]
  50029. 802fa6e: b90b cbnz r3, 802fa74 <snmp_delete_arpidx_tree+0xa0>
  50030. 802fa70: 4b06 ldr r3, [pc, #24] ; (802fa8c <snmp_delete_arpidx_tree+0xb8>)
  50031. 802fa72: 825c strh r4, [r3, #18]
  50032. if(ipntomtree_root.count == 0) ipntomtable.maxlength = 0;
  50033. 802fa74: 4b04 ldr r3, [pc, #16] ; (802fa88 <snmp_delete_arpidx_tree+0xb4>)
  50034. 802fa76: 8b9b ldrh r3, [r3, #28]
  50035. 802fa78: b90b cbnz r3, 802fa7e <snmp_delete_arpidx_tree+0xaa>
  50036. 802fa7a: 4a05 ldr r2, [pc, #20] ; (802fa90 <snmp_delete_arpidx_tree+0xbc>)
  50037. 802fa7c: 8253 strh r3, [r2, #18]
  50038. }
  50039. 802fa7e: b011 add sp, #68 ; 0x44
  50040. 802fa80: bdf0 pop {r4, r5, r6, r7, pc}
  50041. 802fa82: bf00 nop
  50042. 802fa84: 200017e0 .word 0x200017e0
  50043. 802fa88: 200018d0 .word 0x200018d0
  50044. 802fa8c: 20001604 .word 0x20001604
  50045. 802fa90: 200015e8 .word 0x200015e8
  50046. 0802fa94 <snmp_inc_ipinreceives>:
  50047. void snmp_inc_ipinreceives(void)
  50048. {
  50049. ipinreceives++;
  50050. 802fa94: 4b02 ldr r3, [pc, #8] ; (802faa0 <snmp_inc_ipinreceives+0xc>)
  50051. 802fa96: 681a ldr r2, [r3, #0]
  50052. 802fa98: 3201 adds r2, #1
  50053. 802fa9a: 601a str r2, [r3, #0]
  50054. 802fa9c: 4770 bx lr
  50055. 802fa9e: bf00 nop
  50056. 802faa0: 2000e198 .word 0x2000e198
  50057. 0802faa4 <snmp_inc_ipinhdrerrors>:
  50058. }
  50059. void snmp_inc_ipinhdrerrors(void)
  50060. {
  50061. ipinhdrerrors++;
  50062. 802faa4: 4b02 ldr r3, [pc, #8] ; (802fab0 <snmp_inc_ipinhdrerrors+0xc>)
  50063. 802faa6: 681a ldr r2, [r3, #0]
  50064. 802faa8: 3201 adds r2, #1
  50065. 802faaa: 601a str r2, [r3, #0]
  50066. 802faac: 4770 bx lr
  50067. 802faae: bf00 nop
  50068. 802fab0: 2000e120 .word 0x2000e120
  50069. 0802fab4 <snmp_inc_ipinaddrerrors>:
  50070. }
  50071. void snmp_inc_ipinaddrerrors(void)
  50072. {
  50073. ipinaddrerrors++;
  50074. 802fab4: 4b02 ldr r3, [pc, #8] ; (802fac0 <snmp_inc_ipinaddrerrors+0xc>)
  50075. 802fab6: 681a ldr r2, [r3, #0]
  50076. 802fab8: 3201 adds r2, #1
  50077. 802faba: 601a str r2, [r3, #0]
  50078. 802fabc: 4770 bx lr
  50079. 802fabe: bf00 nop
  50080. 802fac0: 2000e104 .word 0x2000e104
  50081. 0802fac4 <snmp_inc_ipinunknownprotos>:
  50082. ipforwdatagrams++;
  50083. }
  50084. void snmp_inc_ipinunknownprotos(void)
  50085. {
  50086. ipinunknownprotos++;
  50087. 802fac4: 4b02 ldr r3, [pc, #8] ; (802fad0 <snmp_inc_ipinunknownprotos+0xc>)
  50088. 802fac6: 681a ldr r2, [r3, #0]
  50089. 802fac8: 3201 adds r2, #1
  50090. 802faca: 601a str r2, [r3, #0]
  50091. 802facc: 4770 bx lr
  50092. 802face: bf00 nop
  50093. 802fad0: 2000e160 .word 0x2000e160
  50094. 0802fad4 <snmp_inc_ipindiscards>:
  50095. }
  50096. void snmp_inc_ipindiscards(void)
  50097. {
  50098. ipindiscards++;
  50099. 802fad4: 4b02 ldr r3, [pc, #8] ; (802fae0 <snmp_inc_ipindiscards+0xc>)
  50100. 802fad6: 681a ldr r2, [r3, #0]
  50101. 802fad8: 3201 adds r2, #1
  50102. 802fada: 601a str r2, [r3, #0]
  50103. 802fadc: 4770 bx lr
  50104. 802fade: bf00 nop
  50105. 802fae0: 2000e1ec .word 0x2000e1ec
  50106. 0802fae4 <snmp_inc_ipindelivers>:
  50107. }
  50108. void snmp_inc_ipindelivers(void)
  50109. {
  50110. ipindelivers++;
  50111. 802fae4: 4b02 ldr r3, [pc, #8] ; (802faf0 <snmp_inc_ipindelivers+0xc>)
  50112. 802fae6: 681a ldr r2, [r3, #0]
  50113. 802fae8: 3201 adds r2, #1
  50114. 802faea: 601a str r2, [r3, #0]
  50115. 802faec: 4770 bx lr
  50116. 802faee: bf00 nop
  50117. 802faf0: 2000e224 .word 0x2000e224
  50118. 0802faf4 <snmp_inc_ipoutrequests>:
  50119. }
  50120. void snmp_inc_ipoutrequests(void)
  50121. {
  50122. ipoutrequests++;
  50123. 802faf4: 4b02 ldr r3, [pc, #8] ; (802fb00 <snmp_inc_ipoutrequests+0xc>)
  50124. 802faf6: 681a ldr r2, [r3, #0]
  50125. 802faf8: 3201 adds r2, #1
  50126. 802fafa: 601a str r2, [r3, #0]
  50127. 802fafc: 4770 bx lr
  50128. 802fafe: bf00 nop
  50129. 802fb00: 2000e20c .word 0x2000e20c
  50130. 0802fb04 <snmp_inc_ipoutdiscards>:
  50131. }
  50132. void snmp_inc_ipoutdiscards(void)
  50133. {
  50134. ipoutdiscards++;
  50135. 802fb04: 4b02 ldr r3, [pc, #8] ; (802fb10 <snmp_inc_ipoutdiscards+0xc>)
  50136. 802fb06: 681a ldr r2, [r3, #0]
  50137. 802fb08: 3201 adds r2, #1
  50138. 802fb0a: 601a str r2, [r3, #0]
  50139. 802fb0c: 4770 bx lr
  50140. 802fb0e: bf00 nop
  50141. 802fb10: 2000e1b0 .word 0x2000e1b0
  50142. 0802fb14 <snmp_inc_ipoutnoroutes>:
  50143. }
  50144. void snmp_inc_ipoutnoroutes(void)
  50145. {
  50146. ipoutnoroutes++;
  50147. 802fb14: 4b02 ldr r3, [pc, #8] ; (802fb20 <snmp_inc_ipoutnoroutes+0xc>)
  50148. 802fb16: 681a ldr r2, [r3, #0]
  50149. 802fb18: 3201 adds r2, #1
  50150. 802fb1a: 601a str r2, [r3, #0]
  50151. 802fb1c: 4770 bx lr
  50152. 802fb1e: bf00 nop
  50153. 802fb20: 2000e230 .word 0x2000e230
  50154. 0802fb24 <snmp_insert_ipaddridx_tree>:
  50155. /**
  50156. * Inserts ipAddrTable indexes (.ipAdEntAddr)
  50157. * into index tree.
  50158. */
  50159. void snmp_insert_ipaddridx_tree(struct netif *ni)
  50160. {
  50161. 802fb24: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  50162. 802fb28: b086 sub sp, #24
  50163. struct mib_list_node *ipa_node;
  50164. s32_t ipaddridx[4];
  50165. u8_t level;
  50166. LWIP_ASSERT("ni != NULL", ni != NULL);
  50167. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  50168. 802fb2a: 3004 adds r0, #4
  50169. 802fb2c: a902 add r1, sp, #8
  50170. 802fb2e: f000 fb78 bl 8030222 <snmp_iptooid>
  50171. level = 0;
  50172. ipa_rn = &ipaddrtree_root;
  50173. 802fb32: 4c17 ldr r4, [pc, #92] ; (802fb90 <snmp_insert_ipaddridx_tree+0x6c>)
  50174. ipa_node->nptr = (struct mib_node*)ipa_rn;
  50175. if (ipa_rn != NULL)
  50176. {
  50177. if (level == 2)
  50178. {
  50179. ipa_rn->get_object_def = ip_addrentry_get_object_def;
  50180. 802fb34: 4f17 ldr r7, [pc, #92] ; (802fb94 <snmp_insert_ipaddridx_tree+0x70>)
  50181. ipa_rn->get_value = ip_addrentry_get_value;
  50182. 802fb36: f8df 806c ldr.w r8, [pc, #108] ; 802fba4 <snmp_insert_ipaddridx_tree+0x80>
  50183. struct mib_list_node *ipa_node;
  50184. s32_t ipaddridx[4];
  50185. u8_t level;
  50186. LWIP_ASSERT("ni != NULL", ni != NULL);
  50187. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  50188. 802fb3a: 2500 movs r5, #0
  50189. level = 0;
  50190. ipa_rn = &ipaddrtree_root;
  50191. while (level < 4)
  50192. {
  50193. ipa_node = NULL;
  50194. 802fb3c: 2300 movs r3, #0
  50195. 802fb3e: 9301 str r3, [sp, #4]
  50196. snmp_mib_node_insert(ipa_rn, ipaddridx[level], &ipa_node);
  50197. 802fb40: ab02 add r3, sp, #8
  50198. 802fb42: 4620 mov r0, r4
  50199. 802fb44: f853 1025 ldr.w r1, [r3, r5, lsl #2]
  50200. 802fb48: aa01 add r2, sp, #4
  50201. 802fb4a: b2ee uxtb r6, r5
  50202. 802fb4c: f000 fba4 bl 8030298 <snmp_mib_node_insert>
  50203. if ((level != 3) && (ipa_node != NULL))
  50204. 802fb50: 2e03 cmp r6, #3
  50205. 802fb52: d015 beq.n 802fb80 <snmp_insert_ipaddridx_tree+0x5c>
  50206. 802fb54: 9b01 ldr r3, [sp, #4]
  50207. 802fb56: b19b cbz r3, 802fb80 <snmp_insert_ipaddridx_tree+0x5c>
  50208. {
  50209. if (ipa_node->nptr == NULL)
  50210. 802fb58: 68dc ldr r4, [r3, #12]
  50211. 802fb5a: b98c cbnz r4, 802fb80 <snmp_insert_ipaddridx_tree+0x5c>
  50212. {
  50213. ipa_rn = snmp_mib_lrn_alloc();
  50214. 802fb5c: f000 fb7a bl 8030254 <snmp_mib_lrn_alloc>
  50215. ipa_node->nptr = (struct mib_node*)ipa_rn;
  50216. 802fb60: 9b01 ldr r3, [sp, #4]
  50217. snmp_mib_node_insert(ipa_rn, ipaddridx[level], &ipa_node);
  50218. if ((level != 3) && (ipa_node != NULL))
  50219. {
  50220. if (ipa_node->nptr == NULL)
  50221. {
  50222. ipa_rn = snmp_mib_lrn_alloc();
  50223. 802fb62: 4604 mov r4, r0
  50224. ipa_node->nptr = (struct mib_node*)ipa_rn;
  50225. 802fb64: 60d8 str r0, [r3, #12]
  50226. if (ipa_rn != NULL)
  50227. 802fb66: b918 cbnz r0, 802fb70 <snmp_insert_ipaddridx_tree+0x4c>
  50228. }
  50229. }
  50230. level++;
  50231. }
  50232. /* enable getnext traversal on filled table */
  50233. ipaddrtable.maxlength = 1;
  50234. 802fb68: 4b0b ldr r3, [pc, #44] ; (802fb98 <snmp_insert_ipaddridx_tree+0x74>)
  50235. 802fb6a: 2201 movs r2, #1
  50236. 802fb6c: 825a strh r2, [r3, #18]
  50237. 802fb6e: e00b b.n 802fb88 <snmp_insert_ipaddridx_tree+0x64>
  50238. {
  50239. ipa_rn = snmp_mib_lrn_alloc();
  50240. ipa_node->nptr = (struct mib_node*)ipa_rn;
  50241. if (ipa_rn != NULL)
  50242. {
  50243. if (level == 2)
  50244. 802fb70: 2e02 cmp r6, #2
  50245. 802fb72: d105 bne.n 802fb80 <snmp_insert_ipaddridx_tree+0x5c>
  50246. {
  50247. ipa_rn->get_object_def = ip_addrentry_get_object_def;
  50248. ipa_rn->get_value = ip_addrentry_get_value;
  50249. ipa_rn->set_test = noleafs_set_test;
  50250. 802fb74: 4b09 ldr r3, [pc, #36] ; (802fb9c <snmp_insert_ipaddridx_tree+0x78>)
  50251. if (ipa_rn != NULL)
  50252. {
  50253. if (level == 2)
  50254. {
  50255. ipa_rn->get_object_def = ip_addrentry_get_object_def;
  50256. ipa_rn->get_value = ip_addrentry_get_value;
  50257. 802fb76: e880 0180 stmia.w r0, {r7, r8}
  50258. ipa_rn->set_test = noleafs_set_test;
  50259. 802fb7a: 6083 str r3, [r0, #8]
  50260. ipa_rn->set_value = noleafs_set_value;
  50261. 802fb7c: 4b08 ldr r3, [pc, #32] ; (802fba0 <snmp_insert_ipaddridx_tree+0x7c>)
  50262. 802fb7e: 60c3 str r3, [r0, #12]
  50263. 802fb80: 3501 adds r5, #1
  50264. LWIP_ASSERT("ni != NULL", ni != NULL);
  50265. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  50266. level = 0;
  50267. ipa_rn = &ipaddrtree_root;
  50268. while (level < 4)
  50269. 802fb82: 2d04 cmp r5, #4
  50270. 802fb84: d1da bne.n 802fb3c <snmp_insert_ipaddridx_tree+0x18>
  50271. 802fb86: e7ef b.n 802fb68 <snmp_insert_ipaddridx_tree+0x44>
  50272. }
  50273. level++;
  50274. }
  50275. /* enable getnext traversal on filled table */
  50276. ipaddrtable.maxlength = 1;
  50277. }
  50278. 802fb88: b006 add sp, #24
  50279. 802fb8a: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  50280. 802fb8e: bf00 nop
  50281. 802fb90: 2000173c .word 0x2000173c
  50282. 802fb94: 0802f471 .word 0x0802f471
  50283. 802fb98: 200017c0 .word 0x200017c0
  50284. 802fb9c: 0802ebeb .word 0x0802ebeb
  50285. 802fba0: 0802ebef .word 0x0802ebef
  50286. 802fba4: 0802f261 .word 0x0802f261
  50287. 0802fba8 <snmp_delete_ipaddridx_tree>:
  50288. /**
  50289. * Removes ipAddrTable indexes (.ipAdEntAddr)
  50290. * from index tree.
  50291. */
  50292. void snmp_delete_ipaddridx_tree(struct netif *ni)
  50293. {
  50294. 802fba8: b570 push {r4, r5, r6, lr}
  50295. 802fbaa: b08e sub sp, #56 ; 0x38
  50296. struct mib_list_node *ipa_n, *del_n[4];
  50297. s32_t ipaddridx[4];
  50298. u8_t fc, level, del_cnt;
  50299. LWIP_ASSERT("ni != NULL", ni != NULL);
  50300. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  50301. 802fbac: 3004 adds r0, #4
  50302. 802fbae: a90a add r1, sp, #40 ; 0x28
  50303. 802fbb0: f000 fb37 bl 8030222 <snmp_iptooid>
  50304. 802fbb4: 2600 movs r6, #0
  50305. /* mark nodes for deletion */
  50306. level = 0;
  50307. del_cnt = 0;
  50308. ipa_rn = &ipaddrtree_root;
  50309. 802fbb6: 4d1f ldr r5, [pc, #124] ; (802fc34 <snmp_delete_ipaddridx_tree+0x8c>)
  50310. LWIP_ASSERT("ni != NULL", ni != NULL);
  50311. snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
  50312. /* mark nodes for deletion */
  50313. level = 0;
  50314. del_cnt = 0;
  50315. 802fbb8: 4634 mov r4, r6
  50316. ipa_rn = &ipaddrtree_root;
  50317. while ((level < 4) && (ipa_rn != NULL))
  50318. {
  50319. fc = snmp_mib_node_find(ipa_rn, ipaddridx[level], &ipa_n);
  50320. 802fbba: ab0a add r3, sp, #40 ; 0x28
  50321. 802fbbc: 4628 mov r0, r5
  50322. 802fbbe: 58f1 ldr r1, [r6, r3]
  50323. 802fbc0: aa01 add r2, sp, #4
  50324. 802fbc2: f000 fba4 bl 803030e <snmp_mib_node_find>
  50325. 802fbc6: b2c0 uxtb r0, r0
  50326. if (fc == 0)
  50327. 802fbc8: b198 cbz r0, 802fbf2 <snmp_delete_ipaddridx_tree+0x4a>
  50328. {
  50329. /* ipaddridx[level] does not exist */
  50330. del_cnt = 0;
  50331. ipa_rn = NULL;
  50332. }
  50333. else if (fc == 1)
  50334. 802fbca: 2801 cmp r0, #1
  50335. 802fbcc: d10b bne.n 802fbe6 <snmp_delete_ipaddridx_tree+0x3e>
  50336. {
  50337. del_rn[del_cnt] = ipa_rn;
  50338. 802fbce: ab0e add r3, sp, #56 ; 0x38
  50339. 802fbd0: eb03 0284 add.w r2, r3, r4, lsl #2
  50340. del_n[del_cnt] = ipa_n;
  50341. 802fbd4: 9b01 ldr r3, [sp, #4]
  50342. del_cnt = 0;
  50343. ipa_rn = NULL;
  50344. }
  50345. else if (fc == 1)
  50346. {
  50347. del_rn[del_cnt] = ipa_rn;
  50348. 802fbd6: f842 5c30 str.w r5, [r2, #-48]
  50349. del_n[del_cnt] = ipa_n;
  50350. del_cnt++;
  50351. 802fbda: 3401 adds r4, #1
  50352. ipa_rn = NULL;
  50353. }
  50354. else if (fc == 1)
  50355. {
  50356. del_rn[del_cnt] = ipa_rn;
  50357. del_n[del_cnt] = ipa_n;
  50358. 802fbdc: f842 3c20 str.w r3, [r2, #-32]
  50359. del_cnt++;
  50360. 802fbe0: b2e4 uxtb r4, r4
  50361. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  50362. 802fbe2: 68dd ldr r5, [r3, #12]
  50363. 802fbe4: e007 b.n 802fbf6 <snmp_delete_ipaddridx_tree+0x4e>
  50364. }
  50365. else if (fc == 2)
  50366. 802fbe6: 2802 cmp r0, #2
  50367. 802fbe8: d105 bne.n 802fbf6 <snmp_delete_ipaddridx_tree+0x4e>
  50368. {
  50369. /* reset delete (2 or more childs) */
  50370. del_cnt = 0;
  50371. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  50372. 802fbea: 9b01 ldr r3, [sp, #4]
  50373. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  50374. }
  50375. else if (fc == 2)
  50376. {
  50377. /* reset delete (2 or more childs) */
  50378. del_cnt = 0;
  50379. 802fbec: 2400 movs r4, #0
  50380. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  50381. 802fbee: 68dd ldr r5, [r3, #12]
  50382. 802fbf0: e001 b.n 802fbf6 <snmp_delete_ipaddridx_tree+0x4e>
  50383. {
  50384. fc = snmp_mib_node_find(ipa_rn, ipaddridx[level], &ipa_n);
  50385. if (fc == 0)
  50386. {
  50387. /* ipaddridx[level] does not exist */
  50388. del_cnt = 0;
  50389. 802fbf2: 4604 mov r4, r0
  50390. ipa_rn = NULL;
  50391. 802fbf4: 4605 mov r5, r0
  50392. /* mark nodes for deletion */
  50393. level = 0;
  50394. del_cnt = 0;
  50395. ipa_rn = &ipaddrtree_root;
  50396. while ((level < 4) && (ipa_rn != NULL))
  50397. 802fbf6: 2e0c cmp r6, #12
  50398. 802fbf8: d012 beq.n 802fc20 <snmp_delete_ipaddridx_tree+0x78>
  50399. 802fbfa: 3604 adds r6, #4
  50400. 802fbfc: 2d00 cmp r5, #0
  50401. 802fbfe: d1dc bne.n 802fbba <snmp_delete_ipaddridx_tree+0x12>
  50402. 802fc00: e00e b.n 802fc20 <snmp_delete_ipaddridx_tree+0x78>
  50403. level++;
  50404. }
  50405. /* delete marked index nodes */
  50406. while (del_cnt > 0)
  50407. {
  50408. del_cnt--;
  50409. 802fc02: 3c01 subs r4, #1
  50410. 802fc04: b2e4 uxtb r4, r4
  50411. ipa_rn = del_rn[del_cnt];
  50412. 802fc06: aa0e add r2, sp, #56 ; 0x38
  50413. 802fc08: eb02 0384 add.w r3, r2, r4, lsl #2
  50414. ipa_n = del_n[del_cnt];
  50415. 802fc0c: f853 1c20 ldr.w r1, [r3, #-32]
  50416. /* delete marked index nodes */
  50417. while (del_cnt > 0)
  50418. {
  50419. del_cnt--;
  50420. ipa_rn = del_rn[del_cnt];
  50421. 802fc10: f853 0c30 ldr.w r0, [r3, #-48]
  50422. ipa_n = del_n[del_cnt];
  50423. 802fc14: 9101 str r1, [sp, #4]
  50424. next = snmp_mib_node_delete(ipa_rn, ipa_n);
  50425. 802fc16: f000 fb94 bl 8030342 <snmp_mib_node_delete>
  50426. if (next != NULL)
  50427. 802fc1a: b108 cbz r0, 802fc20 <snmp_delete_ipaddridx_tree+0x78>
  50428. {
  50429. LWIP_ASSERT("next_count == 0",next->count == 0);
  50430. snmp_mib_lrn_free(next);
  50431. 802fc1c: f000 fb38 bl 8030290 <snmp_mib_lrn_free>
  50432. ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
  50433. }
  50434. level++;
  50435. }
  50436. /* delete marked index nodes */
  50437. while (del_cnt > 0)
  50438. 802fc20: 2c00 cmp r4, #0
  50439. 802fc22: d1ee bne.n 802fc02 <snmp_delete_ipaddridx_tree+0x5a>
  50440. LWIP_ASSERT("next_count == 0",next->count == 0);
  50441. snmp_mib_lrn_free(next);
  50442. }
  50443. }
  50444. /* disable getnext traversal on empty table */
  50445. if (ipaddrtree_root.count == 0) ipaddrtable.maxlength = 0;
  50446. 802fc24: 4b03 ldr r3, [pc, #12] ; (802fc34 <snmp_delete_ipaddridx_tree+0x8c>)
  50447. 802fc26: 8b9b ldrh r3, [r3, #28]
  50448. 802fc28: b90b cbnz r3, 802fc2e <snmp_delete_ipaddridx_tree+0x86>
  50449. 802fc2a: 4b03 ldr r3, [pc, #12] ; (802fc38 <snmp_delete_ipaddridx_tree+0x90>)
  50450. 802fc2c: 825c strh r4, [r3, #18]
  50451. }
  50452. 802fc2e: b00e add sp, #56 ; 0x38
  50453. 802fc30: bd70 pop {r4, r5, r6, pc}
  50454. 802fc32: bf00 nop
  50455. 802fc34: 2000173c .word 0x2000173c
  50456. 802fc38: 200017c0 .word 0x200017c0
  50457. 0802fc3c <snmp_insert_iprteidx_tree>:
  50458. *
  50459. * @todo record sysuptime for _this_ route when it is installed
  50460. * (needed for ipRouteAge) in the netif.
  50461. */
  50462. void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni)
  50463. {
  50464. 802fc3c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  50465. 802fc40: b086 sub sp, #24
  50466. u8_t insert = 0;
  50467. ip_addr_t dst;
  50468. if (dflt != 0)
  50469. 802fc42: b110 cbz r0, 802fc4a <snmp_insert_iprteidx_tree+0xe>
  50470. {
  50471. /* the default route 0.0.0.0 */
  50472. ip_addr_set_any(&dst);
  50473. 802fc44: 2300 movs r3, #0
  50474. 802fc46: 9300 str r3, [sp, #0]
  50475. 802fc48: e02b b.n 802fca2 <snmp_insert_iprteidx_tree+0x66>
  50476. insert = 1;
  50477. }
  50478. else
  50479. {
  50480. /* route to the network address */
  50481. ip_addr_get_network(&dst, &ni->ip_addr, &ni->netmask);
  50482. 802fc4a: 688a ldr r2, [r1, #8]
  50483. 802fc4c: 684b ldr r3, [r1, #4]
  50484. 802fc4e: 4013 ands r3, r2
  50485. 802fc50: 9300 str r3, [sp, #0]
  50486. /* exclude 0.0.0.0 network (reserved for default rte) */
  50487. if (!ip_addr_isany(&dst)) {
  50488. 802fc52: bb33 cbnz r3, 802fca2 <snmp_insert_iprteidx_tree+0x66>
  50489. 802fc54: e021 b.n 802fc9a <snmp_insert_iprteidx_tree+0x5e>
  50490. snmp_iptooid(&dst, &iprteidx[0]);
  50491. level = 0;
  50492. iprte_rn = &iprtetree_root;
  50493. while (level < 4)
  50494. {
  50495. iprte_node = NULL;
  50496. 802fc56: 2300 movs r3, #0
  50497. 802fc58: 9301 str r3, [sp, #4]
  50498. snmp_mib_node_insert(iprte_rn, iprteidx[level], &iprte_node);
  50499. 802fc5a: ab02 add r3, sp, #8
  50500. 802fc5c: 4620 mov r0, r4
  50501. 802fc5e: f853 1025 ldr.w r1, [r3, r5, lsl #2]
  50502. 802fc62: aa01 add r2, sp, #4
  50503. 802fc64: b2ee uxtb r6, r5
  50504. 802fc66: f000 fb17 bl 8030298 <snmp_mib_node_insert>
  50505. if ((level != 3) && (iprte_node != NULL))
  50506. 802fc6a: 2e03 cmp r6, #3
  50507. 802fc6c: d012 beq.n 802fc94 <snmp_insert_iprteidx_tree+0x58>
  50508. 802fc6e: 9b01 ldr r3, [sp, #4]
  50509. 802fc70: b183 cbz r3, 802fc94 <snmp_insert_iprteidx_tree+0x58>
  50510. {
  50511. if (iprte_node->nptr == NULL)
  50512. 802fc72: 68dc ldr r4, [r3, #12]
  50513. 802fc74: b974 cbnz r4, 802fc94 <snmp_insert_iprteidx_tree+0x58>
  50514. {
  50515. iprte_rn = snmp_mib_lrn_alloc();
  50516. 802fc76: f000 faed bl 8030254 <snmp_mib_lrn_alloc>
  50517. iprte_node->nptr = (struct mib_node*)iprte_rn;
  50518. 802fc7a: 9b01 ldr r3, [sp, #4]
  50519. snmp_mib_node_insert(iprte_rn, iprteidx[level], &iprte_node);
  50520. if ((level != 3) && (iprte_node != NULL))
  50521. {
  50522. if (iprte_node->nptr == NULL)
  50523. {
  50524. iprte_rn = snmp_mib_lrn_alloc();
  50525. 802fc7c: 4604 mov r4, r0
  50526. iprte_node->nptr = (struct mib_node*)iprte_rn;
  50527. 802fc7e: 60d8 str r0, [r3, #12]
  50528. if (iprte_rn != NULL)
  50529. 802fc80: b158 cbz r0, 802fc9a <snmp_insert_iprteidx_tree+0x5e>
  50530. {
  50531. if (level == 2)
  50532. 802fc82: 2e02 cmp r6, #2
  50533. 802fc84: d106 bne.n 802fc94 <snmp_insert_iprteidx_tree+0x58>
  50534. {
  50535. iprte_rn->get_object_def = ip_rteentry_get_object_def;
  50536. iprte_rn->get_value = ip_rteentry_get_value;
  50537. iprte_rn->set_test = noleafs_set_test;
  50538. 802fc86: 4b0d ldr r3, [pc, #52] ; (802fcbc <snmp_insert_iprteidx_tree+0x80>)
  50539. iprte_node->nptr = (struct mib_node*)iprte_rn;
  50540. if (iprte_rn != NULL)
  50541. {
  50542. if (level == 2)
  50543. {
  50544. iprte_rn->get_object_def = ip_rteentry_get_object_def;
  50545. 802fc88: f8c0 8000 str.w r8, [r0]
  50546. iprte_rn->get_value = ip_rteentry_get_value;
  50547. iprte_rn->set_test = noleafs_set_test;
  50548. 802fc8c: 6083 str r3, [r0, #8]
  50549. iprte_rn->set_value = noleafs_set_value;
  50550. 802fc8e: 4b0c ldr r3, [pc, #48] ; (802fcc0 <snmp_insert_iprteidx_tree+0x84>)
  50551. if (iprte_rn != NULL)
  50552. {
  50553. if (level == 2)
  50554. {
  50555. iprte_rn->get_object_def = ip_rteentry_get_object_def;
  50556. iprte_rn->get_value = ip_rteentry_get_value;
  50557. 802fc90: 6047 str r7, [r0, #4]
  50558. iprte_rn->set_test = noleafs_set_test;
  50559. iprte_rn->set_value = noleafs_set_value;
  50560. 802fc92: 60c3 str r3, [r0, #12]
  50561. 802fc94: 3501 adds r5, #1
  50562. u8_t level;
  50563. snmp_iptooid(&dst, &iprteidx[0]);
  50564. level = 0;
  50565. iprte_rn = &iprtetree_root;
  50566. while (level < 4)
  50567. 802fc96: 2d04 cmp r5, #4
  50568. 802fc98: d1dd bne.n 802fc56 <snmp_insert_iprteidx_tree+0x1a>
  50569. }
  50570. level++;
  50571. }
  50572. }
  50573. /* enable getnext traversal on filled table */
  50574. iprtetable.maxlength = 1;
  50575. 802fc9a: 4b0a ldr r3, [pc, #40] ; (802fcc4 <snmp_insert_iprteidx_tree+0x88>)
  50576. 802fc9c: 2201 movs r2, #1
  50577. 802fc9e: 825a strh r2, [r3, #18]
  50578. 802fca0: e009 b.n 802fcb6 <snmp_insert_iprteidx_tree+0x7a>
  50579. struct mib_list_rootnode *iprte_rn;
  50580. struct mib_list_node *iprte_node;
  50581. s32_t iprteidx[4];
  50582. u8_t level;
  50583. snmp_iptooid(&dst, &iprteidx[0]);
  50584. 802fca2: 4668 mov r0, sp
  50585. 802fca4: a902 add r1, sp, #8
  50586. 802fca6: f000 fabc bl 8030222 <snmp_iptooid>
  50587. 802fcaa: 2500 movs r5, #0
  50588. level = 0;
  50589. iprte_rn = &iprtetree_root;
  50590. 802fcac: 4c06 ldr r4, [pc, #24] ; (802fcc8 <snmp_insert_iprteidx_tree+0x8c>)
  50591. iprte_node->nptr = (struct mib_node*)iprte_rn;
  50592. if (iprte_rn != NULL)
  50593. {
  50594. if (level == 2)
  50595. {
  50596. iprte_rn->get_object_def = ip_rteentry_get_object_def;
  50597. 802fcae: f8df 8020 ldr.w r8, [pc, #32] ; 802fcd0 <snmp_insert_iprteidx_tree+0x94>
  50598. iprte_rn->get_value = ip_rteentry_get_value;
  50599. 802fcb2: 4f06 ldr r7, [pc, #24] ; (802fccc <snmp_insert_iprteidx_tree+0x90>)
  50600. 802fcb4: e7cf b.n 802fc56 <snmp_insert_iprteidx_tree+0x1a>
  50601. level++;
  50602. }
  50603. }
  50604. /* enable getnext traversal on filled table */
  50605. iprtetable.maxlength = 1;
  50606. }
  50607. 802fcb6: b006 add sp, #24
  50608. 802fcb8: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  50609. 802fcbc: 0802ebeb .word 0x0802ebeb
  50610. 802fcc0: 0802ebef .word 0x0802ebef
  50611. 802fcc4: 20001828 .word 0x20001828
  50612. 802fcc8: 2000166c .word 0x2000166c
  50613. 802fccc: 0802f771 .word 0x0802f771
  50614. 802fcd0: 0802edb5 .word 0x0802edb5
  50615. 0802fcd4 <snmp_delete_iprteidx_tree>:
  50616. * @param dflt non-zero for the default rte, zero for network rte
  50617. * @param ni points to network interface for this rte or NULL
  50618. * for default route to be removed.
  50619. */
  50620. void snmp_delete_iprteidx_tree(u8_t dflt, struct netif *ni)
  50621. {
  50622. 802fcd4: b570 push {r4, r5, r6, lr}
  50623. 802fcd6: b08e sub sp, #56 ; 0x38
  50624. u8_t del = 0;
  50625. ip_addr_t dst;
  50626. if (dflt != 0)
  50627. 802fcd8: b110 cbz r0, 802fce0 <snmp_delete_iprteidx_tree+0xc>
  50628. {
  50629. /* the default route 0.0.0.0 */
  50630. ip_addr_set_any(&dst);
  50631. 802fcda: 2300 movs r3, #0
  50632. 802fcdc: 9300 str r3, [sp, #0]
  50633. 802fcde: e041 b.n 802fd64 <snmp_delete_iprteidx_tree+0x90>
  50634. del = 1;
  50635. }
  50636. else
  50637. {
  50638. /* route to the network address */
  50639. ip_addr_get_network(&dst, &ni->ip_addr, &ni->netmask);
  50640. 802fce0: 688a ldr r2, [r1, #8]
  50641. 802fce2: 684b ldr r3, [r1, #4]
  50642. 802fce4: 4013 ands r3, r2
  50643. 802fce6: 9300 str r3, [sp, #0]
  50644. /* exclude 0.0.0.0 network (reserved for default rte) */
  50645. if (!ip_addr_isany(&dst)) {
  50646. 802fce8: 2b00 cmp r3, #0
  50647. 802fcea: d13b bne.n 802fd64 <snmp_delete_iprteidx_tree+0x90>
  50648. 802fcec: e034 b.n 802fd58 <snmp_delete_iprteidx_tree+0x84>
  50649. level = 0;
  50650. del_cnt = 0;
  50651. iprte_rn = &iprtetree_root;
  50652. while ((level < 4) && (iprte_rn != NULL))
  50653. {
  50654. fc = snmp_mib_node_find(iprte_rn, iprteidx[level], &iprte_n);
  50655. 802fcee: ab0a add r3, sp, #40 ; 0x28
  50656. 802fcf0: 4628 mov r0, r5
  50657. 802fcf2: 58f1 ldr r1, [r6, r3]
  50658. 802fcf4: aa01 add r2, sp, #4
  50659. 802fcf6: f000 fb0a bl 803030e <snmp_mib_node_find>
  50660. 802fcfa: b2c0 uxtb r0, r0
  50661. if (fc == 0)
  50662. 802fcfc: b198 cbz r0, 802fd26 <snmp_delete_iprteidx_tree+0x52>
  50663. {
  50664. /* iprteidx[level] does not exist */
  50665. del_cnt = 0;
  50666. iprte_rn = NULL;
  50667. }
  50668. else if (fc == 1)
  50669. 802fcfe: 2801 cmp r0, #1
  50670. 802fd00: d10b bne.n 802fd1a <snmp_delete_iprteidx_tree+0x46>
  50671. {
  50672. del_rn[del_cnt] = iprte_rn;
  50673. 802fd02: ab0e add r3, sp, #56 ; 0x38
  50674. 802fd04: eb03 0284 add.w r2, r3, r4, lsl #2
  50675. del_n[del_cnt] = iprte_n;
  50676. 802fd08: 9b01 ldr r3, [sp, #4]
  50677. del_cnt = 0;
  50678. iprte_rn = NULL;
  50679. }
  50680. else if (fc == 1)
  50681. {
  50682. del_rn[del_cnt] = iprte_rn;
  50683. 802fd0a: f842 5c30 str.w r5, [r2, #-48]
  50684. del_n[del_cnt] = iprte_n;
  50685. del_cnt++;
  50686. 802fd0e: 3401 adds r4, #1
  50687. iprte_rn = NULL;
  50688. }
  50689. else if (fc == 1)
  50690. {
  50691. del_rn[del_cnt] = iprte_rn;
  50692. del_n[del_cnt] = iprte_n;
  50693. 802fd10: f842 3c20 str.w r3, [r2, #-32]
  50694. del_cnt++;
  50695. 802fd14: b2e4 uxtb r4, r4
  50696. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  50697. 802fd16: 68dd ldr r5, [r3, #12]
  50698. 802fd18: e007 b.n 802fd2a <snmp_delete_iprteidx_tree+0x56>
  50699. }
  50700. else if (fc == 2)
  50701. 802fd1a: 2802 cmp r0, #2
  50702. 802fd1c: d105 bne.n 802fd2a <snmp_delete_iprteidx_tree+0x56>
  50703. {
  50704. /* reset delete (2 or more childs) */
  50705. del_cnt = 0;
  50706. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  50707. 802fd1e: 9b01 ldr r3, [sp, #4]
  50708. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  50709. }
  50710. else if (fc == 2)
  50711. {
  50712. /* reset delete (2 or more childs) */
  50713. del_cnt = 0;
  50714. 802fd20: 2400 movs r4, #0
  50715. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  50716. 802fd22: 68dd ldr r5, [r3, #12]
  50717. 802fd24: e001 b.n 802fd2a <snmp_delete_iprteidx_tree+0x56>
  50718. {
  50719. fc = snmp_mib_node_find(iprte_rn, iprteidx[level], &iprte_n);
  50720. if (fc == 0)
  50721. {
  50722. /* iprteidx[level] does not exist */
  50723. del_cnt = 0;
  50724. 802fd26: 4604 mov r4, r0
  50725. iprte_rn = NULL;
  50726. 802fd28: 4605 mov r5, r0
  50727. snmp_iptooid(&dst, &iprteidx[0]);
  50728. /* mark nodes for deletion */
  50729. level = 0;
  50730. del_cnt = 0;
  50731. iprte_rn = &iprtetree_root;
  50732. while ((level < 4) && (iprte_rn != NULL))
  50733. 802fd2a: 2e0c cmp r6, #12
  50734. 802fd2c: d012 beq.n 802fd54 <snmp_delete_iprteidx_tree+0x80>
  50735. 802fd2e: 3604 adds r6, #4
  50736. 802fd30: 2d00 cmp r5, #0
  50737. 802fd32: d1dc bne.n 802fcee <snmp_delete_iprteidx_tree+0x1a>
  50738. 802fd34: e00e b.n 802fd54 <snmp_delete_iprteidx_tree+0x80>
  50739. level++;
  50740. }
  50741. /* delete marked index nodes */
  50742. while (del_cnt > 0)
  50743. {
  50744. del_cnt--;
  50745. 802fd36: 3c01 subs r4, #1
  50746. 802fd38: b2e4 uxtb r4, r4
  50747. iprte_rn = del_rn[del_cnt];
  50748. 802fd3a: aa0e add r2, sp, #56 ; 0x38
  50749. 802fd3c: eb02 0384 add.w r3, r2, r4, lsl #2
  50750. iprte_n = del_n[del_cnt];
  50751. 802fd40: f853 1c20 ldr.w r1, [r3, #-32]
  50752. /* delete marked index nodes */
  50753. while (del_cnt > 0)
  50754. {
  50755. del_cnt--;
  50756. iprte_rn = del_rn[del_cnt];
  50757. 802fd44: f853 0c30 ldr.w r0, [r3, #-48]
  50758. iprte_n = del_n[del_cnt];
  50759. 802fd48: 9101 str r1, [sp, #4]
  50760. next = snmp_mib_node_delete(iprte_rn, iprte_n);
  50761. 802fd4a: f000 fafa bl 8030342 <snmp_mib_node_delete>
  50762. if (next != NULL)
  50763. 802fd4e: b108 cbz r0, 802fd54 <snmp_delete_iprteidx_tree+0x80>
  50764. {
  50765. LWIP_ASSERT("next_count == 0",next->count == 0);
  50766. snmp_mib_lrn_free(next);
  50767. 802fd50: f000 fa9e bl 8030290 <snmp_mib_lrn_free>
  50768. iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
  50769. }
  50770. level++;
  50771. }
  50772. /* delete marked index nodes */
  50773. while (del_cnt > 0)
  50774. 802fd54: 2c00 cmp r4, #0
  50775. 802fd56: d1ee bne.n 802fd36 <snmp_delete_iprteidx_tree+0x62>
  50776. snmp_mib_lrn_free(next);
  50777. }
  50778. }
  50779. }
  50780. /* disable getnext traversal on empty table */
  50781. if (iprtetree_root.count == 0) iprtetable.maxlength = 0;
  50782. 802fd58: 4b07 ldr r3, [pc, #28] ; (802fd78 <snmp_delete_iprteidx_tree+0xa4>)
  50783. 802fd5a: 8b9b ldrh r3, [r3, #28]
  50784. 802fd5c: b953 cbnz r3, 802fd74 <snmp_delete_iprteidx_tree+0xa0>
  50785. 802fd5e: 4a07 ldr r2, [pc, #28] ; (802fd7c <snmp_delete_iprteidx_tree+0xa8>)
  50786. 802fd60: 8253 strh r3, [r2, #18]
  50787. 802fd62: e007 b.n 802fd74 <snmp_delete_iprteidx_tree+0xa0>
  50788. struct mib_list_rootnode *iprte_rn, *next, *del_rn[4];
  50789. struct mib_list_node *iprte_n, *del_n[4];
  50790. s32_t iprteidx[4];
  50791. u8_t fc, level, del_cnt;
  50792. snmp_iptooid(&dst, &iprteidx[0]);
  50793. 802fd64: 4668 mov r0, sp
  50794. 802fd66: a90a add r1, sp, #40 ; 0x28
  50795. 802fd68: 2600 movs r6, #0
  50796. 802fd6a: f000 fa5a bl 8030222 <snmp_iptooid>
  50797. /* mark nodes for deletion */
  50798. level = 0;
  50799. del_cnt = 0;
  50800. 802fd6e: 4634 mov r4, r6
  50801. iprte_rn = &iprtetree_root;
  50802. 802fd70: 4d01 ldr r5, [pc, #4] ; (802fd78 <snmp_delete_iprteidx_tree+0xa4>)
  50803. 802fd72: e7bc b.n 802fcee <snmp_delete_iprteidx_tree+0x1a>
  50804. }
  50805. }
  50806. }
  50807. /* disable getnext traversal on empty table */
  50808. if (iprtetree_root.count == 0) iprtetable.maxlength = 0;
  50809. }
  50810. 802fd74: b00e add sp, #56 ; 0x38
  50811. 802fd76: bd70 pop {r4, r5, r6, pc}
  50812. 802fd78: 2000166c .word 0x2000166c
  50813. 802fd7c: 20001828 .word 0x20001828
  50814. 0802fd80 <snmp_inc_icmpinmsgs>:
  50815. void snmp_inc_icmpinmsgs(void)
  50816. {
  50817. icmpinmsgs++;
  50818. 802fd80: 4b02 ldr r3, [pc, #8] ; (802fd8c <snmp_inc_icmpinmsgs+0xc>)
  50819. 802fd82: 681a ldr r2, [r3, #0]
  50820. 802fd84: 3201 adds r2, #1
  50821. 802fd86: 601a str r2, [r3, #0]
  50822. 802fd88: 4770 bx lr
  50823. 802fd8a: bf00 nop
  50824. 802fd8c: 2000e128 .word 0x2000e128
  50825. 0802fd90 <snmp_inc_icmpinerrors>:
  50826. }
  50827. void snmp_inc_icmpinerrors(void)
  50828. {
  50829. icmpinerrors++;
  50830. 802fd90: 4b02 ldr r3, [pc, #8] ; (802fd9c <snmp_inc_icmpinerrors+0xc>)
  50831. 802fd92: 681a ldr r2, [r3, #0]
  50832. 802fd94: 3201 adds r2, #1
  50833. 802fd96: 601a str r2, [r3, #0]
  50834. 802fd98: 4770 bx lr
  50835. 802fd9a: bf00 nop
  50836. 802fd9c: 2000e124 .word 0x2000e124
  50837. 0802fda0 <snmp_inc_icmpoutmsgs>:
  50838. icmpinaddrmaskreps++;
  50839. }
  50840. void snmp_inc_icmpoutmsgs(void)
  50841. {
  50842. icmpoutmsgs++;
  50843. 802fda0: 4b02 ldr r3, [pc, #8] ; (802fdac <snmp_inc_icmpoutmsgs+0xc>)
  50844. 802fda2: 681a ldr r2, [r3, #0]
  50845. 802fda4: 3201 adds r2, #1
  50846. 802fda6: 601a str r2, [r3, #0]
  50847. 802fda8: 4770 bx lr
  50848. 802fdaa: bf00 nop
  50849. 802fdac: 2000e1a8 .word 0x2000e1a8
  50850. 0802fdb0 <snmp_inc_icmpouttimeexcds>:
  50851. icmpoutdestunreachs++;
  50852. }
  50853. void snmp_inc_icmpouttimeexcds(void)
  50854. {
  50855. icmpouttimeexcds++;
  50856. 802fdb0: 4b02 ldr r3, [pc, #8] ; (802fdbc <snmp_inc_icmpouttimeexcds+0xc>)
  50857. 802fdb2: 681a ldr r2, [r3, #0]
  50858. 802fdb4: 3201 adds r2, #1
  50859. 802fdb6: 601a str r2, [r3, #0]
  50860. 802fdb8: 4770 bx lr
  50861. 802fdba: bf00 nop
  50862. 802fdbc: 2000e174 .word 0x2000e174
  50863. 0802fdc0 <snmp_inc_icmpoutechoreps>:
  50864. icmpoutechos++;
  50865. }
  50866. void snmp_inc_icmpoutechoreps(void)
  50867. {
  50868. icmpoutechoreps++;
  50869. 802fdc0: 4b02 ldr r3, [pc, #8] ; (802fdcc <snmp_inc_icmpoutechoreps+0xc>)
  50870. 802fdc2: 681a ldr r2, [r3, #0]
  50871. 802fdc4: 3201 adds r2, #1
  50872. 802fdc6: 601a str r2, [r3, #0]
  50873. 802fdc8: 4770 bx lr
  50874. 802fdca: bf00 nop
  50875. 802fdcc: 2000e1c8 .word 0x2000e1c8
  50876. 0802fdd0 <snmp_inc_tcppassiveopens>:
  50877. tcpactiveopens++;
  50878. }
  50879. void snmp_inc_tcppassiveopens(void)
  50880. {
  50881. tcppassiveopens++;
  50882. 802fdd0: 4b02 ldr r3, [pc, #8] ; (802fddc <snmp_inc_tcppassiveopens+0xc>)
  50883. 802fdd2: 681a ldr r2, [r3, #0]
  50884. 802fdd4: 3201 adds r2, #1
  50885. 802fdd6: 601a str r2, [r3, #0]
  50886. 802fdd8: 4770 bx lr
  50887. 802fdda: bf00 nop
  50888. 802fddc: 2000e150 .word 0x2000e150
  50889. 0802fde0 <snmp_inc_tcpattemptfails>:
  50890. }
  50891. void snmp_inc_tcpattemptfails(void)
  50892. {
  50893. tcpattemptfails++;
  50894. 802fde0: 4b02 ldr r3, [pc, #8] ; (802fdec <snmp_inc_tcpattemptfails+0xc>)
  50895. 802fde2: 681a ldr r2, [r3, #0]
  50896. 802fde4: 3201 adds r2, #1
  50897. 802fde6: 601a str r2, [r3, #0]
  50898. 802fde8: 4770 bx lr
  50899. 802fdea: bf00 nop
  50900. 802fdec: 2000e19c .word 0x2000e19c
  50901. 0802fdf0 <snmp_inc_tcpestabresets>:
  50902. }
  50903. void snmp_inc_tcpestabresets(void)
  50904. {
  50905. tcpestabresets++;
  50906. 802fdf0: 4b02 ldr r3, [pc, #8] ; (802fdfc <snmp_inc_tcpestabresets+0xc>)
  50907. 802fdf2: 681a ldr r2, [r3, #0]
  50908. 802fdf4: 3201 adds r2, #1
  50909. 802fdf6: 601a str r2, [r3, #0]
  50910. 802fdf8: 4770 bx lr
  50911. 802fdfa: bf00 nop
  50912. 802fdfc: 2000e130 .word 0x2000e130
  50913. 0802fe00 <snmp_inc_tcpinsegs>:
  50914. }
  50915. void snmp_inc_tcpinsegs(void)
  50916. {
  50917. tcpinsegs++;
  50918. 802fe00: 4b02 ldr r3, [pc, #8] ; (802fe0c <snmp_inc_tcpinsegs+0xc>)
  50919. 802fe02: 681a ldr r2, [r3, #0]
  50920. 802fe04: 3201 adds r2, #1
  50921. 802fe06: 601a str r2, [r3, #0]
  50922. 802fe08: 4770 bx lr
  50923. 802fe0a: bf00 nop
  50924. 802fe0c: 2000e1ac .word 0x2000e1ac
  50925. 0802fe10 <snmp_inc_tcpoutsegs>:
  50926. }
  50927. void snmp_inc_tcpoutsegs(void)
  50928. {
  50929. tcpoutsegs++;
  50930. 802fe10: 4b02 ldr r3, [pc, #8] ; (802fe1c <snmp_inc_tcpoutsegs+0xc>)
  50931. 802fe12: 681a ldr r2, [r3, #0]
  50932. 802fe14: 3201 adds r2, #1
  50933. 802fe16: 601a str r2, [r3, #0]
  50934. 802fe18: 4770 bx lr
  50935. 802fe1a: bf00 nop
  50936. 802fe1c: 2000e1f8 .word 0x2000e1f8
  50937. 0802fe20 <snmp_inc_tcpretranssegs>:
  50938. }
  50939. void snmp_inc_tcpretranssegs(void)
  50940. {
  50941. tcpretranssegs++;
  50942. 802fe20: 4b02 ldr r3, [pc, #8] ; (802fe2c <snmp_inc_tcpretranssegs+0xc>)
  50943. 802fe22: 681a ldr r2, [r3, #0]
  50944. 802fe24: 3201 adds r2, #1
  50945. 802fe26: 601a str r2, [r3, #0]
  50946. 802fe28: 4770 bx lr
  50947. 802fe2a: bf00 nop
  50948. 802fe2c: 2000e1cc .word 0x2000e1cc
  50949. 0802fe30 <snmp_inc_tcpinerrs>:
  50950. }
  50951. void snmp_inc_tcpinerrs(void)
  50952. {
  50953. tcpinerrs++;
  50954. 802fe30: 4b02 ldr r3, [pc, #8] ; (802fe3c <snmp_inc_tcpinerrs+0xc>)
  50955. 802fe32: 681a ldr r2, [r3, #0]
  50956. 802fe34: 3201 adds r2, #1
  50957. 802fe36: 601a str r2, [r3, #0]
  50958. 802fe38: 4770 bx lr
  50959. 802fe3a: bf00 nop
  50960. 802fe3c: 2000e158 .word 0x2000e158
  50961. 0802fe40 <snmp_inc_tcpoutrsts>:
  50962. }
  50963. void snmp_inc_tcpoutrsts(void)
  50964. {
  50965. tcpoutrsts++;
  50966. 802fe40: 4b02 ldr r3, [pc, #8] ; (802fe4c <snmp_inc_tcpoutrsts+0xc>)
  50967. 802fe42: 681a ldr r2, [r3, #0]
  50968. 802fe44: 3201 adds r2, #1
  50969. 802fe46: 601a str r2, [r3, #0]
  50970. 802fe48: 4770 bx lr
  50971. 802fe4a: bf00 nop
  50972. 802fe4c: 2000e1bc .word 0x2000e1bc
  50973. 0802fe50 <snmp_inc_udpindatagrams>:
  50974. }
  50975. void snmp_inc_udpindatagrams(void)
  50976. {
  50977. udpindatagrams++;
  50978. 802fe50: 4b02 ldr r3, [pc, #8] ; (802fe5c <snmp_inc_udpindatagrams+0xc>)
  50979. 802fe52: 681a ldr r2, [r3, #0]
  50980. 802fe54: 3201 adds r2, #1
  50981. 802fe56: 601a str r2, [r3, #0]
  50982. 802fe58: 4770 bx lr
  50983. 802fe5a: bf00 nop
  50984. 802fe5c: 2000e1d8 .word 0x2000e1d8
  50985. 0802fe60 <snmp_inc_udpnoports>:
  50986. }
  50987. void snmp_inc_udpnoports(void)
  50988. {
  50989. udpnoports++;
  50990. 802fe60: 4b02 ldr r3, [pc, #8] ; (802fe6c <snmp_inc_udpnoports+0xc>)
  50991. 802fe62: 681a ldr r2, [r3, #0]
  50992. 802fe64: 3201 adds r2, #1
  50993. 802fe66: 601a str r2, [r3, #0]
  50994. 802fe68: 4770 bx lr
  50995. 802fe6a: bf00 nop
  50996. 802fe6c: 2000e190 .word 0x2000e190
  50997. 0802fe70 <snmp_inc_udpinerrors>:
  50998. }
  50999. void snmp_inc_udpinerrors(void)
  51000. {
  51001. udpinerrors++;
  51002. 802fe70: 4b02 ldr r3, [pc, #8] ; (802fe7c <snmp_inc_udpinerrors+0xc>)
  51003. 802fe72: 681a ldr r2, [r3, #0]
  51004. 802fe74: 3201 adds r2, #1
  51005. 802fe76: 601a str r2, [r3, #0]
  51006. 802fe78: 4770 bx lr
  51007. 802fe7a: bf00 nop
  51008. 802fe7c: 2000e200 .word 0x2000e200
  51009. 0802fe80 <snmp_inc_udpoutdatagrams>:
  51010. }
  51011. void snmp_inc_udpoutdatagrams(void)
  51012. {
  51013. udpoutdatagrams++;
  51014. 802fe80: 4b02 ldr r3, [pc, #8] ; (802fe8c <snmp_inc_udpoutdatagrams+0xc>)
  51015. 802fe82: 681a ldr r2, [r3, #0]
  51016. 802fe84: 3201 adds r2, #1
  51017. 802fe86: 601a str r2, [r3, #0]
  51018. 802fe88: 4770 bx lr
  51019. 802fe8a: bf00 nop
  51020. 802fe8c: 2000e188 .word 0x2000e188
  51021. 0802fe90 <snmp_insert_udpidx_tree>:
  51022. /**
  51023. * Inserts udpTable indexes (.udpLocalAddress.udpLocalPort)
  51024. * into index tree.
  51025. */
  51026. void snmp_insert_udpidx_tree(struct udp_pcb *pcb)
  51027. {
  51028. 802fe90: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  51029. 802fe94: 4604 mov r4, r0
  51030. 802fe96: b086 sub sp, #24
  51031. struct mib_list_node *udp_node;
  51032. s32_t udpidx[5];
  51033. u8_t level;
  51034. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  51035. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  51036. 802fe98: a901 add r1, sp, #4
  51037. 802fe9a: f000 f9c2 bl 8030222 <snmp_iptooid>
  51038. udpidx[4] = pcb->local_port;
  51039. 802fe9e: 8a63 ldrh r3, [r4, #18]
  51040. udp_node->nptr = (struct mib_node*)udp_rn;
  51041. if (udp_rn != NULL)
  51042. {
  51043. if (level == 3)
  51044. {
  51045. udp_rn->get_object_def = udpentry_get_object_def;
  51046. 802fea0: 4f17 ldr r7, [pc, #92] ; (802ff00 <snmp_insert_udpidx_tree+0x70>)
  51047. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  51048. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  51049. udpidx[4] = pcb->local_port;
  51050. udp_rn = &udp_root;
  51051. 802fea2: 4c18 ldr r4, [pc, #96] ; (802ff04 <snmp_insert_udpidx_tree+0x74>)
  51052. if (udp_rn != NULL)
  51053. {
  51054. if (level == 3)
  51055. {
  51056. udp_rn->get_object_def = udpentry_get_object_def;
  51057. udp_rn->get_value = udpentry_get_value;
  51058. 802fea4: f8df 806c ldr.w r8, [pc, #108] ; 802ff14 <snmp_insert_udpidx_tree+0x84>
  51059. s32_t udpidx[5];
  51060. u8_t level;
  51061. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  51062. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  51063. udpidx[4] = pcb->local_port;
  51064. 802fea8: 9305 str r3, [sp, #20]
  51065. 802feaa: 2500 movs r5, #0
  51066. udp_rn = &udp_root;
  51067. for (level = 0; level < 5; level++)
  51068. {
  51069. udp_node = NULL;
  51070. 802feac: 2300 movs r3, #0
  51071. 802feae: 9300 str r3, [sp, #0]
  51072. snmp_mib_node_insert(udp_rn, udpidx[level], &udp_node);
  51073. 802feb0: ab01 add r3, sp, #4
  51074. 802feb2: 4620 mov r0, r4
  51075. 802feb4: f853 1025 ldr.w r1, [r3, r5, lsl #2]
  51076. 802feb8: 466a mov r2, sp
  51077. 802feba: b2ee uxtb r6, r5
  51078. 802febc: f000 f9ec bl 8030298 <snmp_mib_node_insert>
  51079. if ((level != 4) && (udp_node != NULL))
  51080. 802fec0: 2e04 cmp r6, #4
  51081. 802fec2: d015 beq.n 802fef0 <snmp_insert_udpidx_tree+0x60>
  51082. 802fec4: 9b00 ldr r3, [sp, #0]
  51083. 802fec6: b19b cbz r3, 802fef0 <snmp_insert_udpidx_tree+0x60>
  51084. {
  51085. if (udp_node->nptr == NULL)
  51086. 802fec8: 68dc ldr r4, [r3, #12]
  51087. 802feca: b98c cbnz r4, 802fef0 <snmp_insert_udpidx_tree+0x60>
  51088. {
  51089. udp_rn = snmp_mib_lrn_alloc();
  51090. 802fecc: f000 f9c2 bl 8030254 <snmp_mib_lrn_alloc>
  51091. udp_node->nptr = (struct mib_node*)udp_rn;
  51092. 802fed0: 9b00 ldr r3, [sp, #0]
  51093. snmp_mib_node_insert(udp_rn, udpidx[level], &udp_node);
  51094. if ((level != 4) && (udp_node != NULL))
  51095. {
  51096. if (udp_node->nptr == NULL)
  51097. {
  51098. udp_rn = snmp_mib_lrn_alloc();
  51099. 802fed2: 4604 mov r4, r0
  51100. udp_node->nptr = (struct mib_node*)udp_rn;
  51101. 802fed4: 60d8 str r0, [r3, #12]
  51102. if (udp_rn != NULL)
  51103. 802fed6: b918 cbnz r0, 802fee0 <snmp_insert_udpidx_tree+0x50>
  51104. {
  51105. udp_rn = (struct mib_list_rootnode*)udp_node->nptr;
  51106. }
  51107. }
  51108. }
  51109. udptable.maxlength = 1;
  51110. 802fed8: 4b0b ldr r3, [pc, #44] ; (802ff08 <snmp_insert_udpidx_tree+0x78>)
  51111. 802feda: 2201 movs r2, #1
  51112. 802fedc: 825a strh r2, [r3, #18]
  51113. 802fede: e00b b.n 802fef8 <snmp_insert_udpidx_tree+0x68>
  51114. {
  51115. udp_rn = snmp_mib_lrn_alloc();
  51116. udp_node->nptr = (struct mib_node*)udp_rn;
  51117. if (udp_rn != NULL)
  51118. {
  51119. if (level == 3)
  51120. 802fee0: 2e03 cmp r6, #3
  51121. 802fee2: d105 bne.n 802fef0 <snmp_insert_udpidx_tree+0x60>
  51122. {
  51123. udp_rn->get_object_def = udpentry_get_object_def;
  51124. udp_rn->get_value = udpentry_get_value;
  51125. udp_rn->set_test = noleafs_set_test;
  51126. 802fee4: 4b09 ldr r3, [pc, #36] ; (802ff0c <snmp_insert_udpidx_tree+0x7c>)
  51127. if (udp_rn != NULL)
  51128. {
  51129. if (level == 3)
  51130. {
  51131. udp_rn->get_object_def = udpentry_get_object_def;
  51132. udp_rn->get_value = udpentry_get_value;
  51133. 802fee6: e880 0180 stmia.w r0, {r7, r8}
  51134. udp_rn->set_test = noleafs_set_test;
  51135. 802feea: 6083 str r3, [r0, #8]
  51136. udp_rn->set_value = noleafs_set_value;
  51137. 802feec: 4b08 ldr r3, [pc, #32] ; (802ff10 <snmp_insert_udpidx_tree+0x80>)
  51138. 802feee: 60c3 str r3, [r0, #12]
  51139. 802fef0: 3501 adds r5, #1
  51140. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  51141. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  51142. udpidx[4] = pcb->local_port;
  51143. udp_rn = &udp_root;
  51144. for (level = 0; level < 5; level++)
  51145. 802fef2: 2d05 cmp r5, #5
  51146. 802fef4: d1da bne.n 802feac <snmp_insert_udpidx_tree+0x1c>
  51147. 802fef6: e7ef b.n 802fed8 <snmp_insert_udpidx_tree+0x48>
  51148. udp_rn = (struct mib_list_rootnode*)udp_node->nptr;
  51149. }
  51150. }
  51151. }
  51152. udptable.maxlength = 1;
  51153. }
  51154. 802fef8: b006 add sp, #24
  51155. 802fefa: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  51156. 802fefe: bf00 nop
  51157. 802ff00: 0802f55d .word 0x0802f55d
  51158. 802ff04: 2000163c .word 0x2000163c
  51159. 802ff08: 20001620 .word 0x20001620
  51160. 802ff0c: 0802ebeb .word 0x0802ebeb
  51161. 802ff10: 0802ebef .word 0x0802ebef
  51162. 802ff14: 0802f219 .word 0x0802f219
  51163. 0802ff18 <snmp_delete_udpidx_tree>:
  51164. /**
  51165. * Removes udpTable indexes (.udpLocalAddress.udpLocalPort)
  51166. * from index tree.
  51167. */
  51168. void snmp_delete_udpidx_tree(struct udp_pcb *pcb)
  51169. {
  51170. 802ff18: b570 push {r4, r5, r6, lr}
  51171. 802ff1a: 4604 mov r4, r0
  51172. 802ff1c: b090 sub sp, #64 ; 0x40
  51173. struct mib_list_node *udp_n, *del_n[5];
  51174. s32_t udpidx[5];
  51175. u8_t bindings, fc, level, del_cnt;
  51176. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  51177. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  51178. 802ff1e: a90b add r1, sp, #44 ; 0x2c
  51179. 802ff20: f000 f97f bl 8030222 <snmp_iptooid>
  51180. udpidx[4] = pcb->local_port;
  51181. 802ff24: 8a61 ldrh r1, [r4, #18]
  51182. /* count PCBs for a given binding
  51183. (e.g. when reusing ports or for temp output PCBs) */
  51184. bindings = 0;
  51185. npcb = udp_pcbs;
  51186. 802ff26: 4b2a ldr r3, [pc, #168] ; (802ffd0 <snmp_delete_udpidx_tree+0xb8>)
  51187. s32_t udpidx[5];
  51188. u8_t bindings, fc, level, del_cnt;
  51189. LWIP_ASSERT("pcb != NULL", pcb != NULL);
  51190. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  51191. udpidx[4] = pcb->local_port;
  51192. 802ff28: 910f str r1, [sp, #60] ; 0x3c
  51193. /* count PCBs for a given binding
  51194. (e.g. when reusing ports or for temp output PCBs) */
  51195. bindings = 0;
  51196. npcb = udp_pcbs;
  51197. 802ff2a: 681b ldr r3, [r3, #0]
  51198. snmp_iptooid(&pcb->local_ip, &udpidx[0]);
  51199. udpidx[4] = pcb->local_port;
  51200. /* count PCBs for a given binding
  51201. (e.g. when reusing ports or for temp output PCBs) */
  51202. bindings = 0;
  51203. 802ff2c: 2200 movs r2, #0
  51204. npcb = udp_pcbs;
  51205. while ((npcb != NULL))
  51206. 802ff2e: e009 b.n 802ff44 <snmp_delete_udpidx_tree+0x2c>
  51207. {
  51208. if (ip_addr_cmp(&npcb->local_ip, &pcb->local_ip) &&
  51209. 802ff30: 681d ldr r5, [r3, #0]
  51210. 802ff32: 6820 ldr r0, [r4, #0]
  51211. 802ff34: 4285 cmp r5, r0
  51212. 802ff36: d104 bne.n 802ff42 <snmp_delete_udpidx_tree+0x2a>
  51213. (npcb->local_port == udpidx[4]))
  51214. 802ff38: 8a58 ldrh r0, [r3, #18]
  51215. (e.g. when reusing ports or for temp output PCBs) */
  51216. bindings = 0;
  51217. npcb = udp_pcbs;
  51218. while ((npcb != NULL))
  51219. {
  51220. if (ip_addr_cmp(&npcb->local_ip, &pcb->local_ip) &&
  51221. 802ff3a: 4288 cmp r0, r1
  51222. 802ff3c: d101 bne.n 802ff42 <snmp_delete_udpidx_tree+0x2a>
  51223. (npcb->local_port == udpidx[4]))
  51224. {
  51225. bindings++;
  51226. 802ff3e: 3201 adds r2, #1
  51227. 802ff40: b2d2 uxtb r2, r2
  51228. }
  51229. npcb = npcb->next;
  51230. 802ff42: 68db ldr r3, [r3, #12]
  51231. /* count PCBs for a given binding
  51232. (e.g. when reusing ports or for temp output PCBs) */
  51233. bindings = 0;
  51234. npcb = udp_pcbs;
  51235. while ((npcb != NULL))
  51236. 802ff44: 2b00 cmp r3, #0
  51237. 802ff46: d1f3 bne.n 802ff30 <snmp_delete_udpidx_tree+0x18>
  51238. {
  51239. bindings++;
  51240. }
  51241. npcb = npcb->next;
  51242. }
  51243. if (bindings == 1)
  51244. 802ff48: 2a01 cmp r2, #1
  51245. 802ff4a: d004 beq.n 802ff56 <snmp_delete_udpidx_tree+0x3e>
  51246. snmp_mib_lrn_free(next);
  51247. }
  51248. }
  51249. }
  51250. /* disable getnext traversal on empty table */
  51251. if (udp_root.count == 0) udptable.maxlength = 0;
  51252. 802ff4c: 4b21 ldr r3, [pc, #132] ; (802ffd4 <snmp_delete_udpidx_tree+0xbc>)
  51253. 802ff4e: 8b9b ldrh r3, [r3, #28]
  51254. 802ff50: 2b00 cmp r3, #0
  51255. 802ff52: d039 beq.n 802ffc8 <snmp_delete_udpidx_tree+0xb0>
  51256. 802ff54: e03a b.n 802ffcc <snmp_delete_udpidx_tree+0xb4>
  51257. {
  51258. /* selectively remove */
  51259. /* mark nodes for deletion */
  51260. level = 0;
  51261. del_cnt = 0;
  51262. udp_rn = &udp_root;
  51263. 802ff56: 4d1f ldr r5, [pc, #124] ; (802ffd4 <snmp_delete_udpidx_tree+0xbc>)
  51264. {
  51265. bindings++;
  51266. }
  51267. npcb = npcb->next;
  51268. }
  51269. if (bindings == 1)
  51270. 802ff58: 461e mov r6, r3
  51271. 802ff5a: 461c mov r4, r3
  51272. level = 0;
  51273. del_cnt = 0;
  51274. udp_rn = &udp_root;
  51275. while ((level < 5) && (udp_rn != NULL))
  51276. {
  51277. fc = snmp_mib_node_find(udp_rn, udpidx[level], &udp_n);
  51278. 802ff5c: ab0b add r3, sp, #44 ; 0x2c
  51279. 802ff5e: 4628 mov r0, r5
  51280. 802ff60: 58f1 ldr r1, [r6, r3]
  51281. 802ff62: 466a mov r2, sp
  51282. 802ff64: f000 f9d3 bl 803030e <snmp_mib_node_find>
  51283. 802ff68: b2c0 uxtb r0, r0
  51284. if (fc == 0)
  51285. 802ff6a: b198 cbz r0, 802ff94 <snmp_delete_udpidx_tree+0x7c>
  51286. {
  51287. /* udpidx[level] does not exist */
  51288. del_cnt = 0;
  51289. udp_rn = NULL;
  51290. }
  51291. else if (fc == 1)
  51292. 802ff6c: 2801 cmp r0, #1
  51293. 802ff6e: d10b bne.n 802ff88 <snmp_delete_udpidx_tree+0x70>
  51294. {
  51295. del_rn[del_cnt] = udp_rn;
  51296. 802ff70: ab10 add r3, sp, #64 ; 0x40
  51297. 802ff72: eb03 0284 add.w r2, r3, r4, lsl #2
  51298. del_n[del_cnt] = udp_n;
  51299. 802ff76: 9b00 ldr r3, [sp, #0]
  51300. del_cnt = 0;
  51301. udp_rn = NULL;
  51302. }
  51303. else if (fc == 1)
  51304. {
  51305. del_rn[del_cnt] = udp_rn;
  51306. 802ff78: f842 5c3c str.w r5, [r2, #-60]
  51307. del_n[del_cnt] = udp_n;
  51308. del_cnt++;
  51309. 802ff7c: 3401 adds r4, #1
  51310. udp_rn = NULL;
  51311. }
  51312. else if (fc == 1)
  51313. {
  51314. del_rn[del_cnt] = udp_rn;
  51315. del_n[del_cnt] = udp_n;
  51316. 802ff7e: f842 3c28 str.w r3, [r2, #-40]
  51317. del_cnt++;
  51318. 802ff82: b2e4 uxtb r4, r4
  51319. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  51320. 802ff84: 68dd ldr r5, [r3, #12]
  51321. 802ff86: e007 b.n 802ff98 <snmp_delete_udpidx_tree+0x80>
  51322. }
  51323. else if (fc == 2)
  51324. 802ff88: 2802 cmp r0, #2
  51325. 802ff8a: d105 bne.n 802ff98 <snmp_delete_udpidx_tree+0x80>
  51326. {
  51327. /* reset delete (2 or more childs) */
  51328. del_cnt = 0;
  51329. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  51330. 802ff8c: 9b00 ldr r3, [sp, #0]
  51331. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  51332. }
  51333. else if (fc == 2)
  51334. {
  51335. /* reset delete (2 or more childs) */
  51336. del_cnt = 0;
  51337. 802ff8e: 2400 movs r4, #0
  51338. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  51339. 802ff90: 68dd ldr r5, [r3, #12]
  51340. 802ff92: e001 b.n 802ff98 <snmp_delete_udpidx_tree+0x80>
  51341. {
  51342. fc = snmp_mib_node_find(udp_rn, udpidx[level], &udp_n);
  51343. if (fc == 0)
  51344. {
  51345. /* udpidx[level] does not exist */
  51346. del_cnt = 0;
  51347. 802ff94: 4604 mov r4, r0
  51348. udp_rn = NULL;
  51349. 802ff96: 4605 mov r5, r0
  51350. /* selectively remove */
  51351. /* mark nodes for deletion */
  51352. level = 0;
  51353. del_cnt = 0;
  51354. udp_rn = &udp_root;
  51355. while ((level < 5) && (udp_rn != NULL))
  51356. 802ff98: 2e10 cmp r6, #16
  51357. 802ff9a: d012 beq.n 802ffc2 <snmp_delete_udpidx_tree+0xaa>
  51358. 802ff9c: 3604 adds r6, #4
  51359. 802ff9e: 2d00 cmp r5, #0
  51360. 802ffa0: d1dc bne.n 802ff5c <snmp_delete_udpidx_tree+0x44>
  51361. 802ffa2: e00e b.n 802ffc2 <snmp_delete_udpidx_tree+0xaa>
  51362. level++;
  51363. }
  51364. /* delete marked index nodes */
  51365. while (del_cnt > 0)
  51366. {
  51367. del_cnt--;
  51368. 802ffa4: 3c01 subs r4, #1
  51369. 802ffa6: b2e4 uxtb r4, r4
  51370. udp_rn = del_rn[del_cnt];
  51371. 802ffa8: aa10 add r2, sp, #64 ; 0x40
  51372. 802ffaa: eb02 0384 add.w r3, r2, r4, lsl #2
  51373. udp_n = del_n[del_cnt];
  51374. 802ffae: f853 1c28 ldr.w r1, [r3, #-40]
  51375. /* delete marked index nodes */
  51376. while (del_cnt > 0)
  51377. {
  51378. del_cnt--;
  51379. udp_rn = del_rn[del_cnt];
  51380. 802ffb2: f853 0c3c ldr.w r0, [r3, #-60]
  51381. udp_n = del_n[del_cnt];
  51382. 802ffb6: 9100 str r1, [sp, #0]
  51383. next = snmp_mib_node_delete(udp_rn, udp_n);
  51384. 802ffb8: f000 f9c3 bl 8030342 <snmp_mib_node_delete>
  51385. if (next != NULL)
  51386. 802ffbc: b108 cbz r0, 802ffc2 <snmp_delete_udpidx_tree+0xaa>
  51387. {
  51388. LWIP_ASSERT("next_count == 0",next->count == 0);
  51389. snmp_mib_lrn_free(next);
  51390. 802ffbe: f000 f967 bl 8030290 <snmp_mib_lrn_free>
  51391. udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
  51392. }
  51393. level++;
  51394. }
  51395. /* delete marked index nodes */
  51396. while (del_cnt > 0)
  51397. 802ffc2: 2c00 cmp r4, #0
  51398. 802ffc4: d1ee bne.n 802ffa4 <snmp_delete_udpidx_tree+0x8c>
  51399. 802ffc6: e7c1 b.n 802ff4c <snmp_delete_udpidx_tree+0x34>
  51400. snmp_mib_lrn_free(next);
  51401. }
  51402. }
  51403. }
  51404. /* disable getnext traversal on empty table */
  51405. if (udp_root.count == 0) udptable.maxlength = 0;
  51406. 802ffc8: 4a03 ldr r2, [pc, #12] ; (802ffd8 <snmp_delete_udpidx_tree+0xc0>)
  51407. 802ffca: 8253 strh r3, [r2, #18]
  51408. }
  51409. 802ffcc: b010 add sp, #64 ; 0x40
  51410. 802ffce: bd70 pop {r4, r5, r6, pc}
  51411. 802ffd0: 20010d94 .word 0x20010d94
  51412. 802ffd4: 2000163c .word 0x2000163c
  51413. 802ffd8: 20001620 .word 0x20001620
  51414. 0802ffdc <snmp_inc_snmpinpkts>:
  51415. void snmp_inc_snmpinpkts(void)
  51416. {
  51417. snmpinpkts++;
  51418. 802ffdc: 4b02 ldr r3, [pc, #8] ; (802ffe8 <snmp_inc_snmpinpkts+0xc>)
  51419. 802ffde: 681a ldr r2, [r3, #0]
  51420. 802ffe0: 3201 adds r2, #1
  51421. 802ffe2: 601a str r2, [r3, #0]
  51422. 802ffe4: 4770 bx lr
  51423. 802ffe6: bf00 nop
  51424. 802ffe8: 2000e134 .word 0x2000e134
  51425. 0802ffec <snmp_inc_snmpoutpkts>:
  51426. }
  51427. void snmp_inc_snmpoutpkts(void)
  51428. {
  51429. snmpoutpkts++;
  51430. 802ffec: 4b02 ldr r3, [pc, #8] ; (802fff8 <snmp_inc_snmpoutpkts+0xc>)
  51431. 802ffee: 681a ldr r2, [r3, #0]
  51432. 802fff0: 3201 adds r2, #1
  51433. 802fff2: 601a str r2, [r3, #0]
  51434. 802fff4: 4770 bx lr
  51435. 802fff6: bf00 nop
  51436. 802fff8: 2000e204 .word 0x2000e204
  51437. 0802fffc <snmp_inc_snmpinbadversions>:
  51438. }
  51439. void snmp_inc_snmpinbadversions(void)
  51440. {
  51441. snmpinbadversions++;
  51442. 802fffc: 4b02 ldr r3, [pc, #8] ; (8030008 <snmp_inc_snmpinbadversions+0xc>)
  51443. 802fffe: 681a ldr r2, [r3, #0]
  51444. 8030000: 3201 adds r2, #1
  51445. 8030002: 601a str r2, [r3, #0]
  51446. 8030004: 4770 bx lr
  51447. 8030006: bf00 nop
  51448. 8030008: 2000e1f0 .word 0x2000e1f0
  51449. 0803000c <snmp_inc_snmpinbadcommunitynames>:
  51450. }
  51451. void snmp_inc_snmpinbadcommunitynames(void)
  51452. {
  51453. snmpinbadcommunitynames++;
  51454. 803000c: 4b02 ldr r3, [pc, #8] ; (8030018 <snmp_inc_snmpinbadcommunitynames+0xc>)
  51455. 803000e: 681a ldr r2, [r3, #0]
  51456. 8030010: 3201 adds r2, #1
  51457. 8030012: 601a str r2, [r3, #0]
  51458. 8030014: 4770 bx lr
  51459. 8030016: bf00 nop
  51460. 8030018: 2000e108 .word 0x2000e108
  51461. 0803001c <snmp_inc_snmpinasnparseerrs>:
  51462. snmpinbadcommunityuses++;
  51463. }
  51464. void snmp_inc_snmpinasnparseerrs(void)
  51465. {
  51466. snmpinasnparseerrs++;
  51467. 803001c: 4b02 ldr r3, [pc, #8] ; (8030028 <snmp_inc_snmpinasnparseerrs+0xc>)
  51468. 803001e: 681a ldr r2, [r3, #0]
  51469. 8030020: 3201 adds r2, #1
  51470. 8030022: 601a str r2, [r3, #0]
  51471. 8030024: 4770 bx lr
  51472. 8030026: bf00 nop
  51473. 8030028: 2000e1f4 .word 0x2000e1f4
  51474. 0803002c <snmp_inc_snmpintoobigs>:
  51475. }
  51476. void snmp_inc_snmpintoobigs(void)
  51477. {
  51478. snmpintoobigs++;
  51479. 803002c: 4b02 ldr r3, [pc, #8] ; (8030038 <snmp_inc_snmpintoobigs+0xc>)
  51480. 803002e: 681a ldr r2, [r3, #0]
  51481. 8030030: 3201 adds r2, #1
  51482. 8030032: 601a str r2, [r3, #0]
  51483. 8030034: 4770 bx lr
  51484. 8030036: bf00 nop
  51485. 8030038: 2000e1b4 .word 0x2000e1b4
  51486. 0803003c <snmp_inc_snmpinnosuchnames>:
  51487. }
  51488. void snmp_inc_snmpinnosuchnames(void)
  51489. {
  51490. snmpinnosuchnames++;
  51491. 803003c: 4b02 ldr r3, [pc, #8] ; (8030048 <snmp_inc_snmpinnosuchnames+0xc>)
  51492. 803003e: 681a ldr r2, [r3, #0]
  51493. 8030040: 3201 adds r2, #1
  51494. 8030042: 601a str r2, [r3, #0]
  51495. 8030044: 4770 bx lr
  51496. 8030046: bf00 nop
  51497. 8030048: 2000e234 .word 0x2000e234
  51498. 0803004c <snmp_inc_snmpinbadvalues>:
  51499. }
  51500. void snmp_inc_snmpinbadvalues(void)
  51501. {
  51502. snmpinbadvalues++;
  51503. 803004c: 4b02 ldr r3, [pc, #8] ; (8030058 <snmp_inc_snmpinbadvalues+0xc>)
  51504. 803004e: 681a ldr r2, [r3, #0]
  51505. 8030050: 3201 adds r2, #1
  51506. 8030052: 601a str r2, [r3, #0]
  51507. 8030054: 4770 bx lr
  51508. 8030056: bf00 nop
  51509. 8030058: 2000e1d0 .word 0x2000e1d0
  51510. 0803005c <snmp_inc_snmpinreadonlys>:
  51511. }
  51512. void snmp_inc_snmpinreadonlys(void)
  51513. {
  51514. snmpinreadonlys++;
  51515. 803005c: 4b02 ldr r3, [pc, #8] ; (8030068 <snmp_inc_snmpinreadonlys+0xc>)
  51516. 803005e: 681a ldr r2, [r3, #0]
  51517. 8030060: 3201 adds r2, #1
  51518. 8030062: 601a str r2, [r3, #0]
  51519. 8030064: 4770 bx lr
  51520. 8030066: bf00 nop
  51521. 8030068: 2000e1a4 .word 0x2000e1a4
  51522. 0803006c <snmp_inc_snmpingenerrs>:
  51523. }
  51524. void snmp_inc_snmpingenerrs(void)
  51525. {
  51526. snmpingenerrs++;
  51527. 803006c: 4b02 ldr r3, [pc, #8] ; (8030078 <snmp_inc_snmpingenerrs+0xc>)
  51528. 803006e: 681a ldr r2, [r3, #0]
  51529. 8030070: 3201 adds r2, #1
  51530. 8030072: 601a str r2, [r3, #0]
  51531. 8030074: 4770 bx lr
  51532. 8030076: bf00 nop
  51533. 8030078: 2000e17c .word 0x2000e17c
  51534. 0803007c <snmp_add_snmpintotalreqvars>:
  51535. }
  51536. void snmp_add_snmpintotalreqvars(u8_t value)
  51537. {
  51538. snmpintotalreqvars += value;
  51539. 803007c: 4b02 ldr r3, [pc, #8] ; (8030088 <snmp_add_snmpintotalreqvars+0xc>)
  51540. 803007e: 681a ldr r2, [r3, #0]
  51541. 8030080: 1880 adds r0, r0, r2
  51542. 8030082: 6018 str r0, [r3, #0]
  51543. 8030084: 4770 bx lr
  51544. 8030086: bf00 nop
  51545. 8030088: 2000e1d4 .word 0x2000e1d4
  51546. 0803008c <snmp_add_snmpintotalsetvars>:
  51547. }
  51548. void snmp_add_snmpintotalsetvars(u8_t value)
  51549. {
  51550. snmpintotalsetvars += value;
  51551. 803008c: 4b02 ldr r3, [pc, #8] ; (8030098 <snmp_add_snmpintotalsetvars+0xc>)
  51552. 803008e: 681a ldr r2, [r3, #0]
  51553. 8030090: 1880 adds r0, r0, r2
  51554. 8030092: 6018 str r0, [r3, #0]
  51555. 8030094: 4770 bx lr
  51556. 8030096: bf00 nop
  51557. 8030098: 2000e114 .word 0x2000e114
  51558. 0803009c <snmp_inc_snmpingetrequests>:
  51559. }
  51560. void snmp_inc_snmpingetrequests(void)
  51561. {
  51562. snmpingetrequests++;
  51563. 803009c: 4b02 ldr r3, [pc, #8] ; (80300a8 <snmp_inc_snmpingetrequests+0xc>)
  51564. 803009e: 681a ldr r2, [r3, #0]
  51565. 80300a0: 3201 adds r2, #1
  51566. 80300a2: 601a str r2, [r3, #0]
  51567. 80300a4: 4770 bx lr
  51568. 80300a6: bf00 nop
  51569. 80300a8: 2000e168 .word 0x2000e168
  51570. 080300ac <snmp_inc_snmpingetnexts>:
  51571. }
  51572. void snmp_inc_snmpingetnexts(void)
  51573. {
  51574. snmpingetnexts++;
  51575. 80300ac: 4b02 ldr r3, [pc, #8] ; (80300b8 <snmp_inc_snmpingetnexts+0xc>)
  51576. 80300ae: 681a ldr r2, [r3, #0]
  51577. 80300b0: 3201 adds r2, #1
  51578. 80300b2: 601a str r2, [r3, #0]
  51579. 80300b4: 4770 bx lr
  51580. 80300b6: bf00 nop
  51581. 80300b8: 2000e0ec .word 0x2000e0ec
  51582. 080300bc <snmp_inc_snmpinsetrequests>:
  51583. }
  51584. void snmp_inc_snmpinsetrequests(void)
  51585. {
  51586. snmpinsetrequests++;
  51587. 80300bc: 4b02 ldr r3, [pc, #8] ; (80300c8 <snmp_inc_snmpinsetrequests+0xc>)
  51588. 80300be: 681a ldr r2, [r3, #0]
  51589. 80300c0: 3201 adds r2, #1
  51590. 80300c2: 601a str r2, [r3, #0]
  51591. 80300c4: 4770 bx lr
  51592. 80300c6: bf00 nop
  51593. 80300c8: 2000e210 .word 0x2000e210
  51594. 080300cc <snmp_inc_snmpingetresponses>:
  51595. }
  51596. void snmp_inc_snmpingetresponses(void)
  51597. {
  51598. snmpingetresponses++;
  51599. 80300cc: 4b02 ldr r3, [pc, #8] ; (80300d8 <snmp_inc_snmpingetresponses+0xc>)
  51600. 80300ce: 681a ldr r2, [r3, #0]
  51601. 80300d0: 3201 adds r2, #1
  51602. 80300d2: 601a str r2, [r3, #0]
  51603. 80300d4: 4770 bx lr
  51604. 80300d6: bf00 nop
  51605. 80300d8: 2000e164 .word 0x2000e164
  51606. 080300dc <snmp_inc_snmpintraps>:
  51607. }
  51608. void snmp_inc_snmpintraps(void)
  51609. {
  51610. snmpintraps++;
  51611. 80300dc: 4b02 ldr r3, [pc, #8] ; (80300e8 <snmp_inc_snmpintraps+0xc>)
  51612. 80300de: 681a ldr r2, [r3, #0]
  51613. 80300e0: 3201 adds r2, #1
  51614. 80300e2: 601a str r2, [r3, #0]
  51615. 80300e4: 4770 bx lr
  51616. 80300e6: bf00 nop
  51617. 80300e8: 2000e0fc .word 0x2000e0fc
  51618. 080300ec <snmp_inc_snmpouttoobigs>:
  51619. }
  51620. void snmp_inc_snmpouttoobigs(void)
  51621. {
  51622. snmpouttoobigs++;
  51623. 80300ec: 4b02 ldr r3, [pc, #8] ; (80300f8 <snmp_inc_snmpouttoobigs+0xc>)
  51624. 80300ee: 681a ldr r2, [r3, #0]
  51625. 80300f0: 3201 adds r2, #1
  51626. 80300f2: 601a str r2, [r3, #0]
  51627. 80300f4: 4770 bx lr
  51628. 80300f6: bf00 nop
  51629. 80300f8: 2000e14c .word 0x2000e14c
  51630. 080300fc <snmp_inc_snmpoutnosuchnames>:
  51631. }
  51632. void snmp_inc_snmpoutnosuchnames(void)
  51633. {
  51634. snmpoutnosuchnames++;
  51635. 80300fc: 4b02 ldr r3, [pc, #8] ; (8030108 <snmp_inc_snmpoutnosuchnames+0xc>)
  51636. 80300fe: 681a ldr r2, [r3, #0]
  51637. 8030100: 3201 adds r2, #1
  51638. 8030102: 601a str r2, [r3, #0]
  51639. 8030104: 4770 bx lr
  51640. 8030106: bf00 nop
  51641. 8030108: 2000e118 .word 0x2000e118
  51642. 0803010c <snmp_inc_snmpoutbadvalues>:
  51643. }
  51644. void snmp_inc_snmpoutbadvalues(void)
  51645. {
  51646. snmpoutbadvalues++;
  51647. 803010c: 4b02 ldr r3, [pc, #8] ; (8030118 <snmp_inc_snmpoutbadvalues+0xc>)
  51648. 803010e: 681a ldr r2, [r3, #0]
  51649. 8030110: 3201 adds r2, #1
  51650. 8030112: 601a str r2, [r3, #0]
  51651. 8030114: 4770 bx lr
  51652. 8030116: bf00 nop
  51653. 8030118: 2000e0f8 .word 0x2000e0f8
  51654. 0803011c <snmp_inc_snmpoutgenerrs>:
  51655. }
  51656. void snmp_inc_snmpoutgenerrs(void)
  51657. {
  51658. snmpoutgenerrs++;
  51659. 803011c: 4b02 ldr r3, [pc, #8] ; (8030128 <snmp_inc_snmpoutgenerrs+0xc>)
  51660. 803011e: 681a ldr r2, [r3, #0]
  51661. 8030120: 3201 adds r2, #1
  51662. 8030122: 601a str r2, [r3, #0]
  51663. 8030124: 4770 bx lr
  51664. 8030126: bf00 nop
  51665. 8030128: 2000e238 .word 0x2000e238
  51666. 0803012c <snmp_inc_snmpoutgetresponses>:
  51667. snmpoutsetrequests++;
  51668. }
  51669. void snmp_inc_snmpoutgetresponses(void)
  51670. {
  51671. snmpoutgetresponses++;
  51672. 803012c: 4b02 ldr r3, [pc, #8] ; (8030138 <snmp_inc_snmpoutgetresponses+0xc>)
  51673. 803012e: 681a ldr r2, [r3, #0]
  51674. 8030130: 3201 adds r2, #1
  51675. 8030132: 601a str r2, [r3, #0]
  51676. 8030134: 4770 bx lr
  51677. 8030136: bf00 nop
  51678. 8030138: 2000e0f4 .word 0x2000e0f4
  51679. 0803013c <snmp_inc_snmpouttraps>:
  51680. }
  51681. void snmp_inc_snmpouttraps(void)
  51682. {
  51683. snmpouttraps++;
  51684. 803013c: 4b02 ldr r3, [pc, #8] ; (8030148 <snmp_inc_snmpouttraps+0xc>)
  51685. 803013e: 681a ldr r2, [r3, #0]
  51686. 8030140: 3201 adds r2, #1
  51687. 8030142: 601a str r2, [r3, #0]
  51688. 8030144: 4770 bx lr
  51689. 8030146: bf00 nop
  51690. 8030148: 2000e16c .word 0x2000e16c
  51691. 0803014c <snmp_get_snmpgrpid_ptr>:
  51692. }
  51693. void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid)
  51694. {
  51695. *oid = &snmpgrp_id;
  51696. 803014c: 4b01 ldr r3, [pc, #4] ; (8030154 <snmp_get_snmpgrpid_ptr+0x8>)
  51697. 803014e: 6003 str r3, [r0, #0]
  51698. 8030150: 4770 bx lr
  51699. 8030152: bf00 nop
  51700. 8030154: 2000184c .word 0x2000184c
  51701. 08030158 <snmp_get_snmpenableauthentraps>:
  51702. }
  51703. }
  51704. void snmp_get_snmpenableauthentraps(u8_t *value)
  51705. {
  51706. *value = *snmpenableauthentraps_ptr;
  51707. 8030158: 4b02 ldr r3, [pc, #8] ; (8030164 <snmp_get_snmpenableauthentraps+0xc>)
  51708. 803015a: 681b ldr r3, [r3, #0]
  51709. 803015c: 781b ldrb r3, [r3, #0]
  51710. 803015e: 7003 strb r3, [r0, #0]
  51711. 8030160: 4770 bx lr
  51712. 8030162: bf00 nop
  51713. 8030164: 20001760 .word 0x20001760
  51714. 08030168 <push_node>:
  51715. /**
  51716. * Pushes nse struct onto stack.
  51717. */
  51718. static void
  51719. push_node(struct nse* node)
  51720. {
  51721. 8030168: b530 push {r4, r5, lr}
  51722. LWIP_ASSERT("node_stack_cnt < NODE_STACK_SIZE",node_stack_cnt < NODE_STACK_SIZE);
  51723. LWIP_DEBUGF(SNMP_MIB_DEBUG,("push_node() node=%p id=%"S32_F"\n",(void*)(node->r_ptr),node->r_id));
  51724. if (node_stack_cnt < NODE_STACK_SIZE)
  51725. 803016a: 4d07 ldr r5, [pc, #28] ; (8030188 <push_node+0x20>)
  51726. 803016c: 782b ldrb r3, [r5, #0]
  51727. 803016e: 2b1f cmp r3, #31
  51728. 8030170: d808 bhi.n 8030184 <push_node+0x1c>
  51729. {
  51730. node_stack[node_stack_cnt] = *node;
  51731. 8030172: 4a06 ldr r2, [pc, #24] ; (803018c <push_node+0x24>)
  51732. 8030174: 240c movs r4, #12
  51733. 8030176: fb04 2403 mla r4, r4, r3, r2
  51734. 803017a: c807 ldmia r0, {r0, r1, r2}
  51735. 803017c: e884 0007 stmia.w r4, {r0, r1, r2}
  51736. node_stack_cnt++;
  51737. 8030180: 3301 adds r3, #1
  51738. 8030182: 702b strb r3, [r5, #0]
  51739. 8030184: bd30 pop {r4, r5, pc}
  51740. 8030186: bf00 nop
  51741. 8030188: 2000e23c .word 0x2000e23c
  51742. 803018c: 2000e240 .word 0x2000e240
  51743. 08030190 <empty_table>:
  51744. empty_table(struct mib_node *node)
  51745. {
  51746. u8_t node_type;
  51747. u8_t empty = 0;
  51748. if (node != NULL)
  51749. 8030190: b1d0 cbz r0, 80301c8 <empty_table+0x38>
  51750. {
  51751. node_type = node->node_type;
  51752. 8030192: 7c03 ldrb r3, [r0, #16]
  51753. if (node_type == MIB_NODE_LR)
  51754. 8030194: 2b04 cmp r3, #4
  51755. 8030196: d105 bne.n 80301a4 <empty_table+0x14>
  51756. {
  51757. struct mib_list_rootnode *lrn;
  51758. lrn = (struct mib_list_rootnode *)node;
  51759. if ((lrn->count == 0) || (lrn->head == NULL))
  51760. 8030198: 8b83 ldrh r3, [r0, #28]
  51761. 803019a: b903 cbnz r3, 803019e <empty_table+0xe>
  51762. 803019c: e009 b.n 80301b2 <empty_table+0x22>
  51763. 803019e: 6943 ldr r3, [r0, #20]
  51764. 80301a0: b13b cbz r3, 80301b2 <empty_table+0x22>
  51765. 80301a2: e010 b.n 80301c6 <empty_table+0x36>
  51766. {
  51767. empty = 1;
  51768. }
  51769. }
  51770. else if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
  51771. 80301a4: 1e9a subs r2, r3, #2
  51772. 80301a6: 2a01 cmp r2, #1
  51773. 80301a8: d805 bhi.n 80301b6 <empty_table+0x26>
  51774. {
  51775. struct mib_array_node *an;
  51776. an = (struct mib_array_node *)node;
  51777. if ((an->maxlength == 0) || (an->nptr == NULL))
  51778. 80301aa: 8a43 ldrh r3, [r0, #18]
  51779. 80301ac: b10b cbz r3, 80301b2 <empty_table+0x22>
  51780. 80301ae: 6980 ldr r0, [r0, #24]
  51781. 80301b0: e004 b.n 80301bc <empty_table+0x2c>
  51782. {
  51783. empty = 1;
  51784. 80301b2: 2001 movs r0, #1
  51785. 80301b4: 4770 bx lr
  51786. }
  51787. }
  51788. else if (node_type == MIB_NODE_EX)
  51789. 80301b6: 2b05 cmp r3, #5
  51790. 80301b8: d105 bne.n 80301c6 <empty_table+0x36>
  51791. {
  51792. struct mib_external_node *en;
  51793. en = (struct mib_external_node *)node;
  51794. if (en->tree_levels == 0)
  51795. 80301ba: 7e00 ldrb r0, [r0, #24]
  51796. */
  51797. static u8_t
  51798. empty_table(struct mib_node *node)
  51799. {
  51800. u8_t node_type;
  51801. u8_t empty = 0;
  51802. 80301bc: f1d0 0001 rsbs r0, r0, #1
  51803. 80301c0: bf38 it cc
  51804. 80301c2: 2000 movcc r0, #0
  51805. 80301c4: 4770 bx lr
  51806. 80301c6: 2000 movs r0, #0
  51807. empty = 1;
  51808. }
  51809. }
  51810. }
  51811. return empty;
  51812. }
  51813. 80301c8: 4770 bx lr
  51814. 80301ca: 0000 movs r0, r0
  51815. 080301cc <snmp_ifindextonetif>:
  51816. * @param netif points to returned netif struct pointer
  51817. */
  51818. void
  51819. snmp_ifindextonetif(s32_t ifindex, struct netif **netif)
  51820. {
  51821. struct netif *nif = netif_list;
  51822. 80301cc: 4b05 ldr r3, [pc, #20] ; (80301e4 <snmp_ifindextonetif+0x18>)
  51823. s32_t i, ifidx;
  51824. ifidx = ifindex - 1;
  51825. 80301ce: 3801 subs r0, #1
  51826. * @param netif points to returned netif struct pointer
  51827. */
  51828. void
  51829. snmp_ifindextonetif(s32_t ifindex, struct netif **netif)
  51830. {
  51831. struct netif *nif = netif_list;
  51832. 80301d0: 681b ldr r3, [r3, #0]
  51833. s32_t i, ifidx;
  51834. ifidx = ifindex - 1;
  51835. i = 0;
  51836. 80301d2: 2200 movs r2, #0
  51837. while ((nif != NULL) && (i < ifidx))
  51838. 80301d4: e001 b.n 80301da <snmp_ifindextonetif+0xe>
  51839. {
  51840. nif = nif->next;
  51841. 80301d6: 681b ldr r3, [r3, #0]
  51842. i++;
  51843. 80301d8: 3201 adds r2, #1
  51844. struct netif *nif = netif_list;
  51845. s32_t i, ifidx;
  51846. ifidx = ifindex - 1;
  51847. i = 0;
  51848. while ((nif != NULL) && (i < ifidx))
  51849. 80301da: b10b cbz r3, 80301e0 <snmp_ifindextonetif+0x14>
  51850. 80301dc: 4282 cmp r2, r0
  51851. 80301de: dbfa blt.n 80301d6 <snmp_ifindextonetif+0xa>
  51852. {
  51853. nif = nif->next;
  51854. i++;
  51855. }
  51856. *netif = nif;
  51857. 80301e0: 600b str r3, [r1, #0]
  51858. 80301e2: 4770 bx lr
  51859. 80301e4: 20010d6c .word 0x20010d6c
  51860. 080301e8 <snmp_netiftoifindex>:
  51861. * @param ifidx points to s32_t object sub-identifier
  51862. */
  51863. void
  51864. snmp_netiftoifindex(struct netif *netif, s32_t *ifidx)
  51865. {
  51866. struct netif *nif = netif_list;
  51867. 80301e8: 4b06 ldr r3, [pc, #24] ; (8030204 <snmp_netiftoifindex+0x1c>)
  51868. u16_t i;
  51869. i = 0;
  51870. 80301ea: 2200 movs r2, #0
  51871. * @param ifidx points to s32_t object sub-identifier
  51872. */
  51873. void
  51874. snmp_netiftoifindex(struct netif *netif, s32_t *ifidx)
  51875. {
  51876. struct netif *nif = netif_list;
  51877. 80301ec: 681b ldr r3, [r3, #0]
  51878. u16_t i;
  51879. i = 0;
  51880. while ((nif != NULL) && (nif != netif))
  51881. 80301ee: e001 b.n 80301f4 <snmp_netiftoifindex+0xc>
  51882. {
  51883. nif = nif->next;
  51884. 80301f0: 681b ldr r3, [r3, #0]
  51885. i++;
  51886. 80301f2: b292 uxth r2, r2
  51887. 80301f4: 3201 adds r2, #1
  51888. {
  51889. struct netif *nif = netif_list;
  51890. u16_t i;
  51891. i = 0;
  51892. while ((nif != NULL) && (nif != netif))
  51893. 80301f6: b90b cbnz r3, 80301fc <snmp_netiftoifindex+0x14>
  51894. {
  51895. nif = nif->next;
  51896. i++;
  51897. }
  51898. *ifidx = i+1;
  51899. 80301f8: 600a str r2, [r1, #0]
  51900. 80301fa: 4770 bx lr
  51901. {
  51902. struct netif *nif = netif_list;
  51903. u16_t i;
  51904. i = 0;
  51905. while ((nif != NULL) && (nif != netif))
  51906. 80301fc: 4283 cmp r3, r0
  51907. 80301fe: d1f7 bne.n 80301f0 <snmp_netiftoifindex+0x8>
  51908. 8030200: e7fa b.n 80301f8 <snmp_netiftoifindex+0x10>
  51909. 8030202: bf00 nop
  51910. 8030204: 20010d6c .word 0x20010d6c
  51911. 08030208 <snmp_oidtoip>:
  51912. * @param ip points to output struct
  51913. */
  51914. void
  51915. snmp_oidtoip(s32_t *ident, ip_addr_t *ip)
  51916. {
  51917. IP4_ADDR(ip, ident[0], ident[1], ident[2], ident[3]);
  51918. 8030208: 7802 ldrb r2, [r0, #0]
  51919. 803020a: 68c3 ldr r3, [r0, #12]
  51920. 803020c: ea42 6303 orr.w r3, r2, r3, lsl #24
  51921. 8030210: 7a02 ldrb r2, [r0, #8]
  51922. 8030212: ea43 4302 orr.w r3, r3, r2, lsl #16
  51923. 8030216: 6842 ldr r2, [r0, #4]
  51924. 8030218: 0612 lsls r2, r2, #24
  51925. 803021a: ea43 4312 orr.w r3, r3, r2, lsr #16
  51926. 803021e: 600b str r3, [r1, #0]
  51927. 8030220: 4770 bx lr
  51928. 08030222 <snmp_iptooid>:
  51929. * @param ident points to s32_t ident[4] output
  51930. */
  51931. void
  51932. snmp_iptooid(ip_addr_t *ip, s32_t *ident)
  51933. {
  51934. ident[0] = ip4_addr1(ip);
  51935. 8030222: 7803 ldrb r3, [r0, #0]
  51936. 8030224: 600b str r3, [r1, #0]
  51937. ident[1] = ip4_addr2(ip);
  51938. 8030226: 7843 ldrb r3, [r0, #1]
  51939. 8030228: 604b str r3, [r1, #4]
  51940. ident[2] = ip4_addr3(ip);
  51941. 803022a: 7883 ldrb r3, [r0, #2]
  51942. 803022c: 608b str r3, [r1, #8]
  51943. ident[3] = ip4_addr4(ip);
  51944. 803022e: 78c3 ldrb r3, [r0, #3]
  51945. 8030230: 60cb str r3, [r1, #12]
  51946. 8030232: 4770 bx lr
  51947. 08030234 <snmp_mib_ln_alloc>:
  51948. }
  51949. struct mib_list_node *
  51950. snmp_mib_ln_alloc(s32_t id)
  51951. {
  51952. 8030234: b510 push {r4, lr}
  51953. 8030236: 4604 mov r4, r0
  51954. struct mib_list_node *ln;
  51955. ln = (struct mib_list_node *)memp_malloc(MEMP_SNMP_NODE);
  51956. 8030238: 200b movs r0, #11
  51957. 803023a: f7fa fee9 bl 802b010 <memp_malloc>
  51958. if (ln != NULL)
  51959. 803023e: b120 cbz r0, 803024a <snmp_mib_ln_alloc+0x16>
  51960. {
  51961. ln->prev = NULL;
  51962. 8030240: 2300 movs r3, #0
  51963. 8030242: 6003 str r3, [r0, #0]
  51964. ln->next = NULL;
  51965. 8030244: 6043 str r3, [r0, #4]
  51966. ln->objid = id;
  51967. 8030246: 6084 str r4, [r0, #8]
  51968. ln->nptr = NULL;
  51969. 8030248: 60c3 str r3, [r0, #12]
  51970. }
  51971. return ln;
  51972. }
  51973. 803024a: bd10 pop {r4, pc}
  51974. 0803024c <snmp_mib_ln_free>:
  51975. void
  51976. snmp_mib_ln_free(struct mib_list_node *ln)
  51977. {
  51978. 803024c: 4601 mov r1, r0
  51979. memp_free(MEMP_SNMP_NODE, ln);
  51980. 803024e: 200b movs r0, #11
  51981. 8030250: f7fa bef4 b.w 802b03c <memp_free>
  51982. 08030254 <snmp_mib_lrn_alloc>:
  51983. }
  51984. struct mib_list_rootnode *
  51985. snmp_mib_lrn_alloc(void)
  51986. {
  51987. 8030254: b508 push {r3, lr}
  51988. struct mib_list_rootnode *lrn;
  51989. lrn = (struct mib_list_rootnode*)memp_malloc(MEMP_SNMP_ROOTNODE);
  51990. 8030256: 200a movs r0, #10
  51991. 8030258: f7fa feda bl 802b010 <memp_malloc>
  51992. if (lrn != NULL)
  51993. 803025c: b170 cbz r0, 803027c <snmp_mib_lrn_alloc+0x28>
  51994. {
  51995. lrn->get_object_def = noleafs_get_object_def;
  51996. 803025e: 4b08 ldr r3, [pc, #32] ; (8030280 <snmp_mib_lrn_alloc+0x2c>)
  51997. 8030260: 6003 str r3, [r0, #0]
  51998. lrn->get_value = noleafs_get_value;
  51999. 8030262: 4b08 ldr r3, [pc, #32] ; (8030284 <snmp_mib_lrn_alloc+0x30>)
  52000. 8030264: 6043 str r3, [r0, #4]
  52001. lrn->set_test = noleafs_set_test;
  52002. 8030266: 4b08 ldr r3, [pc, #32] ; (8030288 <snmp_mib_lrn_alloc+0x34>)
  52003. 8030268: 6083 str r3, [r0, #8]
  52004. lrn->set_value = noleafs_set_value;
  52005. 803026a: 4b08 ldr r3, [pc, #32] ; (803028c <snmp_mib_lrn_alloc+0x38>)
  52006. 803026c: 60c3 str r3, [r0, #12]
  52007. lrn->node_type = MIB_NODE_LR;
  52008. 803026e: 2304 movs r3, #4
  52009. 8030270: 7403 strb r3, [r0, #16]
  52010. lrn->maxlength = 0;
  52011. 8030272: 2300 movs r3, #0
  52012. 8030274: 8243 strh r3, [r0, #18]
  52013. lrn->head = NULL;
  52014. 8030276: 6143 str r3, [r0, #20]
  52015. lrn->tail = NULL;
  52016. 8030278: 6183 str r3, [r0, #24]
  52017. lrn->count = 0;
  52018. 803027a: 8383 strh r3, [r0, #28]
  52019. }
  52020. return lrn;
  52021. }
  52022. 803027c: bd08 pop {r3, pc}
  52023. 803027e: bf00 nop
  52024. 8030280: 0802ebe3 .word 0x0802ebe3
  52025. 8030284: 0802ebe9 .word 0x0802ebe9
  52026. 8030288: 0802ebeb .word 0x0802ebeb
  52027. 803028c: 0802ebef .word 0x0802ebef
  52028. 08030290 <snmp_mib_lrn_free>:
  52029. void
  52030. snmp_mib_lrn_free(struct mib_list_rootnode *lrn)
  52031. {
  52032. 8030290: 4601 mov r1, r0
  52033. memp_free(MEMP_SNMP_ROOTNODE, lrn);
  52034. 8030292: 200a movs r0, #10
  52035. 8030294: f7fa bed2 b.w 802b03c <memp_free>
  52036. 08030298 <snmp_mib_node_insert>:
  52037. * used for constructing the tree.
  52038. * @return -1 if failed, 1 if inserted, 2 if present.
  52039. */
  52040. s8_t
  52041. snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn)
  52042. {
  52043. 8030298: b5f8 push {r3, r4, r5, r6, r7, lr}
  52044. 803029a: 4605 mov r5, r0
  52045. 803029c: 4616 mov r6, r2
  52046. LWIP_ASSERT("rn != NULL",rn != NULL);
  52047. /* -1 = malloc failure, 0 = not inserted, 1 = inserted, 2 = was present */
  52048. insert = 0;
  52049. if (rn->head == NULL)
  52050. 803029e: 696c ldr r4, [r5, #20]
  52051. * used for constructing the tree.
  52052. * @return -1 if failed, 1 if inserted, 2 if present.
  52053. */
  52054. s8_t
  52055. snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn)
  52056. {
  52057. 80302a0: 4608 mov r0, r1
  52058. LWIP_ASSERT("rn != NULL",rn != NULL);
  52059. /* -1 = malloc failure, 0 = not inserted, 1 = inserted, 2 = was present */
  52060. insert = 0;
  52061. if (rn->head == NULL)
  52062. 80302a2: b93c cbnz r4, 80302b4 <snmp_mib_node_insert+0x1c>
  52063. {
  52064. /* empty list, add first node */
  52065. LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc empty list objid==%"S32_F"\n",objid));
  52066. nn = snmp_mib_ln_alloc(objid);
  52067. 80302a4: f7ff ffc6 bl 8030234 <snmp_mib_ln_alloc>
  52068. if (nn != NULL)
  52069. 80302a8: b350 cbz r0, 8030300 <snmp_mib_node_insert+0x68>
  52070. {
  52071. rn->head = nn;
  52072. 80302aa: 6168 str r0, [r5, #20]
  52073. rn->tail = nn;
  52074. 80302ac: 61a8 str r0, [r5, #24]
  52075. *insn = nn;
  52076. 80302ae: 6030 str r0, [r6, #0]
  52077. 80302b0: e021 b.n 80302f6 <snmp_mib_node_insert+0x5e>
  52078. *insn = n;
  52079. insert = 2;
  52080. }
  52081. else if (n->objid < objid)
  52082. {
  52083. if (n->next == NULL)
  52084. 80302b2: 463c mov r4, r7
  52085. struct mib_list_node *n;
  52086. /* at least one node is present */
  52087. n = rn->head;
  52088. while ((n != NULL) && (insert == 0))
  52089. {
  52090. if (n->objid == objid)
  52091. 80302b4: 68a3 ldr r3, [r4, #8]
  52092. 80302b6: 4283 cmp r3, r0
  52093. 80302b8: d102 bne.n 80302c0 <snmp_mib_node_insert+0x28>
  52094. {
  52095. /* node is already there */
  52096. LWIP_DEBUGF(SNMP_MIB_DEBUG,("node already there objid==%"S32_F"\n",objid));
  52097. *insn = n;
  52098. 80302ba: 6034 str r4, [r6, #0]
  52099. insert = 2;
  52100. 80302bc: 2302 movs r3, #2
  52101. 80302be: e023 b.n 8030308 <snmp_mib_node_insert+0x70>
  52102. }
  52103. else if (n->objid < objid)
  52104. 80302c0: da0a bge.n 80302d8 <snmp_mib_node_insert+0x40>
  52105. {
  52106. if (n->next == NULL)
  52107. 80302c2: 6867 ldr r7, [r4, #4]
  52108. 80302c4: 2f00 cmp r7, #0
  52109. 80302c6: d1f4 bne.n 80302b2 <snmp_mib_node_insert+0x1a>
  52110. {
  52111. /* alloc and insert at the tail */
  52112. LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins tail objid==%"S32_F"\n",objid));
  52113. nn = snmp_mib_ln_alloc(objid);
  52114. 80302c8: f7ff ffb4 bl 8030234 <snmp_mib_ln_alloc>
  52115. if (nn != NULL)
  52116. 80302cc: b1d8 cbz r0, 8030306 <snmp_mib_node_insert+0x6e>
  52117. {
  52118. nn->next = NULL;
  52119. nn->prev = n;
  52120. 80302ce: e880 0090 stmia.w r0, {r4, r7}
  52121. n->next = nn;
  52122. 80302d2: 6060 str r0, [r4, #4]
  52123. rn->tail = nn;
  52124. 80302d4: 61a8 str r0, [r5, #24]
  52125. 80302d6: e00b b.n 80302f0 <snmp_mib_node_insert+0x58>
  52126. else
  52127. {
  52128. /* n->objid > objid */
  52129. /* alloc and insert between n->prev and n */
  52130. LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins n->prev, objid==%"S32_F", n\n",objid));
  52131. nn = snmp_mib_ln_alloc(objid);
  52132. 80302d8: f7ff ffac bl 8030234 <snmp_mib_ln_alloc>
  52133. if (nn != NULL)
  52134. 80302dc: b198 cbz r0, 8030306 <snmp_mib_node_insert+0x6e>
  52135. {
  52136. if (n->prev == NULL)
  52137. 80302de: 6822 ldr r2, [r4, #0]
  52138. {
  52139. /* insert at the head */
  52140. nn->next = n;
  52141. nn->prev = NULL;
  52142. 80302e0: e880 0014 stmia.w r0, {r2, r4}
  52143. /* alloc and insert between n->prev and n */
  52144. LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins n->prev, objid==%"S32_F", n\n",objid));
  52145. nn = snmp_mib_ln_alloc(objid);
  52146. if (nn != NULL)
  52147. {
  52148. if (n->prev == NULL)
  52149. 80302e4: b90a cbnz r2, 80302ea <snmp_mib_node_insert+0x52>
  52150. {
  52151. /* insert at the head */
  52152. nn->next = n;
  52153. nn->prev = NULL;
  52154. rn->head = nn;
  52155. 80302e6: 6168 str r0, [r5, #20]
  52156. 80302e8: e001 b.n 80302ee <snmp_mib_node_insert+0x56>
  52157. else
  52158. {
  52159. /* insert in the middle */
  52160. nn->next = n;
  52161. nn->prev = n->prev;
  52162. n->prev->next = nn;
  52163. 80302ea: 6822 ldr r2, [r4, #0]
  52164. 80302ec: 6050 str r0, [r2, #4]
  52165. n->prev = nn;
  52166. 80302ee: 6020 str r0, [r4, #0]
  52167. }
  52168. *insn = nn;
  52169. 80302f0: 6030 str r0, [r6, #0]
  52170. insert = 1;
  52171. 80302f2: 2301 movs r3, #1
  52172. 80302f4: e008 b.n 8030308 <snmp_mib_node_insert+0x70>
  52173. }
  52174. }
  52175. }
  52176. if (insert == 1)
  52177. {
  52178. rn->count += 1;
  52179. 80302f6: 8bab ldrh r3, [r5, #28]
  52180. 80302f8: 3301 adds r3, #1
  52181. 80302fa: 83ab strh r3, [r5, #28]
  52182. 80302fc: 2301 movs r3, #1
  52183. 80302fe: e000 b.n 8030302 <snmp_mib_node_insert+0x6a>
  52184. *insn = nn;
  52185. insert = 1;
  52186. }
  52187. else
  52188. {
  52189. insert = -1;
  52190. 8030300: 23ff movs r3, #255 ; 0xff
  52191. if (insert == 1)
  52192. {
  52193. rn->count += 1;
  52194. }
  52195. LWIP_ASSERT("insert != 0",insert != 0);
  52196. return insert;
  52197. 8030302: b258 sxtb r0, r3
  52198. 8030304: bdf8 pop {r3, r4, r5, r6, r7, pc}
  52199. insert = 1;
  52200. }
  52201. else
  52202. {
  52203. /* insertion failure */
  52204. insert = -1;
  52205. 8030306: 23ff movs r3, #255 ; 0xff
  52206. }
  52207. }
  52208. }
  52209. }
  52210. if (insert == 1)
  52211. 8030308: 2b01 cmp r3, #1
  52212. 803030a: d1fa bne.n 8030302 <snmp_mib_node_insert+0x6a>
  52213. 803030c: e7f3 b.n 80302f6 <snmp_mib_node_insert+0x5e>
  52214. 0803030e <snmp_mib_node_find>:
  52215. {
  52216. s8_t fc;
  52217. struct mib_list_node *n;
  52218. LWIP_ASSERT("rn != NULL",rn != NULL);
  52219. n = rn->head;
  52220. 803030e: 6943 ldr r3, [r0, #20]
  52221. while ((n != NULL) && (n->objid != objid))
  52222. 8030310: e000 b.n 8030314 <snmp_mib_node_find+0x6>
  52223. {
  52224. n = n->next;
  52225. 8030312: 685b ldr r3, [r3, #4]
  52226. s8_t fc;
  52227. struct mib_list_node *n;
  52228. LWIP_ASSERT("rn != NULL",rn != NULL);
  52229. n = rn->head;
  52230. while ((n != NULL) && (n->objid != objid))
  52231. 8030314: b16b cbz r3, 8030332 <snmp_mib_node_find+0x24>
  52232. 8030316: 6898 ldr r0, [r3, #8]
  52233. 8030318: 4288 cmp r0, r1
  52234. 803031a: d1fa bne.n 8030312 <snmp_mib_node_find+0x4>
  52235. }
  52236. if (n == NULL)
  52237. {
  52238. fc = 0;
  52239. }
  52240. else if (n->nptr == NULL)
  52241. 803031c: 68d9 ldr r1, [r3, #12]
  52242. 803031e: b161 cbz r1, 803033a <snmp_mib_node_find+0x2c>
  52243. }
  52244. else
  52245. {
  52246. struct mib_list_rootnode *r;
  52247. if (n->nptr->node_type == MIB_NODE_LR)
  52248. 8030320: 7c08 ldrb r0, [r1, #16]
  52249. 8030322: 2804 cmp r0, #4
  52250. 8030324: d107 bne.n 8030336 <snmp_mib_node_find+0x28>
  52251. {
  52252. r = (struct mib_list_rootnode *)n->nptr;
  52253. if (r->count > 1)
  52254. 8030326: 8b88 ldrh r0, [r1, #28]
  52255. {
  52256. /* can't delete node */
  52257. fc = 2;
  52258. 8030328: 2801 cmp r0, #1
  52259. 803032a: bf94 ite ls
  52260. 803032c: 2001 movls r0, #1
  52261. 803032e: 2002 movhi r0, #2
  52262. 8030330: e004 b.n 803033c <snmp_mib_node_find+0x2e>
  52263. {
  52264. n = n->next;
  52265. }
  52266. if (n == NULL)
  52267. {
  52268. fc = 0;
  52269. 8030332: 4618 mov r0, r3
  52270. 8030334: e002 b.n 803033c <snmp_mib_node_find+0x2e>
  52271. }
  52272. }
  52273. else
  52274. {
  52275. /* other node type */
  52276. fc = 3;
  52277. 8030336: 2003 movs r0, #3
  52278. 8030338: e000 b.n 803033c <snmp_mib_node_find+0x2e>
  52279. fc = 0;
  52280. }
  52281. else if (n->nptr == NULL)
  52282. {
  52283. /* leaf, can delete node */
  52284. fc = 1;
  52285. 803033a: 2001 movs r0, #1
  52286. {
  52287. /* other node type */
  52288. fc = 3;
  52289. }
  52290. }
  52291. *fn = n;
  52292. 803033c: 6013 str r3, [r2, #0]
  52293. return fc;
  52294. }
  52295. 803033e: b240 sxtb r0, r0
  52296. 8030340: 4770 bx lr
  52297. 08030342 <snmp_mib_node_delete>:
  52298. * @param n points to the node to delete
  52299. * @return the nptr to be freed by caller
  52300. */
  52301. struct mib_list_rootnode *
  52302. snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n)
  52303. {
  52304. 8030342: b538 push {r3, r4, r5, lr}
  52305. LWIP_ASSERT("rn != NULL",rn != NULL);
  52306. LWIP_ASSERT("n != NULL",n != NULL);
  52307. /* caller must remove this sub-tree */
  52308. next = (struct mib_list_rootnode*)(n->nptr);
  52309. rn->count -= 1;
  52310. 8030344: 8b83 ldrh r3, [r0, #28]
  52311. LWIP_ASSERT("rn != NULL",rn != NULL);
  52312. LWIP_ASSERT("n != NULL",n != NULL);
  52313. /* caller must remove this sub-tree */
  52314. next = (struct mib_list_rootnode*)(n->nptr);
  52315. 8030346: 68cd ldr r5, [r1, #12]
  52316. rn->count -= 1;
  52317. 8030348: 3b01 subs r3, #1
  52318. 803034a: 8383 strh r3, [r0, #28]
  52319. if (n == rn->head)
  52320. 803034c: 6943 ldr r3, [r0, #20]
  52321. 803034e: 4299 cmp r1, r3
  52322. * @param n points to the node to delete
  52323. * @return the nptr to be freed by caller
  52324. */
  52325. struct mib_list_rootnode *
  52326. snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n)
  52327. {
  52328. 8030350: 4604 mov r4, r0
  52329. /* caller must remove this sub-tree */
  52330. next = (struct mib_list_rootnode*)(n->nptr);
  52331. rn->count -= 1;
  52332. if (n == rn->head)
  52333. 8030352: d105 bne.n 8030360 <snmp_mib_node_delete+0x1e>
  52334. {
  52335. rn->head = n->next;
  52336. 8030354: 684b ldr r3, [r1, #4]
  52337. 8030356: 6143 str r3, [r0, #20]
  52338. if (n->next != NULL)
  52339. 8030358: b17b cbz r3, 803037a <snmp_mib_node_delete+0x38>
  52340. {
  52341. /* not last node, new list begin */
  52342. n->next->prev = NULL;
  52343. 803035a: 2200 movs r2, #0
  52344. 803035c: 601a str r2, [r3, #0]
  52345. 803035e: e00c b.n 803037a <snmp_mib_node_delete+0x38>
  52346. }
  52347. }
  52348. else if (n == rn->tail)
  52349. 8030360: 6983 ldr r3, [r0, #24]
  52350. 8030362: 4299 cmp r1, r3
  52351. 8030364: 680b ldr r3, [r1, #0]
  52352. 8030366: d104 bne.n 8030372 <snmp_mib_node_delete+0x30>
  52353. {
  52354. rn->tail = n->prev;
  52355. 8030368: 6183 str r3, [r0, #24]
  52356. if (n->prev != NULL)
  52357. 803036a: b133 cbz r3, 803037a <snmp_mib_node_delete+0x38>
  52358. {
  52359. /* not last node, new list end */
  52360. n->prev->next = NULL;
  52361. 803036c: 2200 movs r2, #0
  52362. 803036e: 605a str r2, [r3, #4]
  52363. 8030370: e003 b.n 803037a <snmp_mib_node_delete+0x38>
  52364. }
  52365. }
  52366. else
  52367. {
  52368. /* node must be in the middle */
  52369. n->prev->next = n->next;
  52370. 8030372: 684a ldr r2, [r1, #4]
  52371. 8030374: 605a str r2, [r3, #4]
  52372. n->next->prev = n->prev;
  52373. 8030376: 684a ldr r2, [r1, #4]
  52374. 8030378: 6013 str r3, [r2, #0]
  52375. }
  52376. LWIP_DEBUGF(SNMP_MIB_DEBUG,("free list objid==%"S32_F"\n",n->objid));
  52377. snmp_mib_ln_free(n);
  52378. 803037a: 4608 mov r0, r1
  52379. 803037c: f7ff ff66 bl 803024c <snmp_mib_ln_free>
  52380. if (rn->count == 0)
  52381. 8030380: 8ba3 ldrh r3, [r4, #28]
  52382. 8030382: b90b cbnz r3, 8030388 <snmp_mib_node_delete+0x46>
  52383. {
  52384. rn->head = NULL;
  52385. 8030384: 6163 str r3, [r4, #20]
  52386. rn->tail = NULL;
  52387. 8030386: 61a3 str r3, [r4, #24]
  52388. }
  52389. return next;
  52390. }
  52391. 8030388: 4628 mov r0, r5
  52392. 803038a: bd38 pop {r3, r4, r5, pc}
  52393. 0803038c <snmp_search_tree>:
  52394. * @param np points to the found object instance (return)
  52395. * @return pointer to the requested parent (!) node if success, NULL otherwise
  52396. */
  52397. struct mib_node *
  52398. snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np)
  52399. {
  52400. 803038c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  52401. 8030390: 4604 mov r4, r0
  52402. 8030392: b085 sub sp, #20
  52403. 8030394: 460d mov r5, r1
  52404. 8030396: 461e mov r6, r3
  52405. * @param ident points to the array of sub identifiers
  52406. * @param np points to the found object instance (return)
  52407. * @return pointer to the requested parent (!) node if success, NULL otherwise
  52408. */
  52409. struct mib_node *
  52410. snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np)
  52411. 8030398: f102 0804 add.w r8, r2, #4
  52412. {
  52413. u8_t node_type, ext_level;
  52414. ext_level = 0;
  52415. 803039c: f04f 0b00 mov.w fp, #0
  52416. LWIP_DEBUGF(SNMP_MIB_DEBUG,("node==%p *ident==%"S32_F"\n",(void*)node,*ident));
  52417. while (node != NULL)
  52418. 80303a0: e068 b.n 8030474 <snmp_search_tree+0xe8>
  52419. {
  52420. node_type = node->node_type;
  52421. 80303a2: 7c23 ldrb r3, [r4, #16]
  52422. if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
  52423. 80303a4: 1e9a subs r2, r3, #2
  52424. 80303a6: 2a01 cmp r2, #1
  52425. 80303a8: d812 bhi.n 80303d0 <snmp_search_tree+0x44>
  52426. {
  52427. struct mib_array_node *an;
  52428. u16_t i;
  52429. if (ident_len > 0)
  52430. 80303aa: b90d cbnz r5, 80303b0 <snmp_search_tree+0x24>
  52431. }
  52432. else
  52433. {
  52434. /* search failed, short object identifier (nosuchname) */
  52435. LWIP_DEBUGF(SNMP_MIB_DEBUG,("an search failed, short object identifier\n"));
  52436. return NULL;
  52437. 80303ac: 2000 movs r0, #0
  52438. 80303ae: e06a b.n 8030486 <snmp_search_tree+0xfa>
  52439. if (ident_len > 0)
  52440. {
  52441. /* array node (internal ROM or RAM, fixed length) */
  52442. an = (struct mib_array_node *)node;
  52443. i = 0;
  52444. while ((i < an->maxlength) && (an->objid[i] != *ident))
  52445. 80303b0: 8a67 ldrh r7, [r4, #18]
  52446. 80303b2: 2300 movs r3, #0
  52447. 80303b4: b29a uxth r2, r3
  52448. 80303b6: 42ba cmp r2, r7
  52449. 80303b8: d2f8 bcs.n 80303ac <snmp_search_tree+0x20>
  52450. 80303ba: 009a lsls r2, r3, #2
  52451. 80303bc: 6961 ldr r1, [r4, #20]
  52452. 80303be: 5888 ldr r0, [r1, r2]
  52453. 80303c0: f858 1c04 ldr.w r1, [r8, #-4]
  52454. 80303c4: 3301 adds r3, #1
  52455. 80303c6: 4288 cmp r0, r1
  52456. 80303c8: d1f4 bne.n 80303b4 <snmp_search_tree+0x28>
  52457. }
  52458. if (i < an->maxlength)
  52459. {
  52460. /* found it, if available proceed to child, otherwise inspect leaf */
  52461. LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident));
  52462. if (an->nptr[i] == NULL)
  52463. 80303ca: 69a3 ldr r3, [r4, #24]
  52464. 80303cc: 589b ldr r3, [r3, r2]
  52465. 80303ce: e057 b.n 8030480 <snmp_search_tree+0xf4>
  52466. /* search failed, short object identifier (nosuchname) */
  52467. LWIP_DEBUGF(SNMP_MIB_DEBUG,("an search failed, short object identifier\n"));
  52468. return NULL;
  52469. }
  52470. }
  52471. else if(node_type == MIB_NODE_LR)
  52472. 80303d0: 2b04 cmp r3, #4
  52473. 80303d2: d10c bne.n 80303ee <snmp_search_tree+0x62>
  52474. {
  52475. struct mib_list_rootnode *lrn;
  52476. struct mib_list_node *ln;
  52477. if (ident_len > 0)
  52478. 80303d4: 2d00 cmp r5, #0
  52479. 80303d6: d0e9 beq.n 80303ac <snmp_search_tree+0x20>
  52480. {
  52481. /* list root node (internal 'RAM', variable length) */
  52482. lrn = (struct mib_list_rootnode *)node;
  52483. ln = lrn->head;
  52484. 80303d8: 6963 ldr r3, [r4, #20]
  52485. /* iterate over list, head to tail */
  52486. while ((ln != NULL) && (ln->objid != *ident))
  52487. 80303da: e000 b.n 80303de <snmp_search_tree+0x52>
  52488. {
  52489. ln = ln->next;
  52490. 80303dc: 685b ldr r3, [r3, #4]
  52491. {
  52492. /* list root node (internal 'RAM', variable length) */
  52493. lrn = (struct mib_list_rootnode *)node;
  52494. ln = lrn->head;
  52495. /* iterate over list, head to tail */
  52496. while ((ln != NULL) && (ln->objid != *ident))
  52497. 80303de: 2b00 cmp r3, #0
  52498. 80303e0: d0e4 beq.n 80303ac <snmp_search_tree+0x20>
  52499. 80303e2: 6899 ldr r1, [r3, #8]
  52500. 80303e4: f858 2c04 ldr.w r2, [r8, #-4]
  52501. 80303e8: 4291 cmp r1, r2
  52502. 80303ea: d1f7 bne.n 80303dc <snmp_search_tree+0x50>
  52503. 80303ec: e047 b.n 803047e <snmp_search_tree+0xf2>
  52504. /* search failed, short object identifier (nosuchname) */
  52505. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln search failed, short object identifier\n"));
  52506. return NULL;
  52507. }
  52508. }
  52509. else if(node_type == MIB_NODE_EX)
  52510. 80303ee: 2b05 cmp r3, #5
  52511. 80303f0: d12e bne.n 8030450 <snmp_search_tree+0xc4>
  52512. {
  52513. struct mib_external_node *en;
  52514. u16_t i, len;
  52515. if (ident_len > 0)
  52516. 80303f2: 2d00 cmp r5, #0
  52517. 80303f4: d0da beq.n 80303ac <snmp_search_tree+0x20>
  52518. {
  52519. /* external node (addressing and access via functions) */
  52520. en = (struct mib_external_node *)node;
  52521. i = 0;
  52522. len = en->level_length(en->addr_inf,ext_level);
  52523. 80303f6: 69e3 ldr r3, [r4, #28]
  52524. 80303f8: 6960 ldr r0, [r4, #20]
  52525. 80303fa: 4659 mov r1, fp
  52526. 80303fc: 4798 blx r3
  52527. if (ident_len > 0)
  52528. {
  52529. /* external node (addressing and access via functions) */
  52530. en = (struct mib_external_node *)node;
  52531. i = 0;
  52532. 80303fe: f04f 0900 mov.w r9, #0
  52533. len = en->level_length(en->addr_inf,ext_level);
  52534. 8030402: 4684 mov ip, r0
  52535. while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) != 0))
  52536. 8030404: e003 b.n 803040e <snmp_search_tree+0x82>
  52537. {
  52538. i++;
  52539. 8030406: f109 0901 add.w r9, r9, #1
  52540. 803040a: fa1f f989 uxth.w r9, r9
  52541. /* external node (addressing and access via functions) */
  52542. en = (struct mib_external_node *)node;
  52543. i = 0;
  52544. len = en->level_length(en->addr_inf,ext_level);
  52545. while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) != 0))
  52546. 803040e: 45e1 cmp r9, ip
  52547. 8030410: d0cc beq.n 80303ac <snmp_search_tree+0x20>
  52548. 8030412: 6960 ldr r0, [r4, #20]
  52549. 8030414: f858 3c04 ldr.w r3, [r8, #-4]
  52550. 8030418: 6a27 ldr r7, [r4, #32]
  52551. 803041a: f8cd c004 str.w ip, [sp, #4]
  52552. 803041e: 4659 mov r1, fp
  52553. 8030420: 464a mov r2, r9
  52554. 8030422: 47b8 blx r7
  52555. 8030424: f8dd c004 ldr.w ip, [sp, #4]
  52556. 8030428: 2800 cmp r0, #0
  52557. 803042a: d1ec bne.n 8030406 <snmp_search_tree+0x7a>
  52558. {
  52559. i++;
  52560. }
  52561. if (i < len)
  52562. 803042c: 45e1 cmp r9, ip
  52563. 803042e: d2bd bcs.n 80303ac <snmp_search_tree+0x20>
  52564. {
  52565. s32_t debug_id;
  52566. en->get_objid(en->addr_inf,ext_level,i,&debug_id);
  52567. 8030430: 4659 mov r1, fp
  52568. 8030432: ab03 add r3, sp, #12
  52569. 8030434: 6a67 ldr r7, [r4, #36] ; 0x24
  52570. 8030436: 6960 ldr r0, [r4, #20]
  52571. 8030438: 464a mov r2, r9
  52572. 803043a: 47b8 blx r7
  52573. LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid==%"S32_F" *ident==%"S32_F"\n",debug_id,*ident));
  52574. if ((ext_level + 1) == en->tree_levels)
  52575. 803043c: 7e23 ldrb r3, [r4, #24]
  52576. 803043e: f10b 0b01 add.w fp, fp, #1
  52577. 8030442: 459b cmp fp, r3
  52578. 8030444: d100 bne.n 8030448 <snmp_search_tree+0xbc>
  52579. 8030446: e00b b.n 8030460 <snmp_search_tree+0xd4>
  52580. else
  52581. {
  52582. /* found it, proceed to child */
  52583. ident_len--;
  52584. ident++;
  52585. ext_level++;
  52586. 8030448: fa5f fb8b uxtb.w fp, fp
  52587. 803044c: 4623 mov r3, r4
  52588. 803044e: e00c b.n 803046a <snmp_search_tree+0xde>
  52589. /* search failed, short object identifier (nosuchname) */
  52590. LWIP_DEBUGF(SNMP_MIB_DEBUG,("en search failed, short object identifier\n"));
  52591. return NULL;
  52592. }
  52593. }
  52594. else if (node_type == MIB_NODE_SC)
  52595. 8030450: 2b01 cmp r3, #1
  52596. 8030452: d1ab bne.n 80303ac <snmp_search_tree+0x20>
  52597. {
  52598. mib_scalar_node *sn;
  52599. sn = (mib_scalar_node *)node;
  52600. if ((ident_len == 1) && (*ident == 0))
  52601. 8030454: 2d01 cmp r5, #1
  52602. 8030456: d1a9 bne.n 80303ac <snmp_search_tree+0x20>
  52603. 8030458: f8da 3000 ldr.w r3, [sl]
  52604. 803045c: 2b00 cmp r3, #0
  52605. 803045e: d1a5 bne.n 80303ac <snmp_search_tree+0x20>
  52606. {
  52607. np->ident_len = ident_len;
  52608. 8030460: 7035 strb r5, [r6, #0]
  52609. np->ident = ident;
  52610. 8030462: f8c6 a004 str.w sl, [r6, #4]
  52611. return (struct mib_node*)sn;
  52612. 8030466: 4620 mov r0, r4
  52613. 8030468: e00d b.n 8030486 <snmp_search_tree+0xfa>
  52614. 803046a: 3d01 subs r5, #1
  52615. 803046c: b2ed uxtb r5, r5
  52616. 803046e: f108 0804 add.w r8, r8, #4
  52617. 8030472: 461c mov r4, r3
  52618. * @param ident points to the array of sub identifiers
  52619. * @param np points to the found object instance (return)
  52620. * @return pointer to the requested parent (!) node if success, NULL otherwise
  52621. */
  52622. struct mib_node *
  52623. snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np)
  52624. 8030474: f1a8 0a04 sub.w sl, r8, #4
  52625. {
  52626. u8_t node_type, ext_level;
  52627. ext_level = 0;
  52628. LWIP_DEBUGF(SNMP_MIB_DEBUG,("node==%p *ident==%"S32_F"\n",(void*)node,*ident));
  52629. while (node != NULL)
  52630. 8030478: 2c00 cmp r4, #0
  52631. 803047a: d192 bne.n 80303a2 <snmp_search_tree+0x16>
  52632. 803047c: e796 b.n 80303ac <snmp_search_tree+0x20>
  52633. }
  52634. if (ln != NULL)
  52635. {
  52636. /* found it, proceed to child */;
  52637. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident));
  52638. if (ln->nptr == NULL)
  52639. 803047e: 68db ldr r3, [r3, #12]
  52640. 8030480: 2b00 cmp r3, #0
  52641. 8030482: d1f2 bne.n 803046a <snmp_search_tree+0xde>
  52642. 8030484: e7ec b.n 8030460 <snmp_search_tree+0xd4>
  52643. }
  52644. }
  52645. /* done, found nothing */
  52646. LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node==%p\n",(void*)node));
  52647. return NULL;
  52648. }
  52649. 8030486: b005 add sp, #20
  52650. 8030488: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  52651. 0803048c <snmp_expand_tree>:
  52652. /**
  52653. * Tree expansion.
  52654. */
  52655. struct mib_node *
  52656. snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  52657. {
  52658. 803048c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  52659. 8030490: 461d mov r5, r3
  52660. 8030492: b08b sub sp, #44 ; 0x2c
  52661. u8_t node_type, ext_level, climb_tree;
  52662. ext_level = 0;
  52663. /* reset node stack */
  52664. node_stack_cnt = 0;
  52665. 8030494: 4ba4 ldr r3, [pc, #656] ; (8030728 <snmp_expand_tree+0x29c>)
  52666. 8030496: f04f 0a00 mov.w sl, #0
  52667. j = (u8_t)i + 1;
  52668. if (j < len)
  52669. {
  52670. /* right node is the current external node */
  52671. cur_node.r_ptr = node;
  52672. en->get_objid(en->addr_inf,ext_level,j,&cur_node.r_id);
  52673. 803049a: af08 add r7, sp, #32
  52674. /**
  52675. * Tree expansion.
  52676. */
  52677. struct mib_node *
  52678. snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  52679. {
  52680. 803049c: 4604 mov r4, r0
  52681. 803049e: 460e mov r6, r1
  52682. 80304a0: 4690 mov r8, r2
  52683. u8_t node_type, ext_level, climb_tree;
  52684. ext_level = 0;
  52685. /* reset node stack */
  52686. node_stack_cnt = 0;
  52687. 80304a2: f883 a000 strb.w sl, [r3]
  52688. j = (u8_t)i + 1;
  52689. if (j < len)
  52690. {
  52691. /* right node is the current external node */
  52692. cur_node.r_ptr = node;
  52693. en->get_objid(en->addr_inf,ext_level,j,&cur_node.r_id);
  52694. 80304a6: 9705 str r7, [sp, #20]
  52695. u8_t node_type, ext_level, climb_tree;
  52696. ext_level = 0;
  52697. /* reset node stack */
  52698. node_stack_cnt = 0;
  52699. while (node != NULL)
  52700. 80304a8: e19c b.n 80307e4 <snmp_expand_tree+0x358>
  52701. {
  52702. climb_tree = 0;
  52703. node_type = node->node_type;
  52704. 80304aa: 7c23 ldrb r3, [r4, #16]
  52705. if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
  52706. 80304ac: 1e9a subs r2, r3, #2
  52707. 80304ae: 2a01 cmp r2, #1
  52708. 80304b0: f200 808f bhi.w 80305d2 <snmp_expand_tree+0x146>
  52709. 80304b4: 8a67 ldrh r7, [r4, #18]
  52710. struct mib_array_node *an;
  52711. u16_t i;
  52712. /* array node (internal ROM or RAM, fixed length) */
  52713. an = (struct mib_array_node *)node;
  52714. if (ident_len > 0)
  52715. 80304b6: b90e cbnz r6, 80304bc <snmp_expand_tree+0x30>
  52716. else
  52717. {
  52718. u8_t j;
  52719. /* ident_len == 0, complete with leftmost '.thing' */
  52720. j = 0;
  52721. while ((j < an->maxlength) && empty_table(an->nptr[j]))
  52722. 80304b8: 46b1 mov r9, r6
  52723. 80304ba: e06f b.n 803059c <snmp_expand_tree+0x110>
  52724. /* array node (internal ROM or RAM, fixed length) */
  52725. an = (struct mib_array_node *)node;
  52726. if (ident_len > 0)
  52727. {
  52728. i = 0;
  52729. while ((i < an->maxlength) && (an->objid[i] < *ident))
  52730. 80304bc: f04f 0c00 mov.w ip, #0
  52731. 80304c0: fa1f f28c uxth.w r2, ip
  52732. 80304c4: 42ba cmp r2, r7
  52733. 80304c6: f080 8168 bcs.w 803079a <snmp_expand_tree+0x30e>
  52734. 80304ca: 6963 ldr r3, [r4, #20]
  52735. 80304cc: f853 102c ldr.w r1, [r3, ip, lsl #2]
  52736. 80304d0: f8d8 3000 ldr.w r3, [r8]
  52737. 80304d4: 4299 cmp r1, r3
  52738. 80304d6: ea4f 098c mov.w r9, ip, lsl #2
  52739. 80304da: f10c 0c01 add.w ip, ip, #1
  52740. 80304de: dbef blt.n 80304c0 <snmp_expand_tree+0x34>
  52741. }
  52742. if (i < an->maxlength)
  52743. {
  52744. LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident));
  52745. /* add identifier to oidret */
  52746. oidret->id[oidret->len] = an->objid[i];
  52747. 80304e0: 782b ldrb r3, [r5, #0]
  52748. 80304e2: eb05 0783 add.w r7, r5, r3, lsl #2
  52749. 80304e6: 6079 str r1, [r7, #4]
  52750. (oidret->len)++;
  52751. 80304e8: 1c59 adds r1, r3, #1
  52752. 80304ea: 7029 strb r1, [r5, #0]
  52753. if (an->nptr[i] == NULL)
  52754. 80304ec: f8d4 b018 ldr.w fp, [r4, #24]
  52755. 80304f0: f85b 0009 ldr.w r0, [fp, r9]
  52756. 80304f4: b998 cbnz r0, 803051e <snmp_expand_tree+0x92>
  52757. {
  52758. LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n"));
  52759. /* leaf node (e.g. in a fixed size table) */
  52760. if (an->objid[i] > *ident)
  52761. 80304f6: 6960 ldr r0, [r4, #20]
  52762. 80304f8: f850 6009 ldr.w r6, [r0, r9]
  52763. 80304fc: f8d8 0000 ldr.w r0, [r8]
  52764. 8030500: 4286 cmp r6, r0
  52765. 8030502: f300 8173 bgt.w 80307ec <snmp_expand_tree+0x360>
  52766. {
  52767. return (struct mib_node*)an;
  52768. }
  52769. else if ((i + 1) < an->maxlength)
  52770. 8030506: 8a60 ldrh r0, [r4, #18]
  52771. {
  52772. /* an->objid[i] == *ident */
  52773. (oidret->len)--;
  52774. 8030508: 702b strb r3, [r5, #0]
  52775. /* leaf node (e.g. in a fixed size table) */
  52776. if (an->objid[i] > *ident)
  52777. {
  52778. return (struct mib_node*)an;
  52779. }
  52780. else if ((i + 1) < an->maxlength)
  52781. 803050a: 3201 adds r2, #1
  52782. 803050c: 4282 cmp r2, r0
  52783. 803050e: f280 8144 bge.w 803079a <snmp_expand_tree+0x30e>
  52784. {
  52785. /* an->objid[i] == *ident */
  52786. (oidret->len)--;
  52787. oidret->id[oidret->len] = an->objid[i + 1];
  52788. 8030512: 6963 ldr r3, [r4, #20]
  52789. 8030514: f853 302c ldr.w r3, [r3, ip, lsl #2]
  52790. (oidret->len)++;
  52791. 8030518: 7029 strb r1, [r5, #0]
  52792. }
  52793. else if ((i + 1) < an->maxlength)
  52794. {
  52795. /* an->objid[i] == *ident */
  52796. (oidret->len)--;
  52797. oidret->id[oidret->len] = an->objid[i + 1];
  52798. 803051a: 607b str r3, [r7, #4]
  52799. 803051c: e166 b.n 80307ec <snmp_expand_tree+0x360>
  52800. struct nse cur_node;
  52801. LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
  52802. /* non-leaf, store right child ptr and id */
  52803. LWIP_ASSERT("i < 0xff", i < 0xff);
  52804. j = (u8_t)i + 1;
  52805. 803051e: 3201 adds r2, #1
  52806. while ((j < an->maxlength) && (empty_table(an->nptr[j])))
  52807. 8030520: 8a61 ldrh r1, [r4, #18]
  52808. struct nse cur_node;
  52809. LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
  52810. /* non-leaf, store right child ptr and id */
  52811. LWIP_ASSERT("i < 0xff", i < 0xff);
  52812. j = (u8_t)i + 1;
  52813. 8030522: fa5f fc82 uxtb.w ip, r2
  52814. while ((j < an->maxlength) && (empty_table(an->nptr[j])))
  52815. 8030526: 2700 movs r7, #0
  52816. /**
  52817. * Tree expansion.
  52818. */
  52819. struct mib_node *
  52820. snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  52821. 8030528: eb0c 0307 add.w r3, ip, r7
  52822. 803052c: b2db uxtb r3, r3
  52823. LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
  52824. /* non-leaf, store right child ptr and id */
  52825. LWIP_ASSERT("i < 0xff", i < 0xff);
  52826. j = (u8_t)i + 1;
  52827. while ((j < an->maxlength) && (empty_table(an->nptr[j])))
  52828. 803052e: 428b cmp r3, r1
  52829. 8030530: d21a bcs.n 8030568 <snmp_expand_tree+0xdc>
  52830. 8030532: b21b sxth r3, r3
  52831. 8030534: 009a lsls r2, r3, #2
  52832. 8030536: f85b 3023 ldr.w r3, [fp, r3, lsl #2]
  52833. 803053a: 9104 str r1, [sp, #16]
  52834. 803053c: 4618 mov r0, r3
  52835. 803053e: 9203 str r2, [sp, #12]
  52836. 8030540: 9302 str r3, [sp, #8]
  52837. 8030542: f8cd c004 str.w ip, [sp, #4]
  52838. 8030546: f7ff fe23 bl 8030190 <empty_table>
  52839. 803054a: 3701 adds r7, #1
  52840. 803054c: 9904 ldr r1, [sp, #16]
  52841. 803054e: 9a03 ldr r2, [sp, #12]
  52842. 8030550: 9b02 ldr r3, [sp, #8]
  52843. 8030552: f8dd c004 ldr.w ip, [sp, #4]
  52844. 8030556: 2800 cmp r0, #0
  52845. 8030558: d1e6 bne.n 8030528 <snmp_expand_tree+0x9c>
  52846. {
  52847. j++;
  52848. }
  52849. if (j < an->maxlength)
  52850. {
  52851. cur_node.r_ptr = an->nptr[j];
  52852. 803055a: 9307 str r3, [sp, #28]
  52853. cur_node.r_id = an->objid[j];
  52854. 803055c: 6963 ldr r3, [r4, #20]
  52855. 803055e: 589b ldr r3, [r3, r2]
  52856. cur_node.r_nl = 0;
  52857. 8030560: f88d 0024 strb.w r0, [sp, #36] ; 0x24
  52858. j++;
  52859. }
  52860. if (j < an->maxlength)
  52861. {
  52862. cur_node.r_ptr = an->nptr[j];
  52863. cur_node.r_id = an->objid[j];
  52864. 8030564: 9308 str r3, [sp, #32]
  52865. 8030566: e001 b.n 803056c <snmp_expand_tree+0xe0>
  52866. cur_node.r_nl = 0;
  52867. }
  52868. else
  52869. {
  52870. cur_node.r_ptr = NULL;
  52871. 8030568: 2300 movs r3, #0
  52872. 803056a: 9307 str r3, [sp, #28]
  52873. }
  52874. push_node(&cur_node);
  52875. 803056c: a807 add r0, sp, #28
  52876. 803056e: f7ff fdfb bl 8030168 <push_node>
  52877. if (an->objid[i] == *ident)
  52878. 8030572: 6963 ldr r3, [r4, #20]
  52879. 8030574: f853 2009 ldr.w r2, [r3, r9]
  52880. 8030578: f8d8 3000 ldr.w r3, [r8]
  52881. 803057c: 429a cmp r2, r3
  52882. 803057e: d104 bne.n 803058a <snmp_expand_tree+0xfe>
  52883. {
  52884. ident_len--;
  52885. 8030580: 3e01 subs r6, #1
  52886. 8030582: b2f6 uxtb r6, r6
  52887. ident++;
  52888. 8030584: f108 0804 add.w r8, r8, #4
  52889. 8030588: e000 b.n 803058c <snmp_expand_tree+0x100>
  52890. }
  52891. else
  52892. {
  52893. /* an->objid[i] < *ident */
  52894. ident_len = 0;
  52895. 803058a: 2600 movs r6, #0
  52896. }
  52897. /* follow next child pointer */
  52898. node = an->nptr[i];
  52899. 803058c: 69a3 ldr r3, [r4, #24]
  52900. 803058e: f853 3009 ldr.w r3, [r3, r9]
  52901. 8030592: e140 b.n 8030816 <snmp_expand_tree+0x38a>
  52902. u8_t j;
  52903. /* ident_len == 0, complete with leftmost '.thing' */
  52904. j = 0;
  52905. while ((j < an->maxlength) && empty_table(an->nptr[j]))
  52906. {
  52907. j++;
  52908. 8030594: f109 0901 add.w r9, r9, #1
  52909. 8030598: fa5f f989 uxtb.w r9, r9
  52910. else
  52911. {
  52912. u8_t j;
  52913. /* ident_len == 0, complete with leftmost '.thing' */
  52914. j = 0;
  52915. while ((j < an->maxlength) && empty_table(an->nptr[j]))
  52916. 803059c: 45b9 cmp r9, r7
  52917. 803059e: f080 80fc bcs.w 803079a <snmp_expand_tree+0x30e>
  52918. 80305a2: fa0f f289 sxth.w r2, r9
  52919. 80305a6: 69a3 ldr r3, [r4, #24]
  52920. 80305a8: f853 0022 ldr.w r0, [r3, r2, lsl #2]
  52921. 80305ac: ea4f 0b82 mov.w fp, r2, lsl #2
  52922. 80305b0: f7ff fdee bl 8030190 <empty_table>
  52923. 80305b4: 2800 cmp r0, #0
  52924. 80305b6: d1ed bne.n 8030594 <snmp_expand_tree+0x108>
  52925. j++;
  52926. }
  52927. if (j < an->maxlength)
  52928. {
  52929. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left an->objid[j]==%"S32_F"\n",an->objid[j]));
  52930. oidret->id[oidret->len] = an->objid[j];
  52931. 80305b8: 6962 ldr r2, [r4, #20]
  52932. 80305ba: 782b ldrb r3, [r5, #0]
  52933. 80305bc: f852 100b ldr.w r1, [r2, fp]
  52934. 80305c0: eb05 0283 add.w r2, r5, r3, lsl #2
  52935. (oidret->len)++;
  52936. 80305c4: 3301 adds r3, #1
  52937. 80305c6: 702b strb r3, [r5, #0]
  52938. if (an->nptr[j] == NULL)
  52939. 80305c8: 69a3 ldr r3, [r4, #24]
  52940. j++;
  52941. }
  52942. if (j < an->maxlength)
  52943. {
  52944. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left an->objid[j]==%"S32_F"\n",an->objid[j]));
  52945. oidret->id[oidret->len] = an->objid[j];
  52946. 80305ca: 6051 str r1, [r2, #4]
  52947. (oidret->len)++;
  52948. if (an->nptr[j] == NULL)
  52949. 80305cc: f853 300b ldr.w r3, [r3, fp]
  52950. 80305d0: e11f b.n 8030812 <snmp_expand_tree+0x386>
  52951. /* j == an->maxlength */
  52952. climb_tree = 1;
  52953. }
  52954. }
  52955. }
  52956. else if(node_type == MIB_NODE_LR)
  52957. 80305d2: 2b04 cmp r3, #4
  52958. 80305d4: d14c bne.n 8030670 <snmp_expand_tree+0x1e4>
  52959. 80305d6: 6967 ldr r7, [r4, #20]
  52960. struct mib_list_rootnode *lrn;
  52961. struct mib_list_node *ln;
  52962. /* list root node (internal 'RAM', variable length) */
  52963. lrn = (struct mib_list_rootnode *)node;
  52964. if (ident_len > 0)
  52965. 80305d8: 2e00 cmp r6, #0
  52966. 80305da: d040 beq.n 803065e <snmp_expand_tree+0x1d2>
  52967. {
  52968. ln = lrn->head;
  52969. /* iterate over list, head to tail */
  52970. while ((ln != NULL) && (ln->objid < *ident))
  52971. 80305dc: e000 b.n 80305e0 <snmp_expand_tree+0x154>
  52972. {
  52973. ln = ln->next;
  52974. 80305de: 687f ldr r7, [r7, #4]
  52975. lrn = (struct mib_list_rootnode *)node;
  52976. if (ident_len > 0)
  52977. {
  52978. ln = lrn->head;
  52979. /* iterate over list, head to tail */
  52980. while ((ln != NULL) && (ln->objid < *ident))
  52981. 80305e0: 2f00 cmp r7, #0
  52982. 80305e2: f000 80da beq.w 803079a <snmp_expand_tree+0x30e>
  52983. 80305e6: 68ba ldr r2, [r7, #8]
  52984. 80305e8: f8d8 3000 ldr.w r3, [r8]
  52985. 80305ec: 429a cmp r2, r3
  52986. 80305ee: dbf6 blt.n 80305de <snmp_expand_tree+0x152>
  52987. ln = ln->next;
  52988. }
  52989. if (ln != NULL)
  52990. {
  52991. LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident));
  52992. oidret->id[oidret->len] = ln->objid;
  52993. 80305f0: 782b ldrb r3, [r5, #0]
  52994. 80305f2: eb05 0183 add.w r1, r5, r3, lsl #2
  52995. 80305f6: 604a str r2, [r1, #4]
  52996. (oidret->len)++;
  52997. 80305f8: 1c5a adds r2, r3, #1
  52998. 80305fa: 702a strb r2, [r5, #0]
  52999. if (ln->nptr == NULL)
  53000. 80305fc: 68f8 ldr r0, [r7, #12]
  53001. 80305fe: b978 cbnz r0, 8030620 <snmp_expand_tree+0x194>
  53002. {
  53003. /* leaf node */
  53004. if (ln->objid > *ident)
  53005. 8030600: 68b8 ldr r0, [r7, #8]
  53006. 8030602: f8d8 6000 ldr.w r6, [r8]
  53007. 8030606: 42b0 cmp r0, r6
  53008. 8030608: f300 80f0 bgt.w 80307ec <snmp_expand_tree+0x360>
  53009. {
  53010. return (struct mib_node*)lrn;
  53011. }
  53012. else if (ln->next != NULL)
  53013. 803060c: 6878 ldr r0, [r7, #4]
  53014. {
  53015. /* ln->objid == *ident */
  53016. (oidret->len)--;
  53017. 803060e: 702b strb r3, [r5, #0]
  53018. /* leaf node */
  53019. if (ln->objid > *ident)
  53020. {
  53021. return (struct mib_node*)lrn;
  53022. }
  53023. else if (ln->next != NULL)
  53024. 8030610: 2800 cmp r0, #0
  53025. 8030612: f000 80c2 beq.w 803079a <snmp_expand_tree+0x30e>
  53026. {
  53027. /* ln->objid == *ident */
  53028. (oidret->len)--;
  53029. oidret->id[oidret->len] = ln->next->objid;
  53030. 8030616: 687b ldr r3, [r7, #4]
  53031. 8030618: 689b ldr r3, [r3, #8]
  53032. (oidret->len)++;
  53033. 803061a: 702a strb r2, [r5, #0]
  53034. }
  53035. else if (ln->next != NULL)
  53036. {
  53037. /* ln->objid == *ident */
  53038. (oidret->len)--;
  53039. oidret->id[oidret->len] = ln->next->objid;
  53040. 803061c: 604b str r3, [r1, #4]
  53041. 803061e: e0e5 b.n 80307ec <snmp_expand_tree+0x360>
  53042. {
  53043. struct mib_list_node *jn;
  53044. struct nse cur_node;
  53045. /* non-leaf, store right child ptr and id */
  53046. jn = ln->next;
  53047. 8030620: 687c ldr r4, [r7, #4]
  53048. while ((jn != NULL) && empty_table(jn->nptr))
  53049. 8030622: e000 b.n 8030626 <snmp_expand_tree+0x19a>
  53050. {
  53051. jn = jn->next;
  53052. 8030624: 6864 ldr r4, [r4, #4]
  53053. struct mib_list_node *jn;
  53054. struct nse cur_node;
  53055. /* non-leaf, store right child ptr and id */
  53056. jn = ln->next;
  53057. while ((jn != NULL) && empty_table(jn->nptr))
  53058. 8030626: 2c00 cmp r4, #0
  53059. 8030628: f000 80e9 beq.w 80307fe <snmp_expand_tree+0x372>
  53060. 803062c: f8d4 900c ldr.w r9, [r4, #12]
  53061. 8030630: 4648 mov r0, r9
  53062. 8030632: f7ff fdad bl 8030190 <empty_table>
  53063. 8030636: 2800 cmp r0, #0
  53064. 8030638: d1f4 bne.n 8030624 <snmp_expand_tree+0x198>
  53065. 803063a: e0d9 b.n 80307f0 <snmp_expand_tree+0x364>
  53066. }
  53067. else
  53068. {
  53069. cur_node.r_ptr = NULL;
  53070. }
  53071. push_node(&cur_node);
  53072. 803063c: a807 add r0, sp, #28
  53073. 803063e: f7ff fd93 bl 8030168 <push_node>
  53074. if (ln->objid == *ident)
  53075. 8030642: 68ba ldr r2, [r7, #8]
  53076. 8030644: f8d8 3000 ldr.w r3, [r8]
  53077. 8030648: 429a cmp r2, r3
  53078. 803064a: d104 bne.n 8030656 <snmp_expand_tree+0x1ca>
  53079. {
  53080. ident_len--;
  53081. 803064c: 3e01 subs r6, #1
  53082. 803064e: b2f6 uxtb r6, r6
  53083. ident++;
  53084. 8030650: f108 0804 add.w r8, r8, #4
  53085. 8030654: e000 b.n 8030658 <snmp_expand_tree+0x1cc>
  53086. }
  53087. else
  53088. {
  53089. /* ln->objid < *ident */
  53090. ident_len = 0;
  53091. 8030656: 2600 movs r6, #0
  53092. }
  53093. /* follow next child pointer */
  53094. node = ln->nptr;
  53095. 8030658: 68fb ldr r3, [r7, #12]
  53096. 803065a: e0dc b.n 8030816 <snmp_expand_tree+0x38a>
  53097. struct mib_list_node *jn;
  53098. /* ident_len == 0, complete with leftmost '.thing' */
  53099. jn = lrn->head;
  53100. while ((jn != NULL) && empty_table(jn->nptr))
  53101. {
  53102. jn = jn->next;
  53103. 803065c: 687f ldr r7, [r7, #4]
  53104. else
  53105. {
  53106. struct mib_list_node *jn;
  53107. /* ident_len == 0, complete with leftmost '.thing' */
  53108. jn = lrn->head;
  53109. while ((jn != NULL) && empty_table(jn->nptr))
  53110. 803065e: 2f00 cmp r7, #0
  53111. 8030660: f000 809b beq.w 803079a <snmp_expand_tree+0x30e>
  53112. 8030664: 68f8 ldr r0, [r7, #12]
  53113. 8030666: f7ff fd93 bl 8030190 <empty_table>
  53114. 803066a: 2800 cmp r0, #0
  53115. 803066c: d1f6 bne.n 803065c <snmp_expand_tree+0x1d0>
  53116. 803066e: e0c8 b.n 8030802 <snmp_expand_tree+0x376>
  53117. /* jn == NULL */
  53118. climb_tree = 1;
  53119. }
  53120. }
  53121. }
  53122. else if(node_type == MIB_NODE_EX)
  53123. 8030670: 2b05 cmp r3, #5
  53124. 8030672: f040 8086 bne.w 8030782 <snmp_expand_tree+0x2f6>
  53125. struct mib_external_node *en;
  53126. s32_t ex_id;
  53127. /* external node (addressing and access via functions) */
  53128. en = (struct mib_external_node *)node;
  53129. if (ident_len > 0)
  53130. 8030676: 2e00 cmp r6, #0
  53131. 8030678: d06e beq.n 8030758 <snmp_expand_tree+0x2cc>
  53132. {
  53133. u16_t i, len;
  53134. i = 0;
  53135. len = en->level_length(en->addr_inf,ext_level);
  53136. 803067a: 69e3 ldr r3, [r4, #28]
  53137. 803067c: 6960 ldr r0, [r4, #20]
  53138. 803067e: 4651 mov r1, sl
  53139. 8030680: 4798 blx r3
  53140. en = (struct mib_external_node *)node;
  53141. if (ident_len > 0)
  53142. {
  53143. u16_t i, len;
  53144. i = 0;
  53145. 8030682: f04f 0900 mov.w r9, #0
  53146. len = en->level_length(en->addr_inf,ext_level);
  53147. 8030686: 4683 mov fp, r0
  53148. while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) < 0))
  53149. 8030688: e003 b.n 8030692 <snmp_expand_tree+0x206>
  53150. {
  53151. i++;
  53152. 803068a: f109 0901 add.w r9, r9, #1
  53153. 803068e: fa1f f989 uxth.w r9, r9
  53154. {
  53155. u16_t i, len;
  53156. i = 0;
  53157. len = en->level_length(en->addr_inf,ext_level);
  53158. while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) < 0))
  53159. 8030692: 45d9 cmp r9, fp
  53160. 8030694: f000 8081 beq.w 803079a <snmp_expand_tree+0x30e>
  53161. 8030698: 6a27 ldr r7, [r4, #32]
  53162. 803069a: 6960 ldr r0, [r4, #20]
  53163. 803069c: f8d8 3000 ldr.w r3, [r8]
  53164. 80306a0: 4651 mov r1, sl
  53165. 80306a2: 464a mov r2, r9
  53166. 80306a4: 47b8 blx r7
  53167. 80306a6: 2800 cmp r0, #0
  53168. 80306a8: dbef blt.n 803068a <snmp_expand_tree+0x1fe>
  53169. {
  53170. i++;
  53171. }
  53172. if (i < len)
  53173. 80306aa: 45d9 cmp r9, fp
  53174. 80306ac: d275 bcs.n 803079a <snmp_expand_tree+0x30e>
  53175. {
  53176. /* add identifier to oidret */
  53177. en->get_objid(en->addr_inf,ext_level,i,&ex_id);
  53178. 80306ae: 4651 mov r1, sl
  53179. 80306b0: 464a mov r2, r9
  53180. 80306b2: ab06 add r3, sp, #24
  53181. 80306b4: 6a67 ldr r7, [r4, #36] ; 0x24
  53182. 80306b6: 6960 ldr r0, [r4, #20]
  53183. 80306b8: 47b8 blx r7
  53184. LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,ex_id,*ident));
  53185. oidret->id[oidret->len] = ex_id;
  53186. 80306ba: 782b ldrb r3, [r5, #0]
  53187. 80306bc: 9a06 ldr r2, [sp, #24]
  53188. 80306be: eb05 0183 add.w r1, r5, r3, lsl #2
  53189. (oidret->len)++;
  53190. if ((ext_level + 1) == en->tree_levels)
  53191. 80306c2: f10a 0c01 add.w ip, sl, #1
  53192. if (i < len)
  53193. {
  53194. /* add identifier to oidret */
  53195. en->get_objid(en->addr_inf,ext_level,i,&ex_id);
  53196. LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,ex_id,*ident));
  53197. oidret->id[oidret->len] = ex_id;
  53198. 80306c6: 604a str r2, [r1, #4]
  53199. (oidret->len)++;
  53200. 80306c8: 1c59 adds r1, r3, #1
  53201. 80306ca: 7029 strb r1, [r5, #0]
  53202. if ((ext_level + 1) == en->tree_levels)
  53203. 80306cc: 7e21 ldrb r1, [r4, #24]
  53204. 80306ce: 458c cmp ip, r1
  53205. 80306d0: d118 bne.n 8030704 <snmp_expand_tree+0x278>
  53206. {
  53207. LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n"));
  53208. /* leaf node */
  53209. if (ex_id > *ident)
  53210. 80306d2: f8d8 1000 ldr.w r1, [r8]
  53211. 80306d6: 428a cmp r2, r1
  53212. 80306d8: f300 8088 bgt.w 80307ec <snmp_expand_tree+0x360>
  53213. {
  53214. return (struct mib_node*)en;
  53215. }
  53216. else if ((i + 1) < len)
  53217. 80306dc: f109 0201 add.w r2, r9, #1
  53218. 80306e0: 455a cmp r2, fp
  53219. 80306e2: da0d bge.n 8030700 <snmp_expand_tree+0x274>
  53220. {
  53221. /* ex_id == *ident */
  53222. en->get_objid(en->addr_inf,ext_level,i + 1,&ex_id);
  53223. 80306e4: ab06 add r3, sp, #24
  53224. 80306e6: 6a66 ldr r6, [r4, #36] ; 0x24
  53225. 80306e8: 6960 ldr r0, [r4, #20]
  53226. 80306ea: 4651 mov r1, sl
  53227. 80306ec: b292 uxth r2, r2
  53228. 80306ee: 47b0 blx r6
  53229. (oidret->len)--;
  53230. 80306f0: 782b ldrb r3, [r5, #0]
  53231. 80306f2: 3b01 subs r3, #1
  53232. oidret->id[oidret->len] = ex_id;
  53233. 80306f4: b2db uxtb r3, r3
  53234. 80306f6: eb05 0583 add.w r5, r5, r3, lsl #2
  53235. 80306fa: 9b06 ldr r3, [sp, #24]
  53236. 80306fc: 606b str r3, [r5, #4]
  53237. 80306fe: e075 b.n 80307ec <snmp_expand_tree+0x360>
  53238. return (struct mib_node*)en;
  53239. }
  53240. else
  53241. {
  53242. /* (i + 1) == len */
  53243. (oidret->len)--;
  53244. 8030700: 702b strb r3, [r5, #0]
  53245. 8030702: e04a b.n 803079a <snmp_expand_tree+0x30e>
  53246. struct nse cur_node;
  53247. LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
  53248. /* non-leaf, store right child ptr and id */
  53249. LWIP_ASSERT("i < 0xff", i < 0xff);
  53250. j = (u8_t)i + 1;
  53251. 8030704: f109 0201 add.w r2, r9, #1
  53252. if (j < len)
  53253. 8030708: b2d2 uxtb r2, r2
  53254. 803070a: 455a cmp r2, fp
  53255. 803070c: d20e bcs.n 803072c <snmp_expand_tree+0x2a0>
  53256. {
  53257. /* right node is the current external node */
  53258. cur_node.r_ptr = node;
  53259. 803070e: 9407 str r4, [sp, #28]
  53260. en->get_objid(en->addr_inf,ext_level,j,&cur_node.r_id);
  53261. 8030710: 6960 ldr r0, [r4, #20]
  53262. 8030712: 9b05 ldr r3, [sp, #20]
  53263. 8030714: f8cd c004 str.w ip, [sp, #4]
  53264. 8030718: 4651 mov r1, sl
  53265. 803071a: 6a67 ldr r7, [r4, #36] ; 0x24
  53266. 803071c: 47b8 blx r7
  53267. cur_node.r_nl = ext_level + 1;
  53268. 803071e: f8dd c004 ldr.w ip, [sp, #4]
  53269. 8030722: f88d c024 strb.w ip, [sp, #36] ; 0x24
  53270. 8030726: e003 b.n 8030730 <snmp_expand_tree+0x2a4>
  53271. 8030728: 2000e23c .word 0x2000e23c
  53272. }
  53273. else
  53274. {
  53275. cur_node.r_ptr = NULL;
  53276. 803072c: 2300 movs r3, #0
  53277. 803072e: 9307 str r3, [sp, #28]
  53278. }
  53279. push_node(&cur_node);
  53280. 8030730: a807 add r0, sp, #28
  53281. 8030732: f7ff fd19 bl 8030168 <push_node>
  53282. if (en->ident_cmp(en->addr_inf,ext_level,i,*ident) == 0)
  53283. 8030736: 6a27 ldr r7, [r4, #32]
  53284. 8030738: 6960 ldr r0, [r4, #20]
  53285. 803073a: f8d8 3000 ldr.w r3, [r8]
  53286. 803073e: 4651 mov r1, sl
  53287. 8030740: 464a mov r2, r9
  53288. 8030742: 47b8 blx r7
  53289. 8030744: b920 cbnz r0, 8030750 <snmp_expand_tree+0x2c4>
  53290. {
  53291. ident_len--;
  53292. 8030746: 3e01 subs r6, #1
  53293. 8030748: b2f6 uxtb r6, r6
  53294. ident++;
  53295. 803074a: f108 0804 add.w r8, r8, #4
  53296. 803074e: e000 b.n 8030752 <snmp_expand_tree+0x2c6>
  53297. }
  53298. else
  53299. {
  53300. /* external id < *ident */
  53301. ident_len = 0;
  53302. 8030750: 2600 movs r6, #0
  53303. }
  53304. /* proceed to child */
  53305. ext_level++;
  53306. 8030752: f10a 0a01 add.w sl, sl, #1
  53307. 8030756: e011 b.n 803077c <snmp_expand_tree+0x2f0>
  53308. }
  53309. }
  53310. else
  53311. {
  53312. /* ident_len == 0, complete with leftmost '.thing' */
  53313. en->get_objid(en->addr_inf,ext_level,0,&ex_id);
  53314. 8030758: 4651 mov r1, sl
  53315. 803075a: 4632 mov r2, r6
  53316. 803075c: ab06 add r3, sp, #24
  53317. 803075e: 6a67 ldr r7, [r4, #36] ; 0x24
  53318. 8030760: 6960 ldr r0, [r4, #20]
  53319. 8030762: 47b8 blx r7
  53320. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left en->objid==%"S32_F"\n",ex_id));
  53321. oidret->id[oidret->len] = ex_id;
  53322. 8030764: 782b ldrb r3, [r5, #0]
  53323. 8030766: 9a06 ldr r2, [sp, #24]
  53324. 8030768: eb05 0183 add.w r1, r5, r3, lsl #2
  53325. (oidret->len)++;
  53326. 803076c: 3301 adds r3, #1
  53327. else
  53328. {
  53329. /* ident_len == 0, complete with leftmost '.thing' */
  53330. en->get_objid(en->addr_inf,ext_level,0,&ex_id);
  53331. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left en->objid==%"S32_F"\n",ex_id));
  53332. oidret->id[oidret->len] = ex_id;
  53333. 803076e: 604a str r2, [r1, #4]
  53334. (oidret->len)++;
  53335. 8030770: 702b strb r3, [r5, #0]
  53336. if ((ext_level + 1) == en->tree_levels)
  53337. 8030772: 7e23 ldrb r3, [r4, #24]
  53338. 8030774: f10a 0a01 add.w sl, sl, #1
  53339. 8030778: 459a cmp sl, r3
  53340. 803077a: d037 beq.n 80307ec <snmp_expand_tree+0x360>
  53341. return (struct mib_node*)en;
  53342. }
  53343. else
  53344. {
  53345. /* no leaf, proceed to child */
  53346. ext_level++;
  53347. 803077c: fa5f fa8a uxtb.w sl, sl
  53348. 8030780: e030 b.n 80307e4 <snmp_expand_tree+0x358>
  53349. }
  53350. }
  53351. }
  53352. else if(node_type == MIB_NODE_SC)
  53353. 8030782: 2b01 cmp r3, #1
  53354. 8030784: d001 beq.n 803078a <snmp_expand_tree+0x2fe>
  53355. }
  53356. else
  53357. {
  53358. /* unknown/unhandled node_type */
  53359. LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node_type %"U16_F" unkown\n",(u16_t)node_type));
  53360. return NULL;
  53361. 8030786: 2000 movs r0, #0
  53362. 8030788: e047 b.n 803081a <snmp_expand_tree+0x38e>
  53363. {
  53364. mib_scalar_node *sn;
  53365. /* scalar node */
  53366. sn = (mib_scalar_node *)node;
  53367. if (ident_len > 0)
  53368. 803078a: b936 cbnz r6, 803079a <snmp_expand_tree+0x30e>
  53369. climb_tree = 1;
  53370. }
  53371. else
  53372. {
  53373. /* ident_len == 0, complete object identifier */
  53374. oidret->id[oidret->len] = 0;
  53375. 803078c: 782b ldrb r3, [r5, #0]
  53376. 803078e: eb05 0283 add.w r2, r5, r3, lsl #2
  53377. (oidret->len)++;
  53378. 8030792: 3301 adds r3, #1
  53379. climb_tree = 1;
  53380. }
  53381. else
  53382. {
  53383. /* ident_len == 0, complete object identifier */
  53384. oidret->id[oidret->len] = 0;
  53385. 8030794: 6056 str r6, [r2, #4]
  53386. (oidret->len)++;
  53387. 8030796: 702b strb r3, [r5, #0]
  53388. 8030798: e028 b.n 80307ec <snmp_expand_tree+0x360>
  53389. 803079a: 4921 ldr r1, [pc, #132] ; (8030820 <snmp_expand_tree+0x394>)
  53390. struct nse child;
  53391. /* find right child ptr */
  53392. child.r_ptr = NULL;
  53393. child.r_id = 0;
  53394. child.r_nl = 0;
  53395. 803079c: f04f 0a00 mov.w sl, #0
  53396. 80307a0: 780b ldrb r3, [r1, #0]
  53397. pop_node(struct nse* node)
  53398. {
  53399. if (node_stack_cnt > 0)
  53400. {
  53401. node_stack_cnt--;
  53402. *node = node_stack[node_stack_cnt];
  53403. 80307a2: 4920 ldr r1, [pc, #128] ; (8030824 <snmp_expand_tree+0x398>)
  53404. {
  53405. struct nse child;
  53406. /* find right child ptr */
  53407. child.r_ptr = NULL;
  53408. child.r_id = 0;
  53409. 80307a4: 4652 mov r2, sl
  53410. if (climb_tree)
  53411. {
  53412. struct nse child;
  53413. /* find right child ptr */
  53414. child.r_ptr = NULL;
  53415. 80307a6: 4654 mov r4, sl
  53416. pop_node(struct nse* node)
  53417. {
  53418. if (node_stack_cnt > 0)
  53419. {
  53420. node_stack_cnt--;
  53421. *node = node_stack[node_stack_cnt];
  53422. 80307a8: 260c movs r6, #12
  53423. /* find right child ptr */
  53424. child.r_ptr = NULL;
  53425. child.r_id = 0;
  53426. child.r_nl = 0;
  53427. while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
  53428. 80307aa: e00b b.n 80307c4 <snmp_expand_tree+0x338>
  53429. static void
  53430. pop_node(struct nse* node)
  53431. {
  53432. if (node_stack_cnt > 0)
  53433. {
  53434. node_stack_cnt--;
  53435. 80307ac: 3b01 subs r3, #1
  53436. 80307ae: b2db uxtb r3, r3
  53437. *node = node_stack[node_stack_cnt];
  53438. 80307b0: fb06 f203 mul.w r2, r6, r3
  53439. 80307b4: 1888 adds r0, r1, r2
  53440. 80307b6: 588c ldr r4, [r1, r2]
  53441. 80307b8: f890 a008 ldrb.w sl, [r0, #8]
  53442. 80307bc: 6842 ldr r2, [r0, #4]
  53443. child.r_nl = 0;
  53444. while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
  53445. {
  53446. pop_node(&child);
  53447. /* trim returned oid */
  53448. (oidret->len)--;
  53449. 80307be: 7828 ldrb r0, [r5, #0]
  53450. 80307c0: 3801 subs r0, #1
  53451. 80307c2: 7028 strb r0, [r5, #0]
  53452. /* find right child ptr */
  53453. child.r_ptr = NULL;
  53454. child.r_id = 0;
  53455. child.r_nl = 0;
  53456. while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
  53457. 80307c4: b91b cbnz r3, 80307ce <snmp_expand_tree+0x342>
  53458. 80307c6: 4f16 ldr r7, [pc, #88] ; (8030820 <snmp_expand_tree+0x394>)
  53459. 80307c8: 703b strb r3, [r7, #0]
  53460. {
  53461. pop_node(&child);
  53462. /* trim returned oid */
  53463. (oidret->len)--;
  53464. }
  53465. if (child.r_ptr != NULL)
  53466. 80307ca: b924 cbnz r4, 80307d6 <snmp_expand_tree+0x34a>
  53467. 80307cc: e7db b.n 8030786 <snmp_expand_tree+0x2fa>
  53468. /* find right child ptr */
  53469. child.r_ptr = NULL;
  53470. child.r_id = 0;
  53471. child.r_nl = 0;
  53472. while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
  53473. 80307ce: 2c00 cmp r4, #0
  53474. 80307d0: d0ec beq.n 80307ac <snmp_expand_tree+0x320>
  53475. 80307d2: 4913 ldr r1, [pc, #76] ; (8030820 <snmp_expand_tree+0x394>)
  53476. 80307d4: 700b strb r3, [r1, #0]
  53477. }
  53478. if (child.r_ptr != NULL)
  53479. {
  53480. /* incoming ident is useless beyond this point */
  53481. ident_len = 0;
  53482. oidret->id[oidret->len] = child.r_id;
  53483. 80307d6: 782b ldrb r3, [r5, #0]
  53484. 80307d8: eb05 0183 add.w r1, r5, r3, lsl #2
  53485. oidret->len++;
  53486. 80307dc: 3301 adds r3, #1
  53487. }
  53488. if (child.r_ptr != NULL)
  53489. {
  53490. /* incoming ident is useless beyond this point */
  53491. ident_len = 0;
  53492. oidret->id[oidret->len] = child.r_id;
  53493. 80307de: 604a str r2, [r1, #4]
  53494. oidret->len++;
  53495. 80307e0: 702b strb r3, [r5, #0]
  53496. (oidret->len)--;
  53497. }
  53498. if (child.r_ptr != NULL)
  53499. {
  53500. /* incoming ident is useless beyond this point */
  53501. ident_len = 0;
  53502. 80307e2: 2600 movs r6, #0
  53503. u8_t node_type, ext_level, climb_tree;
  53504. ext_level = 0;
  53505. /* reset node stack */
  53506. node_stack_cnt = 0;
  53507. while (node != NULL)
  53508. 80307e4: 2c00 cmp r4, #0
  53509. 80307e6: f47f ae60 bne.w 80304aa <snmp_expand_tree+0x1e>
  53510. 80307ea: e7cc b.n 8030786 <snmp_expand_tree+0x2fa>
  53511. if (jn != NULL)
  53512. {
  53513. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left jn->objid==%"S32_F"\n",jn->objid));
  53514. oidret->id[oidret->len] = jn->objid;
  53515. (oidret->len)++;
  53516. if (jn->nptr == NULL)
  53517. 80307ec: 4620 mov r0, r4
  53518. 80307ee: e014 b.n 803081a <snmp_expand_tree+0x38e>
  53519. jn = jn->next;
  53520. }
  53521. if (jn != NULL)
  53522. {
  53523. cur_node.r_ptr = jn->nptr;
  53524. cur_node.r_id = jn->objid;
  53525. 80307f0: 68a3 ldr r3, [r4, #8]
  53526. {
  53527. jn = jn->next;
  53528. }
  53529. if (jn != NULL)
  53530. {
  53531. cur_node.r_ptr = jn->nptr;
  53532. 80307f2: f8cd 901c str.w r9, [sp, #28]
  53533. cur_node.r_id = jn->objid;
  53534. 80307f6: 9308 str r3, [sp, #32]
  53535. cur_node.r_nl = 0;
  53536. 80307f8: f88d 0024 strb.w r0, [sp, #36] ; 0x24
  53537. 80307fc: e71e b.n 803063c <snmp_expand_tree+0x1b0>
  53538. }
  53539. else
  53540. {
  53541. cur_node.r_ptr = NULL;
  53542. 80307fe: 9407 str r4, [sp, #28]
  53543. 8030800: e71c b.n 803063c <snmp_expand_tree+0x1b0>
  53544. jn = jn->next;
  53545. }
  53546. if (jn != NULL)
  53547. {
  53548. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left jn->objid==%"S32_F"\n",jn->objid));
  53549. oidret->id[oidret->len] = jn->objid;
  53550. 8030802: 782b ldrb r3, [r5, #0]
  53551. 8030804: 68ba ldr r2, [r7, #8]
  53552. 8030806: eb05 0183 add.w r1, r5, r3, lsl #2
  53553. (oidret->len)++;
  53554. 803080a: 3301 adds r3, #1
  53555. 803080c: 702b strb r3, [r5, #0]
  53556. if (jn->nptr == NULL)
  53557. 803080e: 68fb ldr r3, [r7, #12]
  53558. jn = jn->next;
  53559. }
  53560. if (jn != NULL)
  53561. {
  53562. LWIP_DEBUGF(SNMP_MIB_DEBUG,("left jn->objid==%"S32_F"\n",jn->objid));
  53563. oidret->id[oidret->len] = jn->objid;
  53564. 8030810: 604a str r2, [r1, #4]
  53565. (oidret->len)++;
  53566. if (jn->nptr == NULL)
  53567. 8030812: 2b00 cmp r3, #0
  53568. 8030814: d0ea beq.n 80307ec <snmp_expand_tree+0x360>
  53569. (oidret->len)--;
  53570. }
  53571. if (child.r_ptr != NULL)
  53572. {
  53573. /* incoming ident is useless beyond this point */
  53574. ident_len = 0;
  53575. 8030816: 461c mov r4, r3
  53576. 8030818: e7e4 b.n 80307e4 <snmp_expand_tree+0x358>
  53577. }
  53578. }
  53579. /* done, found nothing */
  53580. LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node==%p\n",(void*)node));
  53581. return NULL;
  53582. }
  53583. 803081a: b00b add sp, #44 ; 0x2c
  53584. 803081c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  53585. 8030820: 2000e23c .word 0x2000e23c
  53586. 8030824: 2000e240 .word 0x2000e240
  53587. 08030828 <snmp_iso_prefix_tst>:
  53588. * @return 1 if it matches, 0 otherwise
  53589. */
  53590. u8_t
  53591. snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident)
  53592. {
  53593. if ((ident_len > 3) &&
  53594. 8030828: 2803 cmp r0, #3
  53595. 803082a: d90d bls.n 8030848 <snmp_iso_prefix_tst+0x20>
  53596. 803082c: 680b ldr r3, [r1, #0]
  53597. 803082e: 2b01 cmp r3, #1
  53598. 8030830: d10a bne.n 8030848 <snmp_iso_prefix_tst+0x20>
  53599. (ident[0] == 1) && (ident[1] == 3) &&
  53600. 8030832: 684b ldr r3, [r1, #4]
  53601. 8030834: 2b03 cmp r3, #3
  53602. 8030836: d107 bne.n 8030848 <snmp_iso_prefix_tst+0x20>
  53603. 8030838: 688b ldr r3, [r1, #8]
  53604. 803083a: 2b06 cmp r3, #6
  53605. 803083c: d104 bne.n 8030848 <snmp_iso_prefix_tst+0x20>
  53606. (ident[2] == 6) && (ident[3] == 1))
  53607. 803083e: 68c8 ldr r0, [r1, #12]
  53608. {
  53609. return 1;
  53610. 8030840: 1e43 subs r3, r0, #1
  53611. 8030842: 4258 negs r0, r3
  53612. 8030844: 4158 adcs r0, r3
  53613. 8030846: 4770 bx lr
  53614. }
  53615. else
  53616. {
  53617. return 0;
  53618. 8030848: 2000 movs r0, #0
  53619. }
  53620. }
  53621. 803084a: 4770 bx lr
  53622. 0803084c <snmp_iso_prefix_expand>:
  53623. i = 0;
  53624. prefix_ptr = &prefix[0];
  53625. ret_ptr = &oidret->id[0];
  53626. ident_len = ((ident_len < 4)?ident_len:4);
  53627. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  53628. 803084c: 2300 movs r3, #0
  53629. *
  53630. * @note ident_len 0 is allowed, expanding to the first known object id!!
  53631. */
  53632. u8_t
  53633. snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  53634. {
  53635. 803084e: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  53636. s32_t *ret_ptr;
  53637. u8_t i;
  53638. i = 0;
  53639. prefix_ptr = &prefix[0];
  53640. ret_ptr = &oidret->id[0];
  53641. 8030852: 1d15 adds r5, r2, #4
  53642. ident_len = ((ident_len < 4)?ident_len:4);
  53643. 8030854: 2804 cmp r0, #4
  53644. 8030856: bf34 ite cc
  53645. 8030858: 4680 movcc r8, r0
  53646. 803085a: f04f 0804 movcs.w r8, #4
  53647. {
  53648. const s32_t *prefix_ptr;
  53649. s32_t *ret_ptr;
  53650. u8_t i;
  53651. i = 0;
  53652. 803085e: 461c mov r4, r3
  53653. * @return 1 if it matches, 0 otherwise
  53654. *
  53655. * @note ident_len 0 is allowed, expanding to the first known object id!!
  53656. */
  53657. u8_t
  53658. snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  53659. 8030860: 4f10 ldr r7, [pc, #64] ; (80308a4 <snmp_iso_prefix_expand+0x58>)
  53660. i = 0;
  53661. prefix_ptr = &prefix[0];
  53662. ret_ptr = &oidret->id[0];
  53663. ident_len = ((ident_len < 4)?ident_len:4);
  53664. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  53665. 8030862: e003 b.n 803086c <snmp_iso_prefix_expand+0x20>
  53666. {
  53667. *ret_ptr++ = *prefix_ptr++;
  53668. ident++;
  53669. i++;
  53670. 8030864: 3401 adds r4, #1
  53671. prefix_ptr = &prefix[0];
  53672. ret_ptr = &oidret->id[0];
  53673. ident_len = ((ident_len < 4)?ident_len:4);
  53674. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  53675. {
  53676. *ret_ptr++ = *prefix_ptr++;
  53677. 8030866: 50ee str r6, [r5, r3]
  53678. ident++;
  53679. i++;
  53680. 8030868: b2e4 uxtb r4, r4
  53681. 803086a: 3304 adds r3, #4
  53682. i = 0;
  53683. prefix_ptr = &prefix[0];
  53684. ret_ptr = &oidret->id[0];
  53685. ident_len = ((ident_len < 4)?ident_len:4);
  53686. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  53687. 803086c: 4544 cmp r4, r8
  53688. * @return 1 if it matches, 0 otherwise
  53689. *
  53690. * @note ident_len 0 is allowed, expanding to the first known object id!!
  53691. */
  53692. u8_t
  53693. snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
  53694. 803086e: eb05 0c03 add.w ip, r5, r3
  53695. 8030872: eb07 0603 add.w r6, r7, r3
  53696. i = 0;
  53697. prefix_ptr = &prefix[0];
  53698. ret_ptr = &oidret->id[0];
  53699. ident_len = ((ident_len < 4)?ident_len:4);
  53700. while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
  53701. 8030876: d101 bne.n 803087c <snmp_iso_prefix_expand+0x30>
  53702. 8030878: 2300 movs r3, #0
  53703. 803087a: e00c b.n 8030896 <snmp_iso_prefix_expand+0x4a>
  53704. 803087c: 59de ldr r6, [r3, r7]
  53705. 803087e: 58c8 ldr r0, [r1, r3]
  53706. 8030880: 42b0 cmp r0, r6
  53707. 8030882: ddef ble.n 8030864 <snmp_iso_prefix_expand+0x18>
  53708. return 1;
  53709. }
  53710. else
  53711. {
  53712. /* i != ident_len */
  53713. return 0;
  53714. 8030884: 2000 movs r0, #0
  53715. 8030886: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  53716. if (i == ident_len)
  53717. {
  53718. /* match, complete missing bits */
  53719. while (i < 4)
  53720. {
  53721. *ret_ptr++ = *prefix_ptr++;
  53722. 803088a: 58f1 ldr r1, [r6, r3]
  53723. i++;
  53724. 803088c: 3401 adds r4, #1
  53725. if (i == ident_len)
  53726. {
  53727. /* match, complete missing bits */
  53728. while (i < 4)
  53729. {
  53730. *ret_ptr++ = *prefix_ptr++;
  53731. 803088e: f84c 1003 str.w r1, [ip, r3]
  53732. i++;
  53733. 8030892: b2e4 uxtb r4, r4
  53734. 8030894: 3304 adds r3, #4
  53735. i++;
  53736. }
  53737. if (i == ident_len)
  53738. {
  53739. /* match, complete missing bits */
  53740. while (i < 4)
  53741. 8030896: 2c03 cmp r4, #3
  53742. 8030898: d9f7 bls.n 803088a <snmp_iso_prefix_expand+0x3e>
  53743. {
  53744. *ret_ptr++ = *prefix_ptr++;
  53745. i++;
  53746. }
  53747. oidret->len = i;
  53748. 803089a: 7014 strb r4, [r2, #0]
  53749. return 1;
  53750. 803089c: 2001 movs r0, #1
  53751. else
  53752. {
  53753. /* i != ident_len */
  53754. return 0;
  53755. }
  53756. }
  53757. 803089e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  53758. 80308a2: bf00 nop
  53759. 80308a4: 0803b510 .word 0x0803b510
  53760. 080308a8 <snmp_init>:
  53761. * Starts SNMP Agent.
  53762. * Allocates UDP pcb and binds it to IP_ADDR_ANY port 161.
  53763. */
  53764. void
  53765. snmp_init(void)
  53766. {
  53767. 80308a8: b510 push {r4, lr}
  53768. struct snmp_msg_pstat *msg_ps;
  53769. u8_t i;
  53770. snmp1_pcb = udp_new();
  53771. 80308aa: f7fd fa39 bl 802dd20 <udp_new>
  53772. 80308ae: 4c0b ldr r4, [pc, #44] ; (80308dc <snmp_init+0x34>)
  53773. 80308b0: 6020 str r0, [r4, #0]
  53774. if (snmp1_pcb != NULL)
  53775. 80308b2: b140 cbz r0, 80308c6 <snmp_init+0x1e>
  53776. {
  53777. udp_recv(snmp1_pcb, snmp_recv, (void *)SNMP_IN_PORT);
  53778. 80308b4: 490a ldr r1, [pc, #40] ; (80308e0 <snmp_init+0x38>)
  53779. 80308b6: 22a1 movs r2, #161 ; 0xa1
  53780. 80308b8: f7fd fa12 bl 802dce0 <udp_recv>
  53781. udp_bind(snmp1_pcb, IP_ADDR_ANY, SNMP_IN_PORT);
  53782. 80308bc: 6820 ldr r0, [r4, #0]
  53783. 80308be: 4909 ldr r1, [pc, #36] ; (80308e4 <snmp_init+0x3c>)
  53784. 80308c0: 22a1 movs r2, #161 ; 0xa1
  53785. 80308c2: f7fd f915 bl 802daf0 <udp_bind>
  53786. }
  53787. msg_ps = &msg_input_list[0];
  53788. for (i=0; i<SNMP_CONCURRENT_REQUESTS; i++)
  53789. {
  53790. msg_ps->state = SNMP_MSG_EMPTY;
  53791. 80308c6: 4b08 ldr r3, [pc, #32] ; (80308e8 <snmp_init+0x40>)
  53792. 80308c8: 2200 movs r2, #0
  53793. 80308ca: f883 205a strb.w r2, [r3, #90] ; 0x5a
  53794. msg_ps->error_index = 0;
  53795. 80308ce: 615a str r2, [r3, #20]
  53796. msg_ps->error_status = SNMP_ES_NOERROR;
  53797. 80308d0: 611a str r2, [r3, #16]
  53798. msg_ps++;
  53799. }
  53800. trap_msg.pcb = snmp1_pcb;
  53801. 80308d2: 4b02 ldr r3, [pc, #8] ; (80308dc <snmp_init+0x34>)
  53802. 80308d4: 681a ldr r2, [r3, #0]
  53803. 80308d6: 4b05 ldr r3, [pc, #20] ; (80308ec <snmp_init+0x44>)
  53804. 80308d8: 601a str r2, [r3, #0]
  53805. 80308da: bd10 pop {r4, pc}
  53806. 80308dc: 20010da8 .word 0x20010da8
  53807. 80308e0: 08031455 .word 0x08031455
  53808. 80308e4: 0803abfc .word 0x0803abfc
  53809. 80308e8: 20010dac .word 0x20010dac
  53810. 80308ec: 20010ee4 .word 0x20010ee4
  53811. 080308f0 <snmp_varbind_alloc>:
  53812. return ERR_OK;
  53813. }
  53814. struct snmp_varbind*
  53815. snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len)
  53816. {
  53817. 80308f0: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  53818. 80308f4: 4680 mov r8, r0
  53819. struct snmp_varbind *vb;
  53820. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  53821. 80308f6: 200c movs r0, #12
  53822. return ERR_OK;
  53823. }
  53824. struct snmp_varbind*
  53825. snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len)
  53826. {
  53827. 80308f8: 4689 mov r9, r1
  53828. 80308fa: 4617 mov r7, r2
  53829. struct snmp_varbind *vb;
  53830. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  53831. 80308fc: f7fa fb88 bl 802b010 <memp_malloc>
  53832. if (vb != NULL)
  53833. 8030900: 4604 mov r4, r0
  53834. 8030902: 2800 cmp r0, #0
  53835. 8030904: d032 beq.n 803096c <snmp_varbind_alloc+0x7c>
  53836. {
  53837. u8_t i;
  53838. vb->next = NULL;
  53839. 8030906: 2300 movs r3, #0
  53840. 8030908: 6003 str r3, [r0, #0]
  53841. vb->prev = NULL;
  53842. 803090a: 6043 str r3, [r0, #4]
  53843. i = oid->len;
  53844. 803090c: f898 5000 ldrb.w r5, [r8]
  53845. vb->ident_len = i;
  53846. 8030910: 7205 strb r5, [r0, #8]
  53847. if (i > 0)
  53848. 8030912: b1ad cbz r5, 8030940 <snmp_varbind_alloc+0x50>
  53849. {
  53850. LWIP_ASSERT("SNMP_MAX_TREE_DEPTH is configured too low", i <= SNMP_MAX_TREE_DEPTH);
  53851. /* allocate array of s32_t for our object identifier */
  53852. vb->ident = (s32_t*)memp_malloc(MEMP_SNMP_VALUE);
  53853. 8030914: 200d movs r0, #13
  53854. 8030916: f7fa fb7b bl 802b010 <memp_malloc>
  53855. 803091a: 4606 mov r6, r0
  53856. 803091c: 60e0 str r0, [r4, #12]
  53857. if (vb->ident == NULL)
  53858. 803091e: b928 cbnz r0, 803092c <snmp_varbind_alloc+0x3c>
  53859. {
  53860. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate ident value space\n"));
  53861. memp_free(MEMP_SNMP_VARBIND, vb);
  53862. 8030920: 4621 mov r1, r4
  53863. 8030922: 200c movs r0, #12
  53864. 8030924: f7fa fb8a bl 802b03c <memp_free>
  53865. return NULL;
  53866. 8030928: 4634 mov r4, r6
  53867. 803092a: e01f b.n 803096c <snmp_varbind_alloc+0x7c>
  53868. }
  53869. while(i > 0)
  53870. {
  53871. i--;
  53872. 803092c: 3d01 subs r5, #1
  53873. 803092e: b2ed uxtb r5, r5
  53874. vb->ident[i] = oid->id[i];
  53875. 8030930: eb08 0385 add.w r3, r8, r5, lsl #2
  53876. 8030934: 685b ldr r3, [r3, #4]
  53877. 8030936: f846 3025 str.w r3, [r6, r5, lsl #2]
  53878. {
  53879. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate ident value space\n"));
  53880. memp_free(MEMP_SNMP_VARBIND, vb);
  53881. return NULL;
  53882. }
  53883. while(i > 0)
  53884. 803093a: 2d00 cmp r5, #0
  53885. 803093c: d1f6 bne.n 803092c <snmp_varbind_alloc+0x3c>
  53886. 803093e: e000 b.n 8030942 <snmp_varbind_alloc+0x52>
  53887. }
  53888. }
  53889. else
  53890. {
  53891. /* i == 0, pass zero length object identifier */
  53892. vb->ident = NULL;
  53893. 8030940: 60c5 str r5, [r0, #12]
  53894. }
  53895. vb->value_type = type;
  53896. 8030942: f884 9010 strb.w r9, [r4, #16]
  53897. vb->value_len = len;
  53898. 8030946: 7467 strb r7, [r4, #17]
  53899. if (len > 0)
  53900. 8030948: b17f cbz r7, 803096a <snmp_varbind_alloc+0x7a>
  53901. {
  53902. LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low", vb->value_len <= SNMP_MAX_VALUE_SIZE);
  53903. /* allocate raw bytes for our object value */
  53904. vb->value = memp_malloc(MEMP_SNMP_VALUE);
  53905. 803094a: 200d movs r0, #13
  53906. 803094c: f7fa fb60 bl 802b010 <memp_malloc>
  53907. 8030950: 6160 str r0, [r4, #20]
  53908. if (vb->value == NULL)
  53909. 8030952: b958 cbnz r0, 803096c <snmp_varbind_alloc+0x7c>
  53910. {
  53911. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate value space\n"));
  53912. if (vb->ident != NULL)
  53913. 8030954: 68e1 ldr r1, [r4, #12]
  53914. 8030956: b111 cbz r1, 803095e <snmp_varbind_alloc+0x6e>
  53915. {
  53916. memp_free(MEMP_SNMP_VALUE, vb->ident);
  53917. 8030958: 200d movs r0, #13
  53918. 803095a: f7fa fb6f bl 802b03c <memp_free>
  53919. }
  53920. memp_free(MEMP_SNMP_VARBIND, vb);
  53921. 803095e: 4621 mov r1, r4
  53922. 8030960: 200c movs r0, #12
  53923. 8030962: f7fa fb6b bl 802b03c <memp_free>
  53924. return NULL;
  53925. 8030966: 2400 movs r4, #0
  53926. 8030968: e000 b.n 803096c <snmp_varbind_alloc+0x7c>
  53927. }
  53928. }
  53929. else
  53930. {
  53931. /* ASN1_NUL type, or zero length ASN1_OC_STR */
  53932. vb->value = NULL;
  53933. 803096a: 6167 str r7, [r4, #20]
  53934. else
  53935. {
  53936. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate varbind space\n"));
  53937. }
  53938. return vb;
  53939. }
  53940. 803096c: 4620 mov r0, r4
  53941. 803096e: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  53942. 08030972 <snmp_varbind_free>:
  53943. void
  53944. snmp_varbind_free(struct snmp_varbind *vb)
  53945. {
  53946. if (vb->value != NULL )
  53947. 8030972: 6941 ldr r1, [r0, #20]
  53948. return vb;
  53949. }
  53950. void
  53951. snmp_varbind_free(struct snmp_varbind *vb)
  53952. {
  53953. 8030974: b510 push {r4, lr}
  53954. 8030976: 4604 mov r4, r0
  53955. if (vb->value != NULL )
  53956. 8030978: b111 cbz r1, 8030980 <snmp_varbind_free+0xe>
  53957. {
  53958. memp_free(MEMP_SNMP_VALUE, vb->value);
  53959. 803097a: 200d movs r0, #13
  53960. 803097c: f7fa fb5e bl 802b03c <memp_free>
  53961. }
  53962. if (vb->ident != NULL )
  53963. 8030980: 68e1 ldr r1, [r4, #12]
  53964. 8030982: b111 cbz r1, 803098a <snmp_varbind_free+0x18>
  53965. {
  53966. memp_free(MEMP_SNMP_VALUE, vb->ident);
  53967. 8030984: 200d movs r0, #13
  53968. 8030986: f7fa fb59 bl 802b03c <memp_free>
  53969. }
  53970. memp_free(MEMP_SNMP_VARBIND, vb);
  53971. 803098a: 200c movs r0, #12
  53972. 803098c: 4621 mov r1, r4
  53973. }
  53974. 803098e: e8bd 4010 ldmia.w sp!, {r4, lr}
  53975. }
  53976. if (vb->ident != NULL )
  53977. {
  53978. memp_free(MEMP_SNMP_VALUE, vb->ident);
  53979. }
  53980. memp_free(MEMP_SNMP_VARBIND, vb);
  53981. 8030992: f7fa bb53 b.w 802b03c <memp_free>
  53982. 08030996 <snmp_varbind_list_free>:
  53983. }
  53984. void
  53985. snmp_varbind_list_free(struct snmp_varbind_root *root)
  53986. {
  53987. 8030996: b538 push {r3, r4, r5, lr}
  53988. 8030998: 4604 mov r4, r0
  53989. struct snmp_varbind *vb, *prev;
  53990. vb = root->tail;
  53991. 803099a: 6840 ldr r0, [r0, #4]
  53992. while ( vb != NULL )
  53993. 803099c: e003 b.n 80309a6 <snmp_varbind_list_free+0x10>
  53994. {
  53995. prev = vb->prev;
  53996. 803099e: 6845 ldr r5, [r0, #4]
  53997. snmp_varbind_free(vb);
  53998. 80309a0: f7ff ffe7 bl 8030972 <snmp_varbind_free>
  53999. vb = prev;
  54000. 80309a4: 4628 mov r0, r5
  54001. snmp_varbind_list_free(struct snmp_varbind_root *root)
  54002. {
  54003. struct snmp_varbind *vb, *prev;
  54004. vb = root->tail;
  54005. while ( vb != NULL )
  54006. 80309a6: 2800 cmp r0, #0
  54007. 80309a8: d1f9 bne.n 803099e <snmp_varbind_list_free+0x8>
  54008. {
  54009. prev = vb->prev;
  54010. snmp_varbind_free(vb);
  54011. vb = prev;
  54012. }
  54013. root->count = 0;
  54014. 80309aa: 7220 strb r0, [r4, #8]
  54015. root->head = NULL;
  54016. 80309ac: 6020 str r0, [r4, #0]
  54017. root->tail = NULL;
  54018. 80309ae: 6060 str r0, [r4, #4]
  54019. 80309b0: bd38 pop {r3, r4, r5, pc}
  54020. 080309b2 <snmp_error_response>:
  54021. //snmp_coldstart_trap();
  54022. }
  54023. static void
  54024. snmp_error_response(struct snmp_msg_pstat *msg_ps, u8_t error)
  54025. {
  54026. 80309b2: b570 push {r4, r5, r6, lr}
  54027. 80309b4: 4604 mov r4, r0
  54028. /* move names back from outvb to invb */
  54029. int v;
  54030. struct snmp_varbind *vbi = msg_ps->invb.head;
  54031. struct snmp_varbind *vbo = msg_ps->outvb.head;
  54032. for (v=0; v<msg_ps->vb_idx; v++) {
  54033. 80309b6: 2200 movs r2, #0
  54034. //snmp_coldstart_trap();
  54035. }
  54036. static void
  54037. snmp_error_response(struct snmp_msg_pstat *msg_ps, u8_t error)
  54038. {
  54039. 80309b8: 460e mov r6, r1
  54040. /* move names back from outvb to invb */
  54041. int v;
  54042. struct snmp_varbind *vbi = msg_ps->invb.head;
  54043. 80309ba: f8d0 0100 ldr.w r0, [r0, #256] ; 0x100
  54044. struct snmp_varbind *vbo = msg_ps->outvb.head;
  54045. 80309be: f8d4 310c ldr.w r3, [r4, #268] ; 0x10c
  54046. for (v=0; v<msg_ps->vb_idx; v++) {
  54047. vbi->ident_len = vbo->ident_len;
  54048. vbo->ident_len = 0;
  54049. 80309c2: 4611 mov r1, r2
  54050. {
  54051. /* move names back from outvb to invb */
  54052. int v;
  54053. struct snmp_varbind *vbi = msg_ps->invb.head;
  54054. struct snmp_varbind *vbo = msg_ps->outvb.head;
  54055. for (v=0; v<msg_ps->vb_idx; v++) {
  54056. 80309c4: e008 b.n 80309d8 <snmp_error_response+0x26>
  54057. vbi->ident_len = vbo->ident_len;
  54058. 80309c6: 7a1d ldrb r5, [r3, #8]
  54059. 80309c8: 7205 strb r5, [r0, #8]
  54060. vbo->ident_len = 0;
  54061. vbi->ident = vbo->ident;
  54062. 80309ca: 68dd ldr r5, [r3, #12]
  54063. int v;
  54064. struct snmp_varbind *vbi = msg_ps->invb.head;
  54065. struct snmp_varbind *vbo = msg_ps->outvb.head;
  54066. for (v=0; v<msg_ps->vb_idx; v++) {
  54067. vbi->ident_len = vbo->ident_len;
  54068. vbo->ident_len = 0;
  54069. 80309cc: 7219 strb r1, [r3, #8]
  54070. vbi->ident = vbo->ident;
  54071. 80309ce: 60c5 str r5, [r0, #12]
  54072. vbo->ident = NULL;
  54073. 80309d0: 60d9 str r1, [r3, #12]
  54074. vbi = vbi->next;
  54075. 80309d2: 6800 ldr r0, [r0, #0]
  54076. vbo = vbo->next;
  54077. 80309d4: 681b ldr r3, [r3, #0]
  54078. {
  54079. /* move names back from outvb to invb */
  54080. int v;
  54081. struct snmp_varbind *vbi = msg_ps->invb.head;
  54082. struct snmp_varbind *vbo = msg_ps->outvb.head;
  54083. for (v=0; v<msg_ps->vb_idx; v++) {
  54084. 80309d6: 3201 adds r2, #1
  54085. 80309d8: f894 50f8 ldrb.w r5, [r4, #248] ; 0xf8
  54086. 80309dc: 42aa cmp r2, r5
  54087. 80309de: dbf2 blt.n 80309c6 <snmp_error_response+0x14>
  54088. vbo->ident = NULL;
  54089. vbi = vbi->next;
  54090. vbo = vbo->next;
  54091. }
  54092. /* free outvb */
  54093. snmp_varbind_list_free(&msg_ps->outvb);
  54094. 80309e0: f504 7586 add.w r5, r4, #268 ; 0x10c
  54095. 80309e4: 4628 mov r0, r5
  54096. 80309e6: f7ff ffd6 bl 8030996 <snmp_varbind_list_free>
  54097. /* we send invb back */
  54098. msg_ps->outvb = msg_ps->invb;
  54099. 80309ea: f504 7380 add.w r3, r4, #256 ; 0x100
  54100. 80309ee: e893 0007 ldmia.w r3, {r0, r1, r2}
  54101. msg_ps->invb.head = NULL;
  54102. 80309f2: 2300 movs r3, #0
  54103. msg_ps->invb.tail = NULL;
  54104. msg_ps->invb.count = 0;
  54105. msg_ps->error_status = error;
  54106. /* error index must be 0 for error too big */
  54107. msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0;
  54108. 80309f4: 2e01 cmp r6, #1
  54109. }
  54110. /* free outvb */
  54111. snmp_varbind_list_free(&msg_ps->outvb);
  54112. /* we send invb back */
  54113. msg_ps->outvb = msg_ps->invb;
  54114. msg_ps->invb.head = NULL;
  54115. 80309f6: f8c4 3100 str.w r3, [r4, #256] ; 0x100
  54116. msg_ps->invb.tail = NULL;
  54117. 80309fa: f8c4 3104 str.w r3, [r4, #260] ; 0x104
  54118. msg_ps->invb.count = 0;
  54119. 80309fe: f884 3108 strb.w r3, [r4, #264] ; 0x108
  54120. msg_ps->error_status = error;
  54121. /* error index must be 0 for error too big */
  54122. msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0;
  54123. 8030a02: bf18 it ne
  54124. 8030a04: f894 30f8 ldrbne.w r3, [r4, #248] ; 0xf8
  54125. /* we send invb back */
  54126. msg_ps->outvb = msg_ps->invb;
  54127. msg_ps->invb.head = NULL;
  54128. msg_ps->invb.tail = NULL;
  54129. msg_ps->invb.count = 0;
  54130. msg_ps->error_status = error;
  54131. 8030a08: 6126 str r6, [r4, #16]
  54132. /* error index must be 0 for error too big */
  54133. msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0;
  54134. 8030a0a: bf18 it ne
  54135. 8030a0c: 3301 addne r3, #1
  54136. vbo = vbo->next;
  54137. }
  54138. /* free outvb */
  54139. snmp_varbind_list_free(&msg_ps->outvb);
  54140. /* we send invb back */
  54141. msg_ps->outvb = msg_ps->invb;
  54142. 8030a0e: e885 0007 stmia.w r5, {r0, r1, r2}
  54143. msg_ps->invb.head = NULL;
  54144. msg_ps->invb.tail = NULL;
  54145. msg_ps->invb.count = 0;
  54146. msg_ps->error_status = error;
  54147. /* error index must be 0 for error too big */
  54148. msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0;
  54149. 8030a12: 6163 str r3, [r4, #20]
  54150. snmp_send_response(msg_ps);
  54151. 8030a14: 4620 mov r0, r4
  54152. 8030a16: f001 f873 bl 8031b00 <snmp_send_response>
  54153. snmp_varbind_list_free(&msg_ps->outvb);
  54154. 8030a1a: 4628 mov r0, r5
  54155. 8030a1c: f7ff ffbb bl 8030996 <snmp_varbind_list_free>
  54156. msg_ps->state = SNMP_MSG_EMPTY;
  54157. 8030a20: 2300 movs r3, #0
  54158. 8030a22: f884 305a strb.w r3, [r4, #90] ; 0x5a
  54159. 8030a26: bd70 pop {r4, r5, r6, pc}
  54160. 08030a28 <snmp_ok_response>:
  54161. }
  54162. static void
  54163. snmp_ok_response(struct snmp_msg_pstat *msg_ps)
  54164. {
  54165. 8030a28: b510 push {r4, lr}
  54166. 8030a2a: 4604 mov r4, r0
  54167. err_t err_ret;
  54168. err_ret = snmp_send_response(msg_ps);
  54169. 8030a2c: f001 f868 bl 8031b00 <snmp_send_response>
  54170. else
  54171. {
  54172. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event = %"S32_F"\n",msg_ps->error_status));
  54173. }
  54174. /* free varbinds (if available) */
  54175. snmp_varbind_list_free(&msg_ps->invb);
  54176. 8030a30: f504 7080 add.w r0, r4, #256 ; 0x100
  54177. 8030a34: f7ff ffaf bl 8030996 <snmp_varbind_list_free>
  54178. snmp_varbind_list_free(&msg_ps->outvb);
  54179. 8030a38: f504 7086 add.w r0, r4, #268 ; 0x10c
  54180. 8030a3c: f7ff ffab bl 8030996 <snmp_varbind_list_free>
  54181. msg_ps->state = SNMP_MSG_EMPTY;
  54182. 8030a40: 2300 movs r3, #0
  54183. 8030a42: f884 305a strb.w r3, [r4, #90] ; 0x5a
  54184. 8030a46: bd10 pop {r4, pc}
  54185. 08030a48 <snmp_varbind_tail_add>:
  54186. }
  54187. void
  54188. snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb)
  54189. {
  54190. if (root->count == 0)
  54191. 8030a48: 7a03 ldrb r3, [r0, #8]
  54192. 8030a4a: b90b cbnz r3, 8030a50 <snmp_varbind_tail_add+0x8>
  54193. {
  54194. /* add first varbind to list */
  54195. root->head = vb;
  54196. 8030a4c: 6001 str r1, [r0, #0]
  54197. 8030a4e: e002 b.n 8030a56 <snmp_varbind_tail_add+0xe>
  54198. root->tail = vb;
  54199. }
  54200. else
  54201. {
  54202. /* add nth varbind to list tail */
  54203. root->tail->next = vb;
  54204. 8030a50: 6843 ldr r3, [r0, #4]
  54205. 8030a52: 6019 str r1, [r3, #0]
  54206. vb->prev = root->tail;
  54207. 8030a54: 604b str r3, [r1, #4]
  54208. root->tail = vb;
  54209. }
  54210. root->count += 1;
  54211. 8030a56: 7a03 ldrb r3, [r0, #8]
  54212. else
  54213. {
  54214. /* add nth varbind to list tail */
  54215. root->tail->next = vb;
  54216. vb->prev = root->tail;
  54217. root->tail = vb;
  54218. 8030a58: 6041 str r1, [r0, #4]
  54219. }
  54220. root->count += 1;
  54221. 8030a5a: 3301 adds r3, #1
  54222. 8030a5c: 7203 strb r3, [r0, #8]
  54223. 8030a5e: 4770 bx lr
  54224. 08030a60 <snmp_msg_event>:
  54225. *
  54226. * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1)
  54227. */
  54228. void
  54229. snmp_msg_event(u8_t request_id)
  54230. {
  54231. 8030a60: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  54232. struct snmp_msg_pstat *msg_ps;
  54233. if (request_id < SNMP_CONCURRENT_REQUESTS)
  54234. 8030a64: 4605 mov r5, r0
  54235. *
  54236. * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1)
  54237. */
  54238. void
  54239. snmp_msg_event(u8_t request_id)
  54240. {
  54241. 8030a66: b0a7 sub sp, #156 ; 0x9c
  54242. struct snmp_msg_pstat *msg_ps;
  54243. if (request_id < SNMP_CONCURRENT_REQUESTS)
  54244. 8030a68: 2800 cmp r0, #0
  54245. 8030a6a: f040 8390 bne.w 803118e <snmp_msg_event+0x72e>
  54246. {
  54247. msg_ps = &msg_input_list[request_id];
  54248. if (msg_ps->rt == SNMP_ASN1_PDU_GET_NEXT_REQ)
  54249. 8030a6e: 4cb2 ldr r4, [pc, #712] ; (8030d38 <snmp_msg_event+0x2d8>)
  54250. 8030a70: 7aa6 ldrb r6, [r4, #10]
  54251. 8030a72: 2e01 cmp r6, #1
  54252. 8030a74: f040 80d4 bne.w 8030c20 <snmp_msg_event+0x1c0>
  54253. static void
  54254. snmp_msg_getnext_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
  54255. {
  54256. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state));
  54257. if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
  54258. 8030a78: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  54259. 8030a7c: 2b07 cmp r3, #7
  54260. 8030a7e: d125 bne.n 8030acc <snmp_msg_event+0x6c>
  54261. /* get_object_def() answer*/
  54262. en = msg_ps->ext_mib_node;
  54263. /* translate answer into a known lifeform */
  54264. en->get_object_def_a(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1], &msg_ps->ext_object_def);
  54265. 8030a80: f894 2074 ldrb.w r2, [r4, #116] ; 0x74
  54266. if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
  54267. {
  54268. struct mib_external_node *en;
  54269. /* get_object_def() answer*/
  54270. en = msg_ps->ext_mib_node;
  54271. 8030a84: f8d4 805c ldr.w r8, [r4, #92] ; 0x5c
  54272. /* translate answer into a known lifeform */
  54273. en->get_object_def_a(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1], &msg_ps->ext_object_def);
  54274. 8030a88: eb04 0282 add.w r2, r4, r2, lsl #2
  54275. 8030a8c: 4631 mov r1, r6
  54276. 8030a8e: 3274 adds r2, #116 ; 0x74
  54277. 8030a90: f104 0368 add.w r3, r4, #104 ; 0x68
  54278. 8030a94: f8d8 7038 ldr.w r7, [r8, #56] ; 0x38
  54279. 8030a98: 47b8 blx r7
  54280. if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
  54281. 8030a9a: f894 0068 ldrb.w r0, [r4, #104] ; 0x68
  54282. 8030a9e: b148 cbz r0, 8030ab4 <snmp_msg_event+0x54>
  54283. {
  54284. msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE;
  54285. 8030aa0: 2308 movs r3, #8
  54286. 8030aa2: f884 305a strb.w r3, [r4, #90] ; 0x5a
  54287. en->get_value_q(request_id, &msg_ps->ext_object_def);
  54288. 8030aa6: f8d8 302c ldr.w r3, [r8, #44] ; 0x2c
  54289. 8030aaa: 4628 mov r0, r5
  54290. 8030aac: f104 0168 add.w r1, r4, #104 ; 0x68
  54291. 8030ab0: 4798 blx r3
  54292. 8030ab2: e0a6 b.n 8030c02 <snmp_msg_event+0x1a2>
  54293. }
  54294. else
  54295. {
  54296. en->get_object_def_pc(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1]);
  54297. 8030ab4: f894 2074 ldrb.w r2, [r4, #116] ; 0x74
  54298. 8030ab8: f8d8 3048 ldr.w r3, [r8, #72] ; 0x48
  54299. 8030abc: eb04 0282 add.w r2, r4, r2, lsl #2
  54300. 8030ac0: 4631 mov r1, r6
  54301. 8030ac2: 3274 adds r2, #116 ; 0x74
  54302. 8030ac4: 4798 blx r3
  54303. /* search failed, object id points to unknown object (nosuchname) */
  54304. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  54305. 8030ac6: 4620 mov r0, r4
  54306. 8030ac8: 2102 movs r1, #2
  54307. 8030aca: e02a b.n 8030b22 <snmp_msg_event+0xc2>
  54308. }
  54309. }
  54310. else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_VALUE)
  54311. 8030acc: 2b08 cmp r3, #8
  54312. 8030ace: f040 8098 bne.w 8030c02 <snmp_msg_event+0x1a2>
  54313. /* get_value() answer */
  54314. en = msg_ps->ext_mib_node;
  54315. LWIP_ASSERT("invalid length", msg_ps->ext_object_def.v_len <= 0xff);
  54316. vb = snmp_varbind_alloc(&msg_ps->ext_oid,
  54317. 8030ad2: f104 0074 add.w r0, r4, #116 ; 0x74
  54318. 8030ad6: f894 106a ldrb.w r1, [r4, #106] ; 0x6a
  54319. 8030ada: f894 206c ldrb.w r2, [r4, #108] ; 0x6c
  54320. {
  54321. struct mib_external_node *en;
  54322. struct snmp_varbind *vb;
  54323. /* get_value() answer */
  54324. en = msg_ps->ext_mib_node;
  54325. 8030ade: f8d4 805c ldr.w r8, [r4, #92] ; 0x5c
  54326. LWIP_ASSERT("invalid length", msg_ps->ext_object_def.v_len <= 0xff);
  54327. vb = snmp_varbind_alloc(&msg_ps->ext_oid,
  54328. 8030ae2: f7ff ff05 bl 80308f0 <snmp_varbind_alloc>
  54329. msg_ps->ext_object_def.asn_type,
  54330. (u8_t)msg_ps->ext_object_def.v_len);
  54331. if (vb != NULL)
  54332. 8030ae6: 4607 mov r7, r0
  54333. 8030ae8: b1a0 cbz r0, 8030b14 <snmp_msg_event+0xb4>
  54334. {
  54335. en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value);
  54336. 8030aea: 697b ldr r3, [r7, #20]
  54337. 8030aec: f8d8 c03c ldr.w ip, [r8, #60] ; 0x3c
  54338. 8030af0: 7c7a ldrb r2, [r7, #17]
  54339. 8030af2: 4628 mov r0, r5
  54340. 8030af4: f104 0168 add.w r1, r4, #104 ; 0x68
  54341. 8030af8: 47e0 blx ip
  54342. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  54343. 8030afa: f504 7086 add.w r0, r4, #268 ; 0x10c
  54344. 8030afe: 4639 mov r1, r7
  54345. 8030b00: f7ff ffa2 bl 8030a48 <snmp_varbind_tail_add>
  54346. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  54347. msg_ps->vb_idx += 1;
  54348. 8030b04: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  54349. (u8_t)msg_ps->ext_object_def.v_len);
  54350. if (vb != NULL)
  54351. {
  54352. en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value);
  54353. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  54354. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  54355. 8030b08: f884 605a strb.w r6, [r4, #90] ; 0x5a
  54356. msg_ps->vb_idx += 1;
  54357. 8030b0c: 3301 adds r3, #1
  54358. 8030b0e: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  54359. 8030b12: e076 b.n 8030c02 <snmp_msg_event+0x1a2>
  54360. }
  54361. else
  54362. {
  54363. en->get_value_pc(request_id, &msg_ps->ext_object_def);
  54364. 8030b14: f104 0168 add.w r1, r4, #104 ; 0x68
  54365. 8030b18: f8d8 304c ldr.w r3, [r8, #76] ; 0x4c
  54366. 8030b1c: 4798 blx r3
  54367. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: couldn't allocate outvb space\n"));
  54368. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  54369. 8030b1e: 4620 mov r0, r4
  54370. 8030b20: 4631 mov r1, r6
  54371. 8030b22: f7ff ff46 bl 80309b2 <snmp_error_response>
  54372. 8030b26: e06c b.n 8030c02 <snmp_msg_event+0x1a2>
  54373. (msg_ps->vb_idx < msg_ps->invb.count))
  54374. {
  54375. struct mib_node *mn;
  54376. struct snmp_obj_id oid;
  54377. if (msg_ps->vb_idx == 0)
  54378. 8030b28: b913 cbnz r3, 8030b30 <snmp_msg_event+0xd0>
  54379. {
  54380. msg_ps->vb_ptr = msg_ps->invb.head;
  54381. 8030b2a: f8d4 3100 ldr.w r3, [r4, #256] ; 0x100
  54382. 8030b2e: e002 b.n 8030b36 <snmp_msg_event+0xd6>
  54383. }
  54384. else
  54385. {
  54386. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  54387. 8030b30: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  54388. 8030b34: 681b ldr r3, [r3, #0]
  54389. 8030b36: f8c4 30fc str.w r3, [r4, #252] ; 0xfc
  54390. }
  54391. if (snmp_iso_prefix_expand(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident, &oid))
  54392. 8030b3a: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  54393. 8030b3e: aa05 add r2, sp, #20
  54394. 8030b40: 7a18 ldrb r0, [r3, #8]
  54395. 8030b42: 68d9 ldr r1, [r3, #12]
  54396. 8030b44: f7ff fe82 bl 803084c <snmp_iso_prefix_expand>
  54397. 8030b48: 2800 cmp r0, #0
  54398. 8030b4a: f000 82ff beq.w 803114c <snmp_msg_event+0x6ec>
  54399. {
  54400. if (msg_ps->vb_ptr->ident_len > 3)
  54401. 8030b4e: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  54402. 8030b52: 7a19 ldrb r1, [r3, #8]
  54403. 8030b54: 2903 cmp r1, #3
  54404. 8030b56: d905 bls.n 8030b64 <snmp_msg_event+0x104>
  54405. {
  54406. /* can offset ident_len and ident */
  54407. mn = snmp_expand_tree((struct mib_node*)&internet,
  54408. 8030b58: 68da ldr r2, [r3, #12]
  54409. 8030b5a: 4878 ldr r0, [pc, #480] ; (8030d3c <snmp_msg_event+0x2dc>)
  54410. 8030b5c: 3904 subs r1, #4
  54411. 8030b5e: b2c9 uxtb r1, r1
  54412. 8030b60: 3210 adds r2, #16
  54413. 8030b62: e002 b.n 8030b6a <snmp_msg_event+0x10a>
  54414. msg_ps->vb_ptr->ident + 4, &oid);
  54415. }
  54416. else
  54417. {
  54418. /* can't offset ident_len -4, ident + 4 */
  54419. mn = snmp_expand_tree((struct mib_node*)&internet, 0, NULL, &oid);
  54420. 8030b64: 2100 movs r1, #0
  54421. 8030b66: 4875 ldr r0, [pc, #468] ; (8030d3c <snmp_msg_event+0x2dc>)
  54422. 8030b68: 460a mov r2, r1
  54423. 8030b6a: ab05 add r3, sp, #20
  54424. 8030b6c: f7ff fc8e bl 803048c <snmp_expand_tree>
  54425. 8030b70: 4605 mov r5, r0
  54426. }
  54427. else
  54428. {
  54429. mn = NULL;
  54430. }
  54431. if (mn != NULL)
  54432. 8030b72: 2800 cmp r0, #0
  54433. 8030b74: f000 82ea beq.w 803114c <snmp_msg_event+0x6ec>
  54434. {
  54435. if (mn->node_type == MIB_NODE_EX)
  54436. 8030b78: 7c03 ldrb r3, [r0, #16]
  54437. 8030b7a: 2b05 cmp r3, #5
  54438. 8030b7c: d113 bne.n 8030ba6 <snmp_msg_event+0x146>
  54439. {
  54440. /* external object */
  54441. struct mib_external_node *en = (struct mib_external_node*)mn;
  54442. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  54443. 8030b7e: 2307 movs r3, #7
  54444. /* save en && args in msg_ps!! */
  54445. msg_ps->ext_mib_node = en;
  54446. 8030b80: 65e0 str r0, [r4, #92] ; 0x5c
  54447. msg_ps->ext_oid = oid;
  54448. 8030b82: a905 add r1, sp, #20
  54449. 8030b84: 2284 movs r2, #132 ; 0x84
  54450. 8030b86: 486e ldr r0, [pc, #440] ; (8030d40 <snmp_msg_event+0x2e0>)
  54451. if (mn->node_type == MIB_NODE_EX)
  54452. {
  54453. /* external object */
  54454. struct mib_external_node *en = (struct mib_external_node*)mn;
  54455. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  54456. 8030b88: f884 305a strb.w r3, [r4, #90] ; 0x5a
  54457. /* save en && args in msg_ps!! */
  54458. msg_ps->ext_mib_node = en;
  54459. msg_ps->ext_oid = oid;
  54460. 8030b8c: f7f0 fd5a bl 8021644 <memcpy>
  54461. en->get_object_def_q(en->addr_inf, request_id, 1, &oid.id[oid.len - 1]);
  54462. 8030b90: f89d 3014 ldrb.w r3, [sp, #20]
  54463. 8030b94: 6aae ldr r6, [r5, #40] ; 0x28
  54464. 8030b96: 6968 ldr r0, [r5, #20]
  54465. 8030b98: ad05 add r5, sp, #20
  54466. 8030b9a: 2100 movs r1, #0
  54467. 8030b9c: 2201 movs r2, #1
  54468. 8030b9e: eb05 0383 add.w r3, r5, r3, lsl #2
  54469. 8030ba2: 47b0 blx r6
  54470. 8030ba4: e02e b.n 8030c04 <snmp_msg_event+0x1a4>
  54471. {
  54472. /* internal object */
  54473. struct obj_def object_def;
  54474. struct snmp_varbind *vb;
  54475. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  54476. 8030ba6: 2302 movs r3, #2
  54477. mn->get_object_def(1, &oid.id[oid.len - 1], &object_def);
  54478. 8030ba8: f89d 1014 ldrb.w r1, [sp, #20]
  54479. {
  54480. /* internal object */
  54481. struct obj_def object_def;
  54482. struct snmp_varbind *vb;
  54483. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  54484. 8030bac: f884 305a strb.w r3, [r4, #90] ; 0x5a
  54485. mn->get_object_def(1, &oid.id[oid.len - 1], &object_def);
  54486. 8030bb0: af05 add r7, sp, #20
  54487. 8030bb2: 6803 ldr r3, [r0, #0]
  54488. 8030bb4: eb07 0181 add.w r1, r7, r1, lsl #2
  54489. 8030bb8: 2001 movs r0, #1
  54490. 8030bba: aa02 add r2, sp, #8
  54491. 8030bbc: 4798 blx r3
  54492. LWIP_ASSERT("invalid length", object_def.v_len <= 0xff);
  54493. vb = snmp_varbind_alloc(&oid, object_def.asn_type, (u8_t)object_def.v_len);
  54494. 8030bbe: a805 add r0, sp, #20
  54495. 8030bc0: f89d 100a ldrb.w r1, [sp, #10]
  54496. 8030bc4: f89d 200c ldrb.w r2, [sp, #12]
  54497. 8030bc8: f7ff fe92 bl 80308f0 <snmp_varbind_alloc>
  54498. if (vb != NULL)
  54499. 8030bcc: 4606 mov r6, r0
  54500. 8030bce: b1a8 cbz r0, 8030bfc <snmp_msg_event+0x19c>
  54501. {
  54502. msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
  54503. 8030bd0: 2303 movs r3, #3
  54504. 8030bd2: f884 305a strb.w r3, [r4, #90] ; 0x5a
  54505. mn->get_value(&object_def, object_def.v_len, vb->value);
  54506. 8030bd6: 686b ldr r3, [r5, #4]
  54507. 8030bd8: f8bd 100c ldrh.w r1, [sp, #12]
  54508. 8030bdc: 6972 ldr r2, [r6, #20]
  54509. 8030bde: a802 add r0, sp, #8
  54510. 8030be0: 4798 blx r3
  54511. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  54512. 8030be2: 4858 ldr r0, [pc, #352] ; (8030d44 <snmp_msg_event+0x2e4>)
  54513. 8030be4: 4631 mov r1, r6
  54514. 8030be6: f7ff ff2f bl 8030a48 <snmp_varbind_tail_add>
  54515. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  54516. 8030bea: 2301 movs r3, #1
  54517. 8030bec: f884 305a strb.w r3, [r4, #90] ; 0x5a
  54518. msg_ps->vb_idx += 1;
  54519. 8030bf0: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  54520. 8030bf4: 3301 adds r3, #1
  54521. 8030bf6: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  54522. 8030bfa: e003 b.n 8030c04 <snmp_msg_event+0x1a4>
  54523. }
  54524. else
  54525. {
  54526. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv couldn't allocate outvb space\n"));
  54527. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  54528. 8030bfc: 484e ldr r0, [pc, #312] ; (8030d38 <snmp_msg_event+0x2d8>)
  54529. 8030bfe: 2101 movs r1, #1
  54530. 8030c00: e2a6 b.n 8031150 <snmp_msg_event+0x6f0>
  54531. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: couldn't allocate outvb space\n"));
  54532. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  54533. }
  54534. }
  54535. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  54536. 8030c02: 4c4d ldr r4, [pc, #308] ; (8030d38 <snmp_msg_event+0x2d8>)
  54537. 8030c04: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  54538. 8030c08: 2b01 cmp r3, #1
  54539. 8030c0a: f040 82c0 bne.w 803118e <snmp_msg_event+0x72e>
  54540. (msg_ps->vb_idx < msg_ps->invb.count))
  54541. 8030c0e: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  54542. 8030c12: f894 2108 ldrb.w r2, [r4, #264] ; 0x108
  54543. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: couldn't allocate outvb space\n"));
  54544. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  54545. }
  54546. }
  54547. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  54548. 8030c16: 4293 cmp r3, r2
  54549. 8030c18: d386 bcc.n 8030b28 <snmp_msg_event+0xc8>
  54550. 8030c1a: e2a7 b.n 803116c <snmp_msg_event+0x70c>
  54551. }
  54552. }
  54553. if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  54554. (msg_ps->vb_idx == msg_ps->invb.count))
  54555. {
  54556. snmp_ok_response(msg_ps);
  54557. 8030c1c: 4846 ldr r0, [pc, #280] ; (8030d38 <snmp_msg_event+0x2d8>)
  54558. 8030c1e: e292 b.n 8031146 <snmp_msg_event+0x6e6>
  54559. msg_ps = &msg_input_list[request_id];
  54560. if (msg_ps->rt == SNMP_ASN1_PDU_GET_NEXT_REQ)
  54561. {
  54562. snmp_msg_getnext_event(request_id, msg_ps);
  54563. }
  54564. else if (msg_ps->rt == SNMP_ASN1_PDU_GET_REQ)
  54565. 8030c20: 2e00 cmp r6, #0
  54566. 8030c22: f040 8126 bne.w 8030e72 <snmp_msg_event+0x412>
  54567. static void
  54568. snmp_msg_get_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
  54569. {
  54570. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_get_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state));
  54571. if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
  54572. 8030c26: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  54573. 8030c2a: 2b07 cmp r3, #7
  54574. 8030c2c: d122 bne.n 8030c74 <snmp_msg_event+0x214>
  54575. {
  54576. struct mib_external_node *en;
  54577. struct snmp_name_ptr np;
  54578. /* get_object_def() answer*/
  54579. en = msg_ps->ext_mib_node;
  54580. 8030c2e: 6de5 ldr r5, [r4, #92] ; 0x5c
  54581. np = msg_ps->ext_name_ptr;
  54582. 8030c30: f894 9060 ldrb.w r9, [r4, #96] ; 0x60
  54583. 8030c34: f8d4 8064 ldr.w r8, [r4, #100] ; 0x64
  54584. /* translate answer into a known lifeform */
  54585. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  54586. 8030c38: 6baf ldr r7, [r5, #56] ; 0x38
  54587. 8030c3a: f104 0368 add.w r3, r4, #104 ; 0x68
  54588. 8030c3e: 4649 mov r1, r9
  54589. 8030c40: 4642 mov r2, r8
  54590. 8030c42: 47b8 blx r7
  54591. if ((msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) &&
  54592. 8030c44: f894 3068 ldrb.w r3, [r4, #104] ; 0x68
  54593. 8030c48: b163 cbz r3, 8030c64 <snmp_msg_event+0x204>
  54594. (msg_ps->ext_object_def.access & MIB_ACCESS_READ))
  54595. 8030c4a: f894 3069 ldrb.w r3, [r4, #105] ; 0x69
  54596. en = msg_ps->ext_mib_node;
  54597. np = msg_ps->ext_name_ptr;
  54598. /* translate answer into a known lifeform */
  54599. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  54600. if ((msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) &&
  54601. 8030c4e: 07da lsls r2, r3, #31
  54602. 8030c50: d508 bpl.n 8030c64 <snmp_msg_event+0x204>
  54603. (msg_ps->ext_object_def.access & MIB_ACCESS_READ))
  54604. {
  54605. msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE;
  54606. 8030c52: 2308 movs r3, #8
  54607. 8030c54: f884 305a strb.w r3, [r4, #90] ; 0x5a
  54608. en->get_value_q(request_id, &msg_ps->ext_object_def);
  54609. 8030c58: 6aeb ldr r3, [r5, #44] ; 0x2c
  54610. 8030c5a: 4630 mov r0, r6
  54611. 8030c5c: f104 0168 add.w r1, r4, #104 ; 0x68
  54612. 8030c60: 4798 blx r3
  54613. 8030c62: e0f7 b.n 8030e54 <snmp_msg_event+0x3f4>
  54614. }
  54615. else
  54616. {
  54617. en->get_object_def_pc(request_id, np.ident_len, np.ident);
  54618. 8030c64: 2000 movs r0, #0
  54619. 8030c66: 4649 mov r1, r9
  54620. 8030c68: 6cab ldr r3, [r5, #72] ; 0x48
  54621. 8030c6a: 4642 mov r2, r8
  54622. 8030c6c: 4798 blx r3
  54623. /* search failed, object id points to unknown object (nosuchname) */
  54624. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  54625. 8030c6e: 4832 ldr r0, [pc, #200] ; (8030d38 <snmp_msg_event+0x2d8>)
  54626. 8030c70: 2102 movs r1, #2
  54627. 8030c72: e059 b.n 8030d28 <snmp_msg_event+0x2c8>
  54628. }
  54629. }
  54630. else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_VALUE)
  54631. 8030c74: 2b08 cmp r3, #8
  54632. 8030c76: f040 80ed bne.w 8030e54 <snmp_msg_event+0x3f4>
  54633. /* get_value() answer */
  54634. en = msg_ps->ext_mib_node;
  54635. /* allocate output varbind */
  54636. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  54637. 8030c7a: 200c movs r0, #12
  54638. {
  54639. struct mib_external_node *en;
  54640. struct snmp_varbind *vb;
  54641. /* get_value() answer */
  54642. en = msg_ps->ext_mib_node;
  54643. 8030c7c: f8d4 805c ldr.w r8, [r4, #92] ; 0x5c
  54644. /* allocate output varbind */
  54645. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  54646. 8030c80: f7fa f9c6 bl 802b010 <memp_malloc>
  54647. if (vb != NULL)
  54648. 8030c84: 4605 mov r5, r0
  54649. 8030c86: 2800 cmp r0, #0
  54650. 8030c88: d047 beq.n 8030d1a <snmp_msg_event+0x2ba>
  54651. {
  54652. vb->next = NULL;
  54653. 8030c8a: 6006 str r6, [r0, #0]
  54654. vb->prev = NULL;
  54655. 8030c8c: 6046 str r6, [r0, #4]
  54656. /* move name from invb to outvb */
  54657. vb->ident = msg_ps->vb_ptr->ident;
  54658. 8030c8e: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  54659. 8030c92: 68da ldr r2, [r3, #12]
  54660. vb->ident_len = msg_ps->vb_ptr->ident_len;
  54661. 8030c94: 7a1b ldrb r3, [r3, #8]
  54662. {
  54663. vb->next = NULL;
  54664. vb->prev = NULL;
  54665. /* move name from invb to outvb */
  54666. vb->ident = msg_ps->vb_ptr->ident;
  54667. 8030c96: 60c2 str r2, [r0, #12]
  54668. vb->ident_len = msg_ps->vb_ptr->ident_len;
  54669. 8030c98: 7203 strb r3, [r0, #8]
  54670. /* ensure this memory is refereced once only */
  54671. msg_ps->vb_ptr->ident = NULL;
  54672. 8030c9a: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  54673. msg_ps->vb_ptr->ident_len = 0;
  54674. 8030c9e: 721e strb r6, [r3, #8]
  54675. /* move name from invb to outvb */
  54676. vb->ident = msg_ps->vb_ptr->ident;
  54677. vb->ident_len = msg_ps->vb_ptr->ident_len;
  54678. /* ensure this memory is refereced once only */
  54679. msg_ps->vb_ptr->ident = NULL;
  54680. 8030ca0: 60de str r6, [r3, #12]
  54681. msg_ps->vb_ptr->ident_len = 0;
  54682. vb->value_type = msg_ps->ext_object_def.asn_type;
  54683. 8030ca2: f894 306a ldrb.w r3, [r4, #106] ; 0x6a
  54684. 8030ca6: 7403 strb r3, [r0, #16]
  54685. LWIP_ASSERT("invalid length", msg_ps->ext_object_def.v_len <= 0xff);
  54686. vb->value_len = (u8_t)msg_ps->ext_object_def.v_len;
  54687. 8030ca8: f894 706c ldrb.w r7, [r4, #108] ; 0x6c
  54688. 8030cac: 7447 strb r7, [r0, #17]
  54689. if (vb->value_len > 0)
  54690. 8030cae: b1ef cbz r7, 8030cec <snmp_msg_event+0x28c>
  54691. {
  54692. LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low", vb->value_len <= SNMP_MAX_VALUE_SIZE);
  54693. vb->value = memp_malloc(MEMP_SNMP_VALUE);
  54694. 8030cb0: 200d movs r0, #13
  54695. 8030cb2: f7fa f9ad bl 802b010 <memp_malloc>
  54696. 8030cb6: 4603 mov r3, r0
  54697. 8030cb8: 6168 str r0, [r5, #20]
  54698. if (vb->value != NULL)
  54699. 8030cba: b138 cbz r0, 8030ccc <snmp_msg_event+0x26c>
  54700. {
  54701. en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value);
  54702. 8030cbc: f8d8 703c ldr.w r7, [r8, #60] ; 0x3c
  54703. 8030cc0: 7c6a ldrb r2, [r5, #17]
  54704. 8030cc2: 4630 mov r0, r6
  54705. 8030cc4: f104 0168 add.w r1, r4, #104 ; 0x68
  54706. 8030cc8: 47b8 blx r7
  54707. 8030cca: e018 b.n 8030cfe <snmp_msg_event+0x29e>
  54708. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  54709. msg_ps->vb_idx += 1;
  54710. }
  54711. else
  54712. {
  54713. en->get_value_pc(request_id, &msg_ps->ext_object_def);
  54714. 8030ccc: f8d8 304c ldr.w r3, [r8, #76] ; 0x4c
  54715. 8030cd0: f104 0168 add.w r1, r4, #104 ; 0x68
  54716. 8030cd4: 4798 blx r3
  54717. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no variable space\n"));
  54718. msg_ps->vb_ptr->ident = vb->ident;
  54719. 8030cd6: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  54720. 8030cda: 68ea ldr r2, [r5, #12]
  54721. 8030cdc: 60da str r2, [r3, #12]
  54722. msg_ps->vb_ptr->ident_len = vb->ident_len;
  54723. 8030cde: 7a2a ldrb r2, [r5, #8]
  54724. memp_free(MEMP_SNMP_VARBIND, vb);
  54725. 8030ce0: 200c movs r0, #12
  54726. else
  54727. {
  54728. en->get_value_pc(request_id, &msg_ps->ext_object_def);
  54729. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no variable space\n"));
  54730. msg_ps->vb_ptr->ident = vb->ident;
  54731. msg_ps->vb_ptr->ident_len = vb->ident_len;
  54732. 8030ce2: 721a strb r2, [r3, #8]
  54733. memp_free(MEMP_SNMP_VARBIND, vb);
  54734. 8030ce4: 4629 mov r1, r5
  54735. 8030ce6: f7fa f9a9 bl 802b03c <memp_free>
  54736. 8030cea: e01b b.n 8030d24 <snmp_msg_event+0x2c4>
  54737. }
  54738. }
  54739. else
  54740. {
  54741. /* vb->value_len == 0, empty value (e.g. empty string) */
  54742. en->get_value_a(request_id, &msg_ps->ext_object_def, 0, NULL);
  54743. 8030cec: f8d8 603c ldr.w r6, [r8, #60] ; 0x3c
  54744. 8030cf0: 4638 mov r0, r7
  54745. 8030cf2: f104 0168 add.w r1, r4, #104 ; 0x68
  54746. 8030cf6: 463a mov r2, r7
  54747. 8030cf8: 463b mov r3, r7
  54748. 8030cfa: 47b0 blx r6
  54749. vb->value = NULL;
  54750. 8030cfc: 616f str r7, [r5, #20]
  54751. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  54752. 8030cfe: f504 7086 add.w r0, r4, #268 ; 0x10c
  54753. 8030d02: 4629 mov r1, r5
  54754. 8030d04: f7ff fea0 bl 8030a48 <snmp_varbind_tail_add>
  54755. /* search again (if vb_idx < msg_ps->invb.count) */
  54756. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  54757. 8030d08: 2301 movs r3, #1
  54758. 8030d0a: f884 305a strb.w r3, [r4, #90] ; 0x5a
  54759. msg_ps->vb_idx += 1;
  54760. 8030d0e: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  54761. 8030d12: 3301 adds r3, #1
  54762. 8030d14: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  54763. 8030d18: e09c b.n 8030e54 <snmp_msg_event+0x3f4>
  54764. }
  54765. }
  54766. else
  54767. {
  54768. en->get_value_pc(request_id, &msg_ps->ext_object_def);
  54769. 8030d1a: f8d8 304c ldr.w r3, [r8, #76] ; 0x4c
  54770. 8030d1e: f104 0168 add.w r1, r4, #104 ; 0x68
  54771. 8030d22: 4798 blx r3
  54772. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n"));
  54773. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  54774. 8030d24: 4620 mov r0, r4
  54775. 8030d26: 2101 movs r1, #1
  54776. 8030d28: f7ff fe43 bl 80309b2 <snmp_error_response>
  54777. 8030d2c: e092 b.n 8030e54 <snmp_msg_event+0x3f4>
  54778. (msg_ps->vb_idx < msg_ps->invb.count))
  54779. {
  54780. struct mib_node *mn;
  54781. struct snmp_name_ptr np;
  54782. if (msg_ps->vb_idx == 0)
  54783. 8030d2e: b95b cbnz r3, 8030d48 <snmp_msg_event+0x2e8>
  54784. {
  54785. msg_ps->vb_ptr = msg_ps->invb.head;
  54786. 8030d30: f8d4 3100 ldr.w r3, [r4, #256] ; 0x100
  54787. 8030d34: e00b b.n 8030d4e <snmp_msg_event+0x2ee>
  54788. 8030d36: bf00 nop
  54789. 8030d38: 20010dac .word 0x20010dac
  54790. 8030d3c: 0803b428 .word 0x0803b428
  54791. 8030d40: 20010e20 .word 0x20010e20
  54792. 8030d44: 20010eb8 .word 0x20010eb8
  54793. }
  54794. else
  54795. {
  54796. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  54797. 8030d48: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  54798. 8030d4c: 681b ldr r3, [r3, #0]
  54799. 8030d4e: f8c4 30fc str.w r3, [r4, #252] ; 0xfc
  54800. }
  54801. /** test object identifier for .iso.org.dod.internet prefix */
  54802. if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
  54803. 8030d52: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  54804. 8030d56: 7a18 ldrb r0, [r3, #8]
  54805. 8030d58: 68d9 ldr r1, [r3, #12]
  54806. 8030d5a: f7ff fd65 bl 8030828 <snmp_iso_prefix_tst>
  54807. 8030d5e: 2800 cmp r0, #0
  54808. 8030d60: d073 beq.n 8030e4a <snmp_msg_event+0x3ea>
  54809. {
  54810. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  54811. 8030d62: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  54812. 8030d66: 48a6 ldr r0, [pc, #664] ; (8031000 <snmp_msg_event+0x5a0>)
  54813. 8030d68: 7a19 ldrb r1, [r3, #8]
  54814. 8030d6a: 68da ldr r2, [r3, #12]
  54815. 8030d6c: 3904 subs r1, #4
  54816. 8030d6e: b2c9 uxtb r1, r1
  54817. 8030d70: 3210 adds r2, #16
  54818. 8030d72: 466b mov r3, sp
  54819. 8030d74: f7ff fb0a bl 803038c <snmp_search_tree>
  54820. msg_ps->vb_ptr->ident + 4, &np);
  54821. if (mn != NULL)
  54822. 8030d78: 4606 mov r6, r0
  54823. 8030d7a: 2800 cmp r0, #0
  54824. 8030d7c: d065 beq.n 8030e4a <snmp_msg_event+0x3ea>
  54825. {
  54826. if (mn->node_type == MIB_NODE_EX)
  54827. 8030d7e: 7c03 ldrb r3, [r0, #16]
  54828. 8030d80: 2b05 cmp r3, #5
  54829. 8030d82: d110 bne.n 8030da6 <snmp_msg_event+0x346>
  54830. /* external object */
  54831. struct mib_external_node *en = (struct mib_external_node*)mn;
  54832. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  54833. /* save en && args in msg_ps!! */
  54834. msg_ps->ext_mib_node = en;
  54835. 8030d84: 65e0 str r0, [r4, #92] ; 0x5c
  54836. if (mn->node_type == MIB_NODE_EX)
  54837. {
  54838. /* external object */
  54839. struct mib_external_node *en = (struct mib_external_node*)mn;
  54840. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  54841. 8030d86: 2307 movs r3, #7
  54842. /* save en && args in msg_ps!! */
  54843. msg_ps->ext_mib_node = en;
  54844. msg_ps->ext_name_ptr = np;
  54845. 8030d88: e898 0003 ldmia.w r8, {r0, r1}
  54846. if (mn->node_type == MIB_NODE_EX)
  54847. {
  54848. /* external object */
  54849. struct mib_external_node *en = (struct mib_external_node*)mn;
  54850. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  54851. 8030d8c: f884 305a strb.w r3, [r4, #90] ; 0x5a
  54852. /* save en && args in msg_ps!! */
  54853. msg_ps->ext_mib_node = en;
  54854. msg_ps->ext_name_ptr = np;
  54855. 8030d90: 4b9c ldr r3, [pc, #624] ; (8031004 <snmp_msg_event+0x5a4>)
  54856. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  54857. 8030d92: f89d 2000 ldrb.w r2, [sp]
  54858. struct mib_external_node *en = (struct mib_external_node*)mn;
  54859. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  54860. /* save en && args in msg_ps!! */
  54861. msg_ps->ext_mib_node = en;
  54862. msg_ps->ext_name_ptr = np;
  54863. 8030d96: e883 0003 stmia.w r3, {r0, r1}
  54864. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  54865. 8030d9a: 2100 movs r1, #0
  54866. 8030d9c: 6ab5 ldr r5, [r6, #40] ; 0x28
  54867. 8030d9e: 6970 ldr r0, [r6, #20]
  54868. 8030da0: 9b01 ldr r3, [sp, #4]
  54869. 8030da2: 47a8 blx r5
  54870. 8030da4: e058 b.n 8030e58 <snmp_msg_event+0x3f8>
  54871. else
  54872. {
  54873. /* internal object */
  54874. struct obj_def object_def;
  54875. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  54876. 8030da6: 2302 movs r3, #2
  54877. 8030da8: f884 305a strb.w r3, [r4, #90] ; 0x5a
  54878. mn->get_object_def(np.ident_len, np.ident, &object_def);
  54879. 8030dac: 6803 ldr r3, [r0, #0]
  54880. 8030dae: 9901 ldr r1, [sp, #4]
  54881. 8030db0: f89d 0000 ldrb.w r0, [sp]
  54882. 8030db4: aa02 add r2, sp, #8
  54883. 8030db6: 4798 blx r3
  54884. if ((object_def.instance != MIB_OBJECT_NONE) &&
  54885. 8030db8: f89d 3008 ldrb.w r3, [sp, #8]
  54886. 8030dbc: 2b00 cmp r3, #0
  54887. 8030dbe: d044 beq.n 8030e4a <snmp_msg_event+0x3ea>
  54888. (object_def.access & MIB_ACCESS_READ))
  54889. 8030dc0: f89d 3009 ldrb.w r3, [sp, #9]
  54890. /* internal object */
  54891. struct obj_def object_def;
  54892. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  54893. mn->get_object_def(np.ident_len, np.ident, &object_def);
  54894. if ((object_def.instance != MIB_OBJECT_NONE) &&
  54895. 8030dc4: 07db lsls r3, r3, #31
  54896. 8030dc6: f100 81c6 bmi.w 8031156 <snmp_msg_event+0x6f6>
  54897. 8030dca: e03e b.n 8030e4a <snmp_msg_event+0x3ea>
  54898. msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
  54899. /* allocate output varbind */
  54900. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  54901. if (vb != NULL)
  54902. {
  54903. vb->next = NULL;
  54904. 8030dcc: 2200 movs r2, #0
  54905. 8030dce: 602a str r2, [r5, #0]
  54906. vb->prev = NULL;
  54907. 8030dd0: 606a str r2, [r5, #4]
  54908. /* move name from invb to outvb */
  54909. vb->ident = msg_ps->vb_ptr->ident;
  54910. 8030dd2: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  54911. 8030dd6: 68d9 ldr r1, [r3, #12]
  54912. vb->ident_len = msg_ps->vb_ptr->ident_len;
  54913. 8030dd8: 7a1b ldrb r3, [r3, #8]
  54914. {
  54915. vb->next = NULL;
  54916. vb->prev = NULL;
  54917. /* move name from invb to outvb */
  54918. vb->ident = msg_ps->vb_ptr->ident;
  54919. 8030dda: 60e9 str r1, [r5, #12]
  54920. vb->ident_len = msg_ps->vb_ptr->ident_len;
  54921. 8030ddc: 722b strb r3, [r5, #8]
  54922. /* ensure this memory is refereced once only */
  54923. msg_ps->vb_ptr->ident = NULL;
  54924. 8030dde: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  54925. msg_ps->vb_ptr->ident_len = 0;
  54926. 8030de2: 721a strb r2, [r3, #8]
  54927. /* move name from invb to outvb */
  54928. vb->ident = msg_ps->vb_ptr->ident;
  54929. vb->ident_len = msg_ps->vb_ptr->ident_len;
  54930. /* ensure this memory is refereced once only */
  54931. msg_ps->vb_ptr->ident = NULL;
  54932. 8030de4: 60da str r2, [r3, #12]
  54933. msg_ps->vb_ptr->ident_len = 0;
  54934. vb->value_type = object_def.asn_type;
  54935. 8030de6: f89d 300a ldrb.w r3, [sp, #10]
  54936. 8030dea: 742b strb r3, [r5, #16]
  54937. LWIP_ASSERT("invalid length", object_def.v_len <= 0xff);
  54938. vb->value_len = (u8_t)object_def.v_len;
  54939. 8030dec: f89d 300c ldrb.w r3, [sp, #12]
  54940. 8030df0: 746b strb r3, [r5, #17]
  54941. if (vb->value_len > 0)
  54942. 8030df2: b1bb cbz r3, 8030e24 <snmp_msg_event+0x3c4>
  54943. {
  54944. LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low",
  54945. vb->value_len <= SNMP_MAX_VALUE_SIZE);
  54946. vb->value = memp_malloc(MEMP_SNMP_VALUE);
  54947. 8030df4: 200d movs r0, #13
  54948. 8030df6: f7fa f90b bl 802b010 <memp_malloc>
  54949. 8030dfa: 4602 mov r2, r0
  54950. 8030dfc: 6168 str r0, [r5, #20]
  54951. if (vb->value != NULL)
  54952. 8030dfe: b120 cbz r0, 8030e0a <snmp_msg_event+0x3aa>
  54953. {
  54954. mn->get_value(&object_def, vb->value_len, vb->value);
  54955. 8030e00: 6877 ldr r7, [r6, #4]
  54956. 8030e02: 7c69 ldrb r1, [r5, #17]
  54957. 8030e04: a802 add r0, sp, #8
  54958. 8030e06: 47b8 blx r7
  54959. 8030e08: e00d b.n 8030e26 <snmp_msg_event+0x3c6>
  54960. msg_ps->vb_idx += 1;
  54961. }
  54962. else
  54963. {
  54964. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: couldn't allocate variable space\n"));
  54965. msg_ps->vb_ptr->ident = vb->ident;
  54966. 8030e0a: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  54967. 8030e0e: 68e9 ldr r1, [r5, #12]
  54968. 8030e10: 60d9 str r1, [r3, #12]
  54969. msg_ps->vb_ptr->ident_len = vb->ident_len;
  54970. 8030e12: 7a29 ldrb r1, [r5, #8]
  54971. vb->ident = NULL;
  54972. 8030e14: 60e8 str r0, [r5, #12]
  54973. }
  54974. else
  54975. {
  54976. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: couldn't allocate variable space\n"));
  54977. msg_ps->vb_ptr->ident = vb->ident;
  54978. msg_ps->vb_ptr->ident_len = vb->ident_len;
  54979. 8030e16: 7219 strb r1, [r3, #8]
  54980. vb->ident = NULL;
  54981. vb->ident_len = 0;
  54982. 8030e18: 7228 strb r0, [r5, #8]
  54983. memp_free(MEMP_SNMP_VARBIND, vb);
  54984. 8030e1a: 4629 mov r1, r5
  54985. 8030e1c: 200c movs r0, #12
  54986. 8030e1e: f7fa f90d bl 802b03c <memp_free>
  54987. 8030e22: e00d b.n 8030e40 <snmp_msg_event+0x3e0>
  54988. }
  54989. }
  54990. else
  54991. {
  54992. /* vb->value_len == 0, empty value (e.g. empty string) */
  54993. vb->value = NULL;
  54994. 8030e24: 616b str r3, [r5, #20]
  54995. snmp_varbind_tail_add(&msg_ps->outvb, vb);
  54996. 8030e26: 4878 ldr r0, [pc, #480] ; (8031008 <snmp_msg_event+0x5a8>)
  54997. 8030e28: 4629 mov r1, r5
  54998. 8030e2a: f7ff fe0d bl 8030a48 <snmp_varbind_tail_add>
  54999. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  55000. 8030e2e: 2301 movs r3, #1
  55001. 8030e30: f884 305a strb.w r3, [r4, #90] ; 0x5a
  55002. msg_ps->vb_idx += 1;
  55003. 8030e34: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  55004. 8030e38: 3301 adds r3, #1
  55005. 8030e3a: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  55006. 8030e3e: e003 b.n 8030e48 <snmp_msg_event+0x3e8>
  55007. }
  55008. }
  55009. else
  55010. {
  55011. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: couldn't allocate outvb space\n"));
  55012. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  55013. 8030e40: 4872 ldr r0, [pc, #456] ; (803100c <snmp_msg_event+0x5ac>)
  55014. 8030e42: 2101 movs r1, #1
  55015. 8030e44: f7ff fdb5 bl 80309b2 <snmp_error_response>
  55016. }
  55017. else
  55018. {
  55019. mn = NULL;
  55020. }
  55021. if (mn == NULL)
  55022. 8030e48: b936 cbnz r6, 8030e58 <snmp_msg_event+0x3f8>
  55023. {
  55024. /* mn == NULL, noSuchName */
  55025. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  55026. 8030e4a: 4870 ldr r0, [pc, #448] ; (803100c <snmp_msg_event+0x5ac>)
  55027. 8030e4c: 2102 movs r1, #2
  55028. 8030e4e: f7ff fdb0 bl 80309b2 <snmp_error_response>
  55029. 8030e52: e001 b.n 8030e58 <snmp_msg_event+0x3f8>
  55030. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n"));
  55031. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  55032. }
  55033. }
  55034. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  55035. 8030e54: 4c6d ldr r4, [pc, #436] ; (803100c <snmp_msg_event+0x5ac>)
  55036. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  55037. }
  55038. /** test object identifier for .iso.org.dod.internet prefix */
  55039. if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
  55040. {
  55041. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  55042. 8030e56: 46e8 mov r8, sp
  55043. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n"));
  55044. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  55045. }
  55046. }
  55047. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  55048. 8030e58: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  55049. 8030e5c: 2b01 cmp r3, #1
  55050. 8030e5e: f040 8196 bne.w 803118e <snmp_msg_event+0x72e>
  55051. (msg_ps->vb_idx < msg_ps->invb.count))
  55052. 8030e62: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  55053. 8030e66: f894 2108 ldrb.w r2, [r4, #264] ; 0x108
  55054. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n"));
  55055. snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
  55056. }
  55057. }
  55058. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  55059. 8030e6a: 4293 cmp r3, r2
  55060. 8030e6c: f4ff af5f bcc.w 8030d2e <snmp_msg_event+0x2ce>
  55061. 8030e70: e17c b.n 803116c <snmp_msg_event+0x70c>
  55062. }
  55063. else if (msg_ps->rt == SNMP_ASN1_PDU_GET_REQ)
  55064. {
  55065. snmp_msg_get_event(request_id, msg_ps);
  55066. }
  55067. else if(msg_ps->rt == SNMP_ASN1_PDU_SET_REQ)
  55068. 8030e72: 2e03 cmp r6, #3
  55069. 8030e74: f040 818b bne.w 803118e <snmp_msg_event+0x72e>
  55070. static void
  55071. snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
  55072. {
  55073. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_set_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state));
  55074. if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
  55075. 8030e78: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  55076. 8030e7c: 2b07 cmp r3, #7
  55077. 8030e7e: d11b bne.n 8030eb8 <snmp_msg_event+0x458>
  55078. {
  55079. struct mib_external_node *en;
  55080. struct snmp_name_ptr np;
  55081. /* get_object_def() answer*/
  55082. en = msg_ps->ext_mib_node;
  55083. 8030e80: 6de6 ldr r6, [r4, #92] ; 0x5c
  55084. np = msg_ps->ext_name_ptr;
  55085. 8030e82: f894 9060 ldrb.w r9, [r4, #96] ; 0x60
  55086. 8030e86: f8d4 8064 ldr.w r8, [r4, #100] ; 0x64
  55087. /* translate answer into a known lifeform */
  55088. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  55089. 8030e8a: 6bb7 ldr r7, [r6, #56] ; 0x38
  55090. 8030e8c: 4649 mov r1, r9
  55091. 8030e8e: 4642 mov r2, r8
  55092. 8030e90: f104 0368 add.w r3, r4, #104 ; 0x68
  55093. 8030e94: 47b8 blx r7
  55094. if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
  55095. 8030e96: f894 0068 ldrb.w r0, [r4, #104] ; 0x68
  55096. 8030e9a: b140 cbz r0, 8030eae <snmp_msg_event+0x44e>
  55097. {
  55098. msg_ps->state = SNMP_MSG_EXTERNAL_SET_TEST;
  55099. 8030e9c: 2309 movs r3, #9
  55100. 8030e9e: f884 305a strb.w r3, [r4, #90] ; 0x5a
  55101. en->set_test_q(request_id, &msg_ps->ext_object_def);
  55102. 8030ea2: 6b33 ldr r3, [r6, #48] ; 0x30
  55103. 8030ea4: 4628 mov r0, r5
  55104. 8030ea6: f104 0168 add.w r1, r4, #104 ; 0x68
  55105. 8030eaa: 4798 blx r3
  55106. 8030eac: e0d5 b.n 803105a <snmp_msg_event+0x5fa>
  55107. }
  55108. else
  55109. {
  55110. en->get_object_def_pc(request_id, np.ident_len, np.ident);
  55111. 8030eae: 6cb3 ldr r3, [r6, #72] ; 0x48
  55112. 8030eb0: 4649 mov r1, r9
  55113. 8030eb2: 4642 mov r2, r8
  55114. 8030eb4: 4798 blx r3
  55115. 8030eb6: e023 b.n 8030f00 <snmp_msg_event+0x4a0>
  55116. /* search failed, object id points to unknown object (nosuchname) */
  55117. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  55118. }
  55119. }
  55120. else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_TEST)
  55121. 8030eb8: 2b09 cmp r3, #9
  55122. 8030eba: d124 bne.n 8030f06 <snmp_msg_event+0x4a6>
  55123. struct mib_external_node *en;
  55124. /* set_test() answer*/
  55125. en = msg_ps->ext_mib_node;
  55126. if (msg_ps->ext_object_def.access & MIB_ACCESS_WRITE)
  55127. 8030ebc: f894 3069 ldrb.w r3, [r4, #105] ; 0x69
  55128. else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_TEST)
  55129. {
  55130. struct mib_external_node *en;
  55131. /* set_test() answer*/
  55132. en = msg_ps->ext_mib_node;
  55133. 8030ec0: 6de5 ldr r5, [r4, #92] ; 0x5c
  55134. if (msg_ps->ext_object_def.access & MIB_ACCESS_WRITE)
  55135. 8030ec2: f003 0302 and.w r3, r3, #2
  55136. 8030ec6: b2db uxtb r3, r3
  55137. 8030ec8: b1b3 cbz r3, 8030ef8 <snmp_msg_event+0x498>
  55138. {
  55139. if ((msg_ps->ext_object_def.asn_type == msg_ps->vb_ptr->value_type) &&
  55140. 8030eca: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  55141. 8030ece: f894 106a ldrb.w r1, [r4, #106] ; 0x6a
  55142. 8030ed2: 7c1a ldrb r2, [r3, #16]
  55143. 8030ed4: 4291 cmp r1, r2
  55144. 8030ed6: d108 bne.n 8030eea <snmp_msg_event+0x48a>
  55145. (en->set_test_a(request_id,&msg_ps->ext_object_def,
  55146. 8030ed8: 7c5a ldrb r2, [r3, #17]
  55147. 8030eda: 6c2e ldr r6, [r5, #64] ; 0x40
  55148. 8030edc: 695b ldr r3, [r3, #20]
  55149. 8030ede: f104 0168 add.w r1, r4, #104 ; 0x68
  55150. 8030ee2: 47b0 blx r6
  55151. /* set_test() answer*/
  55152. en = msg_ps->ext_mib_node;
  55153. if (msg_ps->ext_object_def.access & MIB_ACCESS_WRITE)
  55154. {
  55155. if ((msg_ps->ext_object_def.asn_type == msg_ps->vb_ptr->value_type) &&
  55156. 8030ee4: b108 cbz r0, 8030eea <snmp_msg_event+0x48a>
  55157. (en->set_test_a(request_id,&msg_ps->ext_object_def,
  55158. msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
  55159. {
  55160. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  55161. 8030ee6: 2301 movs r3, #1
  55162. 8030ee8: e040 b.n 8030f6c <snmp_msg_event+0x50c>
  55163. msg_ps->vb_idx += 1;
  55164. }
  55165. else
  55166. {
  55167. en->set_test_pc(request_id,&msg_ps->ext_object_def);
  55168. 8030eea: 2000 movs r0, #0
  55169. 8030eec: 4948 ldr r1, [pc, #288] ; (8031010 <snmp_msg_event+0x5b0>)
  55170. 8030eee: 6d2b ldr r3, [r5, #80] ; 0x50
  55171. 8030ef0: 4798 blx r3
  55172. /* bad value */
  55173. snmp_error_response(msg_ps,SNMP_ES_BADVALUE);
  55174. 8030ef2: 4846 ldr r0, [pc, #280] ; (803100c <snmp_msg_event+0x5ac>)
  55175. 8030ef4: 2103 movs r1, #3
  55176. 8030ef6: e029 b.n 8030f4c <snmp_msg_event+0x4ec>
  55177. }
  55178. }
  55179. else
  55180. {
  55181. en->set_test_pc(request_id,&msg_ps->ext_object_def);
  55182. 8030ef8: 6d2b ldr r3, [r5, #80] ; 0x50
  55183. 8030efa: f104 0168 add.w r1, r4, #104 ; 0x68
  55184. 8030efe: 4798 blx r3
  55185. /* object not available for set */
  55186. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  55187. 8030f00: 4620 mov r0, r4
  55188. 8030f02: 2102 movs r1, #2
  55189. 8030f04: e022 b.n 8030f4c <snmp_msg_event+0x4ec>
  55190. }
  55191. }
  55192. else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF_S)
  55193. 8030f06: 2b0a cmp r3, #10
  55194. 8030f08: d123 bne.n 8030f52 <snmp_msg_event+0x4f2>
  55195. {
  55196. struct mib_external_node *en;
  55197. struct snmp_name_ptr np;
  55198. /* get_object_def() answer*/
  55199. en = msg_ps->ext_mib_node;
  55200. 8030f0a: 6de6 ldr r6, [r4, #92] ; 0x5c
  55201. np = msg_ps->ext_name_ptr;
  55202. 8030f0c: f894 9060 ldrb.w r9, [r4, #96] ; 0x60
  55203. 8030f10: f8d4 8064 ldr.w r8, [r4, #100] ; 0x64
  55204. /* translate answer into a known lifeform */
  55205. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  55206. 8030f14: 6bb7 ldr r7, [r6, #56] ; 0x38
  55207. 8030f16: 4649 mov r1, r9
  55208. 8030f18: 4642 mov r2, r8
  55209. 8030f1a: f104 0368 add.w r3, r4, #104 ; 0x68
  55210. 8030f1e: 47b8 blx r7
  55211. if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
  55212. 8030f20: f894 0068 ldrb.w r0, [r4, #104] ; 0x68
  55213. 8030f24: b160 cbz r0, 8030f40 <snmp_msg_event+0x4e0>
  55214. {
  55215. msg_ps->state = SNMP_MSG_EXTERNAL_SET_VALUE;
  55216. 8030f26: 230b movs r3, #11
  55217. 8030f28: f884 305a strb.w r3, [r4, #90] ; 0x5a
  55218. en->set_value_q(request_id, &msg_ps->ext_object_def,
  55219. msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
  55220. 8030f2c: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  55221. /* translate answer into a known lifeform */
  55222. en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
  55223. if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
  55224. {
  55225. msg_ps->state = SNMP_MSG_EXTERNAL_SET_VALUE;
  55226. en->set_value_q(request_id, &msg_ps->ext_object_def,
  55227. 8030f30: 6b76 ldr r6, [r6, #52] ; 0x34
  55228. 8030f32: 7c5a ldrb r2, [r3, #17]
  55229. 8030f34: 695b ldr r3, [r3, #20]
  55230. 8030f36: 4628 mov r0, r5
  55231. 8030f38: f104 0168 add.w r1, r4, #104 ; 0x68
  55232. 8030f3c: 47b0 blx r6
  55233. 8030f3e: e08c b.n 803105a <snmp_msg_event+0x5fa>
  55234. msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
  55235. }
  55236. else
  55237. {
  55238. en->get_object_def_pc(request_id, np.ident_len, np.ident);
  55239. 8030f40: 4649 mov r1, r9
  55240. 8030f42: 6cb3 ldr r3, [r6, #72] ; 0x48
  55241. 8030f44: 4642 mov r2, r8
  55242. 8030f46: 4798 blx r3
  55243. /* set_value failed, object has disappeared for some odd reason?? */
  55244. snmp_error_response(msg_ps,SNMP_ES_GENERROR);
  55245. 8030f48: 4620 mov r0, r4
  55246. 8030f4a: 2105 movs r1, #5
  55247. 8030f4c: f7ff fd31 bl 80309b2 <snmp_error_response>
  55248. 8030f50: e083 b.n 803105a <snmp_msg_event+0x5fa>
  55249. }
  55250. }
  55251. else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_VALUE)
  55252. 8030f52: 2b0b cmp r3, #11
  55253. 8030f54: f040 8081 bne.w 803105a <snmp_msg_event+0x5fa>
  55254. struct mib_external_node *en;
  55255. /** set_value_a() */
  55256. en = msg_ps->ext_mib_node;
  55257. en->set_value_a(request_id, &msg_ps->ext_object_def,
  55258. msg_ps->vb_ptr->value_len, msg_ps->vb_ptr->value);
  55259. 8030f58: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  55260. {
  55261. struct mib_external_node *en;
  55262. /** set_value_a() */
  55263. en = msg_ps->ext_mib_node;
  55264. en->set_value_a(request_id, &msg_ps->ext_object_def,
  55265. 8030f5c: 6de2 ldr r2, [r4, #92] ; 0x5c
  55266. 8030f5e: f104 0168 add.w r1, r4, #104 ; 0x68
  55267. 8030f62: 6c55 ldr r5, [r2, #68] ; 0x44
  55268. 8030f64: 7c5a ldrb r2, [r3, #17]
  55269. 8030f66: 695b ldr r3, [r3, #20]
  55270. 8030f68: 47a8 blx r5
  55271. msg_ps->vb_ptr->value_len, msg_ps->vb_ptr->value);
  55272. /** @todo use set_value_pc() if toobig */
  55273. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  55274. 8030f6a: 2306 movs r3, #6
  55275. 8030f6c: f884 305a strb.w r3, [r4, #90] ; 0x5a
  55276. msg_ps->vb_idx += 1;
  55277. 8030f70: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  55278. 8030f74: 3301 adds r3, #1
  55279. 8030f76: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  55280. 8030f7a: e06e b.n 803105a <snmp_msg_event+0x5fa>
  55281. (msg_ps->vb_idx < msg_ps->invb.count))
  55282. {
  55283. struct mib_node *mn;
  55284. struct snmp_name_ptr np;
  55285. if (msg_ps->vb_idx == 0)
  55286. 8030f7c: b912 cbnz r2, 8030f84 <snmp_msg_event+0x524>
  55287. {
  55288. msg_ps->vb_ptr = msg_ps->invb.head;
  55289. 8030f7e: f8d4 3100 ldr.w r3, [r4, #256] ; 0x100
  55290. 8030f82: e002 b.n 8030f8a <snmp_msg_event+0x52a>
  55291. }
  55292. else
  55293. {
  55294. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  55295. 8030f84: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  55296. 8030f88: 681b ldr r3, [r3, #0]
  55297. 8030f8a: f8c4 30fc str.w r3, [r4, #252] ; 0xfc
  55298. }
  55299. /** test object identifier for .iso.org.dod.internet prefix */
  55300. if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
  55301. 8030f8e: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  55302. 8030f92: 7a18 ldrb r0, [r3, #8]
  55303. 8030f94: 68d9 ldr r1, [r3, #12]
  55304. 8030f96: f7ff fc47 bl 8030828 <snmp_iso_prefix_tst>
  55305. 8030f9a: 2800 cmp r0, #0
  55306. 8030f9c: d058 beq.n 8031050 <snmp_msg_event+0x5f0>
  55307. {
  55308. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  55309. 8030f9e: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  55310. 8030fa2: 4817 ldr r0, [pc, #92] ; (8031000 <snmp_msg_event+0x5a0>)
  55311. 8030fa4: 7a19 ldrb r1, [r3, #8]
  55312. 8030fa6: 68da ldr r2, [r3, #12]
  55313. 8030fa8: 3904 subs r1, #4
  55314. 8030faa: b2c9 uxtb r1, r1
  55315. 8030fac: 3210 adds r2, #16
  55316. 8030fae: 466b mov r3, sp
  55317. 8030fb0: f7ff f9ec bl 803038c <snmp_search_tree>
  55318. msg_ps->vb_ptr->ident + 4, &np);
  55319. if (mn != NULL)
  55320. 8030fb4: 4605 mov r5, r0
  55321. 8030fb6: 2800 cmp r0, #0
  55322. 8030fb8: d04a beq.n 8031050 <snmp_msg_event+0x5f0>
  55323. {
  55324. if (mn->node_type == MIB_NODE_EX)
  55325. 8030fba: 7c03 ldrb r3, [r0, #16]
  55326. 8030fbc: 2b05 cmp r3, #5
  55327. 8030fbe: d110 bne.n 8030fe2 <snmp_msg_event+0x582>
  55328. /* external object */
  55329. struct mib_external_node *en = (struct mib_external_node*)mn;
  55330. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  55331. /* save en && args in msg_ps!! */
  55332. msg_ps->ext_mib_node = en;
  55333. 8030fc0: 65e0 str r0, [r4, #92] ; 0x5c
  55334. if (mn->node_type == MIB_NODE_EX)
  55335. {
  55336. /* external object */
  55337. struct mib_external_node *en = (struct mib_external_node*)mn;
  55338. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  55339. 8030fc2: 2307 movs r3, #7
  55340. /* save en && args in msg_ps!! */
  55341. msg_ps->ext_mib_node = en;
  55342. msg_ps->ext_name_ptr = np;
  55343. 8030fc4: e896 0003 ldmia.w r6, {r0, r1}
  55344. if (mn->node_type == MIB_NODE_EX)
  55345. {
  55346. /* external object */
  55347. struct mib_external_node *en = (struct mib_external_node*)mn;
  55348. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  55349. 8030fc8: f884 305a strb.w r3, [r4, #90] ; 0x5a
  55350. /* save en && args in msg_ps!! */
  55351. msg_ps->ext_mib_node = en;
  55352. msg_ps->ext_name_ptr = np;
  55353. 8030fcc: 4b0d ldr r3, [pc, #52] ; (8031004 <snmp_msg_event+0x5a4>)
  55354. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  55355. 8030fce: f89d 2000 ldrb.w r2, [sp]
  55356. struct mib_external_node *en = (struct mib_external_node*)mn;
  55357. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
  55358. /* save en && args in msg_ps!! */
  55359. msg_ps->ext_mib_node = en;
  55360. msg_ps->ext_name_ptr = np;
  55361. 8030fd2: e883 0003 stmia.w r3, {r0, r1}
  55362. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  55363. 8030fd6: 2100 movs r1, #0
  55364. 8030fd8: 6aaf ldr r7, [r5, #40] ; 0x28
  55365. 8030fda: 6968 ldr r0, [r5, #20]
  55366. 8030fdc: 9b01 ldr r3, [sp, #4]
  55367. 8030fde: 47b8 blx r7
  55368. 8030fe0: e03d b.n 803105e <snmp_msg_event+0x5fe>
  55369. else
  55370. {
  55371. /* internal object */
  55372. struct obj_def object_def;
  55373. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
  55374. 8030fe2: 2702 movs r7, #2
  55375. 8030fe4: f884 705a strb.w r7, [r4, #90] ; 0x5a
  55376. mn->get_object_def(np.ident_len, np.ident, &object_def);
  55377. 8030fe8: 6803 ldr r3, [r0, #0]
  55378. 8030fea: 9901 ldr r1, [sp, #4]
  55379. 8030fec: f89d 0000 ldrb.w r0, [sp]
  55380. 8030ff0: aa02 add r2, sp, #8
  55381. 8030ff2: 4798 blx r3
  55382. if (object_def.instance != MIB_OBJECT_NONE)
  55383. 8030ff4: f89d 3008 ldrb.w r3, [sp, #8]
  55384. 8030ff8: 2b00 cmp r3, #0
  55385. 8030ffa: f040 80b9 bne.w 8031170 <snmp_msg_event+0x710>
  55386. 8030ffe: e027 b.n 8031050 <snmp_msg_event+0x5f0>
  55387. 8031000: 0803b428 .word 0x0803b428
  55388. 8031004: 20010e0c .word 0x20010e0c
  55389. 8031008: 20010eb8 .word 0x20010eb8
  55390. 803100c: 20010dac .word 0x20010dac
  55391. 8031010: 20010e14 .word 0x20010e14
  55392. {
  55393. msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST;
  55394. if (object_def.access & MIB_ACCESS_WRITE)
  55395. {
  55396. if ((object_def.asn_type == msg_ps->vb_ptr->value_type) &&
  55397. 8031014: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  55398. 8031018: f89d 100a ldrb.w r1, [sp, #10]
  55399. 803101c: 7c1a ldrb r2, [r3, #16]
  55400. 803101e: 4291 cmp r1, r2
  55401. 8031020: d10e bne.n 8031040 <snmp_msg_event+0x5e0>
  55402. (mn->set_test(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
  55403. 8031022: 68af ldr r7, [r5, #8]
  55404. 8031024: 7c59 ldrb r1, [r3, #17]
  55405. 8031026: 695a ldr r2, [r3, #20]
  55406. 8031028: a802 add r0, sp, #8
  55407. 803102a: 47b8 blx r7
  55408. {
  55409. msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST;
  55410. if (object_def.access & MIB_ACCESS_WRITE)
  55411. {
  55412. if ((object_def.asn_type == msg_ps->vb_ptr->value_type) &&
  55413. 803102c: b140 cbz r0, 8031040 <snmp_msg_event+0x5e0>
  55414. (mn->set_test(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
  55415. {
  55416. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  55417. 803102e: 2301 movs r3, #1
  55418. 8031030: f884 305a strb.w r3, [r4, #90] ; 0x5a
  55419. msg_ps->vb_idx += 1;
  55420. 8031034: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  55421. 8031038: 3301 adds r3, #1
  55422. 803103a: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  55423. 803103e: e006 b.n 803104e <snmp_msg_event+0x5ee>
  55424. }
  55425. else
  55426. {
  55427. /* bad value */
  55428. snmp_error_response(msg_ps,SNMP_ES_BADVALUE);
  55429. 8031040: 4854 ldr r0, [pc, #336] ; (8031194 <snmp_msg_event+0x734>)
  55430. 8031042: 2103 movs r1, #3
  55431. 8031044: e001 b.n 803104a <snmp_msg_event+0x5ea>
  55432. }
  55433. }
  55434. else
  55435. {
  55436. /* object not available for set */
  55437. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  55438. 8031046: 4853 ldr r0, [pc, #332] ; (8031194 <snmp_msg_event+0x734>)
  55439. 8031048: 4639 mov r1, r7
  55440. 803104a: f7ff fcb2 bl 80309b2 <snmp_error_response>
  55441. }
  55442. else
  55443. {
  55444. mn = NULL;
  55445. }
  55446. if (mn == NULL)
  55447. 803104e: b935 cbnz r5, 803105e <snmp_msg_event+0x5fe>
  55448. {
  55449. /* mn == NULL, noSuchName */
  55450. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  55451. 8031050: 4850 ldr r0, [pc, #320] ; (8031194 <snmp_msg_event+0x734>)
  55452. 8031052: 2102 movs r1, #2
  55453. 8031054: f7ff fcad bl 80309b2 <snmp_error_response>
  55454. 8031058: e001 b.n 803105e <snmp_msg_event+0x5fe>
  55455. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  55456. msg_ps->vb_idx += 1;
  55457. }
  55458. /* test all values before setting */
  55459. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  55460. 803105a: 4c4e ldr r4, [pc, #312] ; (8031194 <snmp_msg_event+0x734>)
  55461. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  55462. }
  55463. /** test object identifier for .iso.org.dod.internet prefix */
  55464. if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
  55465. {
  55466. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  55467. 803105c: 466e mov r6, sp
  55468. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  55469. msg_ps->vb_idx += 1;
  55470. }
  55471. /* test all values before setting */
  55472. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  55473. 803105e: f894 205a ldrb.w r2, [r4, #90] ; 0x5a
  55474. 8031062: 4b4c ldr r3, [pc, #304] ; (8031194 <snmp_msg_event+0x734>)
  55475. 8031064: 2a01 cmp r2, #1
  55476. 8031066: d151 bne.n 803110c <snmp_msg_event+0x6ac>
  55477. (msg_ps->vb_idx < msg_ps->invb.count))
  55478. 8031068: f894 20f8 ldrb.w r2, [r4, #248] ; 0xf8
  55479. 803106c: f894 1108 ldrb.w r1, [r4, #264] ; 0x108
  55480. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  55481. msg_ps->vb_idx += 1;
  55482. }
  55483. /* test all values before setting */
  55484. while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  55485. 8031070: 428a cmp r2, r1
  55486. 8031072: d383 bcc.n 8030f7c <snmp_msg_event+0x51c>
  55487. 8031074: e088 b.n 8031188 <snmp_msg_event+0x728>
  55488. }
  55489. if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  55490. (msg_ps->vb_idx == msg_ps->invb.count))
  55491. {
  55492. msg_ps->vb_idx = 0;
  55493. 8031076: 2200 movs r2, #0
  55494. 8031078: f883 20f8 strb.w r2, [r3, #248] ; 0xf8
  55495. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  55496. 803107c: 2206 movs r2, #6
  55497. 803107e: f883 205a strb.w r2, [r3, #90] ; 0x5a
  55498. 8031082: e043 b.n 803110c <snmp_msg_event+0x6ac>
  55499. (msg_ps->vb_idx < msg_ps->invb.count))
  55500. {
  55501. struct mib_node *mn;
  55502. struct snmp_name_ptr np;
  55503. if (msg_ps->vb_idx == 0)
  55504. 8031084: b913 cbnz r3, 803108c <snmp_msg_event+0x62c>
  55505. {
  55506. msg_ps->vb_ptr = msg_ps->invb.head;
  55507. 8031086: f8d4 3100 ldr.w r3, [r4, #256] ; 0x100
  55508. 803108a: e002 b.n 8031092 <snmp_msg_event+0x632>
  55509. }
  55510. else
  55511. {
  55512. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  55513. 803108c: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  55514. 8031090: 681b ldr r3, [r3, #0]
  55515. 8031092: f8c4 30fc str.w r3, [r4, #252] ; 0xfc
  55516. }
  55517. /* skip iso prefix test, was done previously while settesting() */
  55518. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  55519. 8031096: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  55520. 803109a: 483f ldr r0, [pc, #252] ; (8031198 <snmp_msg_event+0x738>)
  55521. 803109c: 7a19 ldrb r1, [r3, #8]
  55522. 803109e: 68da ldr r2, [r3, #12]
  55523. 80310a0: 3904 subs r1, #4
  55524. 80310a2: b2c9 uxtb r1, r1
  55525. 80310a4: 3210 adds r2, #16
  55526. 80310a6: 466b mov r3, sp
  55527. 80310a8: f7ff f970 bl 803038c <snmp_search_tree>
  55528. msg_ps->vb_ptr->ident + 4, &np);
  55529. /* check if object is still available
  55530. (e.g. external hot-plug thingy present?) */
  55531. if (mn != NULL)
  55532. 80310ac: 4605 mov r5, r0
  55533. 80310ae: 2800 cmp r0, #0
  55534. 80310b0: d02e beq.n 8031110 <snmp_msg_event+0x6b0>
  55535. {
  55536. if (mn->node_type == MIB_NODE_EX)
  55537. 80310b2: 7c03 ldrb r3, [r0, #16]
  55538. 80310b4: 2b05 cmp r3, #5
  55539. 80310b6: d110 bne.n 80310da <snmp_msg_event+0x67a>
  55540. /* external object */
  55541. struct mib_external_node *en = (struct mib_external_node*)mn;
  55542. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
  55543. /* save en && args in msg_ps!! */
  55544. msg_ps->ext_mib_node = en;
  55545. 80310b8: 65e0 str r0, [r4, #92] ; 0x5c
  55546. if (mn->node_type == MIB_NODE_EX)
  55547. {
  55548. /* external object */
  55549. struct mib_external_node *en = (struct mib_external_node*)mn;
  55550. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
  55551. 80310ba: 230a movs r3, #10
  55552. /* save en && args in msg_ps!! */
  55553. msg_ps->ext_mib_node = en;
  55554. msg_ps->ext_name_ptr = np;
  55555. 80310bc: e896 0003 ldmia.w r6, {r0, r1}
  55556. if (mn->node_type == MIB_NODE_EX)
  55557. {
  55558. /* external object */
  55559. struct mib_external_node *en = (struct mib_external_node*)mn;
  55560. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
  55561. 80310c0: f884 305a strb.w r3, [r4, #90] ; 0x5a
  55562. /* save en && args in msg_ps!! */
  55563. msg_ps->ext_mib_node = en;
  55564. msg_ps->ext_name_ptr = np;
  55565. 80310c4: 4b35 ldr r3, [pc, #212] ; (803119c <snmp_msg_event+0x73c>)
  55566. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  55567. 80310c6: f89d 2000 ldrb.w r2, [sp]
  55568. struct mib_external_node *en = (struct mib_external_node*)mn;
  55569. msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
  55570. /* save en && args in msg_ps!! */
  55571. msg_ps->ext_mib_node = en;
  55572. msg_ps->ext_name_ptr = np;
  55573. 80310ca: e883 0003 stmia.w r3, {r0, r1}
  55574. en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
  55575. 80310ce: 2100 movs r1, #0
  55576. 80310d0: 6aaf ldr r7, [r5, #40] ; 0x28
  55577. 80310d2: 6968 ldr r0, [r5, #20]
  55578. 80310d4: 9b01 ldr r3, [sp, #4]
  55579. 80310d6: 47b8 blx r7
  55580. 80310d8: e01a b.n 8031110 <snmp_msg_event+0x6b0>
  55581. else
  55582. {
  55583. /* internal object */
  55584. struct obj_def object_def;
  55585. msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF_S;
  55586. 80310da: 2305 movs r3, #5
  55587. 80310dc: f884 305a strb.w r3, [r4, #90] ; 0x5a
  55588. mn->get_object_def(np.ident_len, np.ident, &object_def);
  55589. 80310e0: 6803 ldr r3, [r0, #0]
  55590. 80310e2: 9901 ldr r1, [sp, #4]
  55591. 80310e4: f89d 0000 ldrb.w r0, [sp]
  55592. 80310e8: aa02 add r2, sp, #8
  55593. 80310ea: 4798 blx r3
  55594. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  55595. 80310ec: 2306 movs r3, #6
  55596. 80310ee: f884 305a strb.w r3, [r4, #90] ; 0x5a
  55597. mn->set_value(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
  55598. 80310f2: f8d4 30fc ldr.w r3, [r4, #252] ; 0xfc
  55599. 80310f6: 68ed ldr r5, [r5, #12]
  55600. 80310f8: 7c59 ldrb r1, [r3, #17]
  55601. 80310fa: 695a ldr r2, [r3, #20]
  55602. 80310fc: a802 add r0, sp, #8
  55603. 80310fe: 47a8 blx r5
  55604. msg_ps->vb_idx += 1;
  55605. 8031100: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  55606. 8031104: 3301 adds r3, #1
  55607. 8031106: f884 30f8 strb.w r3, [r4, #248] ; 0xf8
  55608. 803110a: e001 b.n 8031110 <snmp_msg_event+0x6b0>
  55609. msg_ps->vb_idx = 0;
  55610. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  55611. }
  55612. /* set all values "atomically" (be as "atomic" as possible) */
  55613. while ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
  55614. 803110c: 4c21 ldr r4, [pc, #132] ; (8031194 <snmp_msg_event+0x734>)
  55615. else
  55616. {
  55617. msg_ps->vb_ptr = msg_ps->vb_ptr->next;
  55618. }
  55619. /* skip iso prefix test, was done previously while settesting() */
  55620. mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
  55621. 803110e: 466e mov r6, sp
  55622. msg_ps->vb_idx = 0;
  55623. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  55624. }
  55625. /* set all values "atomically" (be as "atomic" as possible) */
  55626. while ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
  55627. 8031110: f894 305a ldrb.w r3, [r4, #90] ; 0x5a
  55628. 8031114: 4d1f ldr r5, [pc, #124] ; (8031194 <snmp_msg_event+0x734>)
  55629. 8031116: 2b06 cmp r3, #6
  55630. 8031118: d139 bne.n 803118e <snmp_msg_event+0x72e>
  55631. (msg_ps->vb_idx < msg_ps->invb.count))
  55632. 803111a: f894 30f8 ldrb.w r3, [r4, #248] ; 0xf8
  55633. 803111e: f894 2108 ldrb.w r2, [r4, #264] ; 0x108
  55634. msg_ps->vb_idx = 0;
  55635. msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
  55636. }
  55637. /* set all values "atomically" (be as "atomic" as possible) */
  55638. while ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
  55639. 8031122: 4293 cmp r3, r2
  55640. 8031124: d3ae bcc.n 8031084 <snmp_msg_event+0x624>
  55641. 8031126: e031 b.n 803118c <snmp_msg_event+0x72c>
  55642. (msg_ps->vb_idx == msg_ps->invb.count))
  55643. {
  55644. /* simply echo the input if we can set it
  55645. @todo do we need to return the actual value?
  55646. e.g. if value is silently modified or behaves sticky? */
  55647. msg_ps->outvb = msg_ps->invb;
  55648. 8031128: f505 7280 add.w r2, r5, #256 ; 0x100
  55649. 803112c: ca07 ldmia r2, {r0, r1, r2}
  55650. 803112e: f505 7386 add.w r3, r5, #268 ; 0x10c
  55651. 8031132: e883 0007 stmia.w r3, {r0, r1, r2}
  55652. msg_ps->invb.head = NULL;
  55653. 8031136: 2300 movs r3, #0
  55654. 8031138: f8c5 3100 str.w r3, [r5, #256] ; 0x100
  55655. msg_ps->invb.tail = NULL;
  55656. 803113c: f8c5 3104 str.w r3, [r5, #260] ; 0x104
  55657. msg_ps->invb.count = 0;
  55658. 8031140: f885 3108 strb.w r3, [r5, #264] ; 0x108
  55659. snmp_ok_response(msg_ps);
  55660. 8031144: 4628 mov r0, r5
  55661. 8031146: f7ff fc6f bl 8030a28 <snmp_ok_response>
  55662. 803114a: e020 b.n 803118e <snmp_msg_event+0x72e>
  55663. }
  55664. }
  55665. if (mn == NULL)
  55666. {
  55667. /* mn == NULL, noSuchName */
  55668. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  55669. 803114c: 4811 ldr r0, [pc, #68] ; (8031194 <snmp_msg_event+0x734>)
  55670. 803114e: 2102 movs r1, #2
  55671. 8031150: f7ff fc2f bl 80309b2 <snmp_error_response>
  55672. 8031154: e556 b.n 8030c04 <snmp_msg_event+0x1a4>
  55673. }
  55674. if (mn != NULL)
  55675. {
  55676. struct snmp_varbind *vb;
  55677. msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
  55678. 8031156: 2303 movs r3, #3
  55679. /* allocate output varbind */
  55680. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  55681. 8031158: 200c movs r0, #12
  55682. }
  55683. if (mn != NULL)
  55684. {
  55685. struct snmp_varbind *vb;
  55686. msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
  55687. 803115a: f884 305a strb.w r3, [r4, #90] ; 0x5a
  55688. /* allocate output varbind */
  55689. vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND);
  55690. 803115e: f7f9 ff57 bl 802b010 <memp_malloc>
  55691. if (vb != NULL)
  55692. 8031162: 4605 mov r5, r0
  55693. 8031164: 2800 cmp r0, #0
  55694. 8031166: f47f ae31 bne.w 8030dcc <snmp_msg_event+0x36c>
  55695. 803116a: e669 b.n 8030e40 <snmp_msg_event+0x3e0>
  55696. {
  55697. /* mn == NULL, noSuchName */
  55698. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  55699. }
  55700. }
  55701. if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  55702. 803116c: d10f bne.n 803118e <snmp_msg_event+0x72e>
  55703. 803116e: e555 b.n 8030c1c <snmp_msg_event+0x1bc>
  55704. /* search failed, object id points to unknown object (nosuchname) */
  55705. mn = NULL;
  55706. }
  55707. if (mn != NULL)
  55708. {
  55709. msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST;
  55710. 8031170: 2304 movs r3, #4
  55711. 8031172: f884 305a strb.w r3, [r4, #90] ; 0x5a
  55712. if (object_def.access & MIB_ACCESS_WRITE)
  55713. 8031176: f89d 3009 ldrb.w r3, [sp, #9]
  55714. 803117a: f003 0302 and.w r3, r3, #2
  55715. 803117e: b2db uxtb r3, r3
  55716. 8031180: 2b00 cmp r3, #0
  55717. 8031182: f47f af47 bne.w 8031014 <snmp_msg_event+0x5b4>
  55718. 8031186: e75e b.n 8031046 <snmp_msg_event+0x5e6>
  55719. /* mn == NULL, noSuchName */
  55720. snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
  55721. }
  55722. }
  55723. if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
  55724. 8031188: d1c0 bne.n 803110c <snmp_msg_event+0x6ac>
  55725. 803118a: e774 b.n 8031076 <snmp_msg_event+0x616>
  55726. mn->set_value(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
  55727. msg_ps->vb_idx += 1;
  55728. }
  55729. }
  55730. }
  55731. if ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
  55732. 803118c: d0cc beq.n 8031128 <snmp_msg_event+0x6c8>
  55733. else if(msg_ps->rt == SNMP_ASN1_PDU_SET_REQ)
  55734. {
  55735. snmp_msg_set_event(request_id, msg_ps);
  55736. }
  55737. }
  55738. }
  55739. 803118e: b027 add sp, #156 ; 0x9c
  55740. 8031190: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  55741. 8031194: 20010dac .word 0x20010dac
  55742. 8031198: 0803b428 .word 0x0803b428
  55743. 803119c: 20010e0c .word 0x20010e0c
  55744. 080311a0 <snmp_pdu_dec_varbindlist>:
  55745. return ERR_OK;
  55746. }
  55747. static err_t
  55748. snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat)
  55749. {
  55750. 80311a0: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  55751. 80311a4: b0c7 sub sp, #284 ; 0x11c
  55752. u16_t len, vb_len;
  55753. u8_t len_octets;
  55754. u8_t type;
  55755. /* variable binding list */
  55756. snmp_asn1_dec_type(p, ofs, &type);
  55757. 80311a6: f10d 070b add.w r7, sp, #11
  55758. return ERR_OK;
  55759. }
  55760. static err_t
  55761. snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat)
  55762. {
  55763. 80311aa: 468a mov sl, r1
  55764. 80311ac: 4691 mov r9, r2
  55765. u16_t len, vb_len;
  55766. u8_t len_octets;
  55767. u8_t type;
  55768. /* variable binding list */
  55769. snmp_asn1_dec_type(p, ofs, &type);
  55770. 80311ae: 463a mov r2, r7
  55771. return ERR_OK;
  55772. }
  55773. static err_t
  55774. snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat)
  55775. {
  55776. 80311b0: 4604 mov r4, r0
  55777. 80311b2: 461d mov r5, r3
  55778. u8_t len_octets;
  55779. u8_t type;
  55780. /* variable binding list */
  55781. snmp_asn1_dec_type(p, ofs, &type);
  55782. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &vb_len);
  55783. 80311b4: f10d 060e add.w r6, sp, #14
  55784. u16_t len, vb_len;
  55785. u8_t len_octets;
  55786. u8_t type;
  55787. /* variable binding list */
  55788. snmp_asn1_dec_type(p, ofs, &type);
  55789. 80311b8: f7fd f944 bl 802e444 <snmp_asn1_dec_type>
  55790. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &vb_len);
  55791. 80311bc: f10a 0101 add.w r1, sl, #1
  55792. 80311c0: 4620 mov r0, r4
  55793. 80311c2: b289 uxth r1, r1
  55794. 80311c4: f10d 020a add.w r2, sp, #10
  55795. 80311c8: 4633 mov r3, r6
  55796. 80311ca: f7fd f950 bl 802e46e <snmp_asn1_dec_length>
  55797. if ((derr != ERR_OK) ||
  55798. 80311ce: b910 cbnz r0, 80311d6 <snmp_pdu_dec_varbindlist+0x36>
  55799. 80311d0: 783b ldrb r3, [r7, #0]
  55800. 80311d2: 2b30 cmp r3, #48 ; 0x30
  55801. 80311d4: d002 beq.n 80311dc <snmp_pdu_dec_varbindlist+0x3c>
  55802. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
  55803. {
  55804. snmp_inc_snmpinasnparseerrs();
  55805. 80311d6: f7fe ff21 bl 803001c <snmp_inc_snmpinasnparseerrs>
  55806. 80311da: e02b b.n 8031234 <snmp_pdu_dec_varbindlist+0x94>
  55807. return ERR_ARG;
  55808. }
  55809. ofs += (1 + len_octets);
  55810. 80311dc: f89d 800a ldrb.w r8, [sp, #10]
  55811. /* start with empty list */
  55812. m_stat->invb.count = 0;
  55813. 80311e0: f885 0108 strb.w r0, [r5, #264] ; 0x108
  55814. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
  55815. {
  55816. snmp_inc_snmpinasnparseerrs();
  55817. return ERR_ARG;
  55818. }
  55819. ofs += (1 + len_octets);
  55820. 80311e4: f108 0801 add.w r8, r8, #1
  55821. 80311e8: 44d0 add r8, sl
  55822. 80311ea: fa1f f888 uxth.w r8, r8
  55823. /* start with empty list */
  55824. m_stat->invb.count = 0;
  55825. m_stat->invb.head = NULL;
  55826. 80311ee: f8c5 0100 str.w r0, [r5, #256] ; 0x100
  55827. m_stat->invb.tail = NULL;
  55828. 80311f2: f8c5 0104 str.w r0, [r5, #260] ; 0x104
  55829. while (vb_len > 0)
  55830. 80311f6: e118 b.n 803142a <snmp_pdu_dec_varbindlist+0x28a>
  55831. {
  55832. struct snmp_obj_id oid, oid_value;
  55833. struct snmp_varbind *vb;
  55834. snmp_asn1_dec_type(p, ofs, &type);
  55835. 80311f8: 4641 mov r1, r8
  55836. 80311fa: 463a mov r2, r7
  55837. 80311fc: 4620 mov r0, r4
  55838. 80311fe: f7fd f921 bl 802e444 <snmp_asn1_dec_type>
  55839. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  55840. 8031202: f108 0101 add.w r1, r8, #1
  55841. 8031206: 4620 mov r0, r4
  55842. 8031208: b289 uxth r1, r1
  55843. 803120a: f10d 020a add.w r2, sp, #10
  55844. 803120e: ab03 add r3, sp, #12
  55845. 8031210: f7fd f92d bl 802e46e <snmp_asn1_dec_length>
  55846. if ((derr != ERR_OK) ||
  55847. 8031214: b940 cbnz r0, 8031228 <snmp_pdu_dec_varbindlist+0x88>
  55848. 8031216: 783b ldrb r3, [r7, #0]
  55849. 8031218: 2b30 cmp r3, #48 ; 0x30
  55850. 803121a: d105 bne.n 8031228 <snmp_pdu_dec_varbindlist+0x88>
  55851. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)) ||
  55852. (len == 0) || (len > vb_len))
  55853. 803121c: f8bd 200c ldrh.w r2, [sp, #12]
  55854. struct snmp_varbind *vb;
  55855. snmp_asn1_dec_type(p, ofs, &type);
  55856. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  55857. if ((derr != ERR_OK) ||
  55858. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)) ||
  55859. 8031220: b112 cbz r2, 8031228 <snmp_pdu_dec_varbindlist+0x88>
  55860. (len == 0) || (len > vb_len))
  55861. 8031222: 8833 ldrh r3, [r6, #0]
  55862. 8031224: 429a cmp r2, r3
  55863. 8031226: d907 bls.n 8031238 <snmp_pdu_dec_varbindlist+0x98>
  55864. {
  55865. snmp_inc_snmpinasnparseerrs();
  55866. 8031228: f7fe fef8 bl 803001c <snmp_inc_snmpinasnparseerrs>
  55867. /* free varbinds (if available) */
  55868. snmp_varbind_list_free(&m_stat->invb);
  55869. 803122c: f505 7080 add.w r0, r5, #256 ; 0x100
  55870. 8031230: f7ff fbb1 bl 8030996 <snmp_varbind_list_free>
  55871. 8031234: 20f2 movs r0, #242 ; 0xf2
  55872. 8031236: e109 b.n 803144c <snmp_pdu_dec_varbindlist+0x2ac>
  55873. return ERR_ARG;
  55874. }
  55875. ofs += (1 + len_octets);
  55876. 8031238: f89d 200a ldrb.w r2, [sp, #10]
  55877. 803123c: 4490 add r8, r2
  55878. 803123e: fa1f f888 uxth.w r8, r8
  55879. 8031242: f108 0a01 add.w sl, r8, #1
  55880. vb_len -= (1 + len_octets);
  55881. 8031246: 43d2 mvns r2, r2
  55882. snmp_inc_snmpinasnparseerrs();
  55883. /* free varbinds (if available) */
  55884. snmp_varbind_list_free(&m_stat->invb);
  55885. return ERR_ARG;
  55886. }
  55887. ofs += (1 + len_octets);
  55888. 8031248: fa1f fa8a uxth.w sl, sl
  55889. vb_len -= (1 + len_octets);
  55890. 803124c: 189b adds r3, r3, r2
  55891. snmp_asn1_dec_type(p, ofs, &type);
  55892. 803124e: 4651 mov r1, sl
  55893. 8031250: 463a mov r2, r7
  55894. 8031252: 4620 mov r0, r4
  55895. /* free varbinds (if available) */
  55896. snmp_varbind_list_free(&m_stat->invb);
  55897. return ERR_ARG;
  55898. }
  55899. ofs += (1 + len_octets);
  55900. vb_len -= (1 + len_octets);
  55901. 8031254: 8033 strh r3, [r6, #0]
  55902. snmp_asn1_dec_type(p, ofs, &type);
  55903. 8031256: f7fd f8f5 bl 802e444 <snmp_asn1_dec_type>
  55904. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  55905. 803125a: f108 0102 add.w r1, r8, #2
  55906. 803125e: 4620 mov r0, r4
  55907. 8031260: b289 uxth r1, r1
  55908. 8031262: f10d 020a add.w r2, sp, #10
  55909. 8031266: ab03 add r3, sp, #12
  55910. 8031268: f7fd f901 bl 802e46e <snmp_asn1_dec_length>
  55911. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID)))
  55912. 803126c: 2800 cmp r0, #0
  55913. 803126e: d1db bne.n 8031228 <snmp_pdu_dec_varbindlist+0x88>
  55914. 8031270: 783b ldrb r3, [r7, #0]
  55915. 8031272: 2b06 cmp r3, #6
  55916. 8031274: d1d8 bne.n 8031228 <snmp_pdu_dec_varbindlist+0x88>
  55917. snmp_inc_snmpinasnparseerrs();
  55918. /* free varbinds (if available) */
  55919. snmp_varbind_list_free(&m_stat->invb);
  55920. return ERR_ARG;
  55921. }
  55922. derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid);
  55923. 8031276: f89d 100a ldrb.w r1, [sp, #10]
  55924. 803127a: f8bd 200c ldrh.w r2, [sp, #12]
  55925. 803127e: 3101 adds r1, #1
  55926. 8031280: 4451 add r1, sl
  55927. 8031282: 4620 mov r0, r4
  55928. 8031284: b289 uxth r1, r1
  55929. 8031286: ab04 add r3, sp, #16
  55930. 8031288: f7fd fa20 bl 802e6cc <snmp_asn1_dec_oid>
  55931. if (derr != ERR_OK)
  55932. 803128c: 2800 cmp r0, #0
  55933. 803128e: d1cb bne.n 8031228 <snmp_pdu_dec_varbindlist+0x88>
  55934. snmp_inc_snmpinasnparseerrs();
  55935. /* free varbinds (if available) */
  55936. snmp_varbind_list_free(&m_stat->invb);
  55937. return ERR_ARG;
  55938. }
  55939. ofs += (1 + len_octets + len);
  55940. 8031290: f89d 300a ldrb.w r3, [sp, #10]
  55941. 8031294: f8bd 200c ldrh.w r2, [sp, #12]
  55942. 8031298: 1899 adds r1, r3, r2
  55943. 803129a: 448a add sl, r1
  55944. 803129c: fa1f fa8a uxth.w sl, sl
  55945. vb_len -= (1 + len_octets + len);
  55946. 80312a0: 8831 ldrh r1, [r6, #0]
  55947. snmp_inc_snmpinasnparseerrs();
  55948. /* free varbinds (if available) */
  55949. snmp_varbind_list_free(&m_stat->invb);
  55950. return ERR_ARG;
  55951. }
  55952. ofs += (1 + len_octets + len);
  55953. 80312a2: f10a 0801 add.w r8, sl, #1
  55954. vb_len -= (1 + len_octets + len);
  55955. 80312a6: 1a8a subs r2, r1, r2
  55956. snmp_inc_snmpinasnparseerrs();
  55957. /* free varbinds (if available) */
  55958. snmp_varbind_list_free(&m_stat->invb);
  55959. return ERR_ARG;
  55960. }
  55961. ofs += (1 + len_octets + len);
  55962. 80312a8: fa1f f888 uxth.w r8, r8
  55963. vb_len -= (1 + len_octets + len);
  55964. 80312ac: 43db mvns r3, r3
  55965. 80312ae: 18d3 adds r3, r2, r3
  55966. snmp_asn1_dec_type(p, ofs, &type);
  55967. 80312b0: 4641 mov r1, r8
  55968. 80312b2: 463a mov r2, r7
  55969. 80312b4: 4620 mov r0, r4
  55970. /* free varbinds (if available) */
  55971. snmp_varbind_list_free(&m_stat->invb);
  55972. return ERR_ARG;
  55973. }
  55974. ofs += (1 + len_octets + len);
  55975. vb_len -= (1 + len_octets + len);
  55976. 80312b6: 8033 strh r3, [r6, #0]
  55977. snmp_asn1_dec_type(p, ofs, &type);
  55978. 80312b8: f7fd f8c4 bl 802e444 <snmp_asn1_dec_type>
  55979. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  55980. 80312bc: f10a 0102 add.w r1, sl, #2
  55981. 80312c0: 4620 mov r0, r4
  55982. 80312c2: b289 uxth r1, r1
  55983. 80312c4: f10d 020a add.w r2, sp, #10
  55984. 80312c8: ab03 add r3, sp, #12
  55985. 80312ca: f7fd f8d0 bl 802e46e <snmp_asn1_dec_length>
  55986. if (derr != ERR_OK)
  55987. 80312ce: 2800 cmp r0, #0
  55988. 80312d0: d1aa bne.n 8031228 <snmp_pdu_dec_varbindlist+0x88>
  55989. /* free varbinds (if available) */
  55990. snmp_varbind_list_free(&m_stat->invb);
  55991. return ERR_ARG;
  55992. }
  55993. switch (type)
  55994. 80312d2: 7839 ldrb r1, [r7, #0]
  55995. 80312d4: 2906 cmp r1, #6
  55996. 80312d6: d047 beq.n 8031368 <snmp_pdu_dec_varbindlist+0x1c8>
  55997. 80312d8: d805 bhi.n 80312e6 <snmp_pdu_dec_varbindlist+0x146>
  55998. 80312da: 2904 cmp r1, #4
  55999. 80312dc: d036 beq.n 803134c <snmp_pdu_dec_varbindlist+0x1ac>
  56000. 80312de: d839 bhi.n 8031354 <snmp_pdu_dec_varbindlist+0x1b4>
  56001. 80312e0: 2902 cmp r1, #2
  56002. 80312e2: d1a1 bne.n 8031228 <snmp_pdu_dec_varbindlist+0x88>
  56003. 80312e4: e009 b.n 80312fa <snmp_pdu_dec_varbindlist+0x15a>
  56004. 80312e6: 2943 cmp r1, #67 ; 0x43
  56005. 80312e8: d804 bhi.n 80312f4 <snmp_pdu_dec_varbindlist+0x154>
  56006. 80312ea: 2941 cmp r1, #65 ; 0x41
  56007. 80312ec: d219 bcs.n 8031322 <snmp_pdu_dec_varbindlist+0x182>
  56008. 80312ee: 2940 cmp r1, #64 ; 0x40
  56009. 80312f0: d19a bne.n 8031228 <snmp_pdu_dec_varbindlist+0x88>
  56010. 80312f2: e069 b.n 80313c8 <snmp_pdu_dec_varbindlist+0x228>
  56011. 80312f4: 2944 cmp r1, #68 ; 0x44
  56012. 80312f6: d197 bne.n 8031228 <snmp_pdu_dec_varbindlist+0x88>
  56013. 80312f8: e028 b.n 803134c <snmp_pdu_dec_varbindlist+0x1ac>
  56014. {
  56015. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
  56016. vb = snmp_varbind_alloc(&oid, type, sizeof(s32_t));
  56017. 80312fa: a804 add r0, sp, #16
  56018. 80312fc: 2204 movs r2, #4
  56019. 80312fe: f7ff faf7 bl 80308f0 <snmp_varbind_alloc>
  56020. if (vb != NULL)
  56021. 8031302: 4683 mov fp, r0
  56022. 8031304: 2800 cmp r0, #0
  56023. 8031306: d08f beq.n 8031228 <snmp_pdu_dec_varbindlist+0x88>
  56024. {
  56025. s32_t *vptr = (s32_t*)vb->value;
  56026. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, vptr);
  56027. 8031308: f89d 100a ldrb.w r1, [sp, #10]
  56028. 803130c: f8bd 200c ldrh.w r2, [sp, #12]
  56029. 8031310: f8db 3014 ldr.w r3, [fp, #20]
  56030. 8031314: 3101 adds r1, #1
  56031. 8031316: 4441 add r1, r8
  56032. 8031318: 4620 mov r0, r4
  56033. 803131a: b289 uxth r1, r1
  56034. 803131c: f7fd f97d bl 802e61a <snmp_asn1_dec_s32t>
  56035. 8031320: e06b b.n 80313fa <snmp_pdu_dec_varbindlist+0x25a>
  56036. }
  56037. break;
  56038. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
  56039. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
  56040. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
  56041. vb = snmp_varbind_alloc(&oid, type, sizeof(u32_t));
  56042. 8031322: a804 add r0, sp, #16
  56043. 8031324: 2204 movs r2, #4
  56044. 8031326: f7ff fae3 bl 80308f0 <snmp_varbind_alloc>
  56045. if (vb != NULL)
  56046. 803132a: 4683 mov fp, r0
  56047. 803132c: 2800 cmp r0, #0
  56048. 803132e: f43f af7b beq.w 8031228 <snmp_pdu_dec_varbindlist+0x88>
  56049. {
  56050. u32_t *vptr = (u32_t*)vb->value;
  56051. derr = snmp_asn1_dec_u32t(p, ofs + 1 + len_octets, len, vptr);
  56052. 8031332: f89d 100a ldrb.w r1, [sp, #10]
  56053. 8031336: f8bd 200c ldrh.w r2, [sp, #12]
  56054. 803133a: f8db 3014 ldr.w r3, [fp, #20]
  56055. 803133e: 3101 adds r1, #1
  56056. 8031340: 4441 add r1, r8
  56057. 8031342: 4620 mov r0, r4
  56058. 8031344: b289 uxth r1, r1
  56059. 8031346: f7fd f914 bl 802e572 <snmp_asn1_dec_u32t>
  56060. 803134a: e056 b.n 80313fa <snmp_pdu_dec_varbindlist+0x25a>
  56061. }
  56062. break;
  56063. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
  56064. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
  56065. LWIP_ASSERT("invalid length", len <= 0xff);
  56066. vb = snmp_varbind_alloc(&oid, type, (u8_t)len);
  56067. 803134c: a804 add r0, sp, #16
  56068. 803134e: f89d 200c ldrb.w r2, [sp, #12]
  56069. 8031352: e03f b.n 80313d4 <snmp_pdu_dec_varbindlist+0x234>
  56070. {
  56071. derr = ERR_ARG;
  56072. }
  56073. break;
  56074. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
  56075. vb = snmp_varbind_alloc(&oid, type, 0);
  56076. 8031354: 2105 movs r1, #5
  56077. 8031356: a804 add r0, sp, #16
  56078. 8031358: 2200 movs r2, #0
  56079. 803135a: f7ff fac9 bl 80308f0 <snmp_varbind_alloc>
  56080. if (vb != NULL)
  56081. 803135e: 4601 mov r1, r0
  56082. 8031360: 2800 cmp r0, #0
  56083. 8031362: f43f af61 beq.w 8031228 <snmp_pdu_dec_varbindlist+0x88>
  56084. 8031366: e02a b.n 80313be <snmp_pdu_dec_varbindlist+0x21e>
  56085. {
  56086. derr = ERR_ARG;
  56087. }
  56088. break;
  56089. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
  56090. derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid_value);
  56091. 8031368: f89d 100a ldrb.w r1, [sp, #10]
  56092. 803136c: f8bd 200c ldrh.w r2, [sp, #12]
  56093. 8031370: 3101 adds r1, #1
  56094. 8031372: 4441 add r1, r8
  56095. 8031374: 4620 mov r0, r4
  56096. 8031376: b289 uxth r1, r1
  56097. 8031378: ab25 add r3, sp, #148 ; 0x94
  56098. 803137a: f7fd f9a7 bl 802e6cc <snmp_asn1_dec_oid>
  56099. if (derr == ERR_OK)
  56100. 803137e: 2800 cmp r0, #0
  56101. 8031380: f47f af52 bne.w 8031228 <snmp_pdu_dec_varbindlist+0x88>
  56102. {
  56103. vb = snmp_varbind_alloc(&oid, type, oid_value.len * sizeof(s32_t));
  56104. 8031384: f89d 2094 ldrb.w r2, [sp, #148] ; 0x94
  56105. 8031388: 7839 ldrb r1, [r7, #0]
  56106. 803138a: 0092 lsls r2, r2, #2
  56107. 803138c: a804 add r0, sp, #16
  56108. 803138e: f002 02fc and.w r2, r2, #252 ; 0xfc
  56109. 8031392: f7ff faad bl 80308f0 <snmp_varbind_alloc>
  56110. if (vb != NULL)
  56111. 8031396: 4601 mov r1, r0
  56112. 8031398: 2800 cmp r0, #0
  56113. 803139a: f43f af45 beq.w 8031228 <snmp_pdu_dec_varbindlist+0x88>
  56114. {
  56115. u8_t i = oid_value.len;
  56116. 803139e: f89d 3094 ldrb.w r3, [sp, #148] ; 0x94
  56117. s32_t *vptr = (s32_t*)vb->value;
  56118. 80313a2: 6940 ldr r0, [r0, #20]
  56119. while(i > 0)
  56120. 80313a4: e009 b.n 80313ba <snmp_pdu_dec_varbindlist+0x21a>
  56121. {
  56122. i--;
  56123. 80313a6: 3b01 subs r3, #1
  56124. 80313a8: b2db uxtb r3, r3
  56125. vptr[i] = oid_value.id[i];
  56126. 80313aa: f50d 7e8c add.w lr, sp, #280 ; 0x118
  56127. 80313ae: eb0e 0283 add.w r2, lr, r3, lsl #2
  56128. 80313b2: f852 2c80 ldr.w r2, [r2, #-128]
  56129. 80313b6: f840 2023 str.w r2, [r0, r3, lsl #2]
  56130. if (vb != NULL)
  56131. {
  56132. u8_t i = oid_value.len;
  56133. s32_t *vptr = (s32_t*)vb->value;
  56134. while(i > 0)
  56135. 80313ba: 2b00 cmp r3, #0
  56136. 80313bc: d1f3 bne.n 80313a6 <snmp_pdu_dec_varbindlist+0x206>
  56137. {
  56138. i--;
  56139. vptr[i] = oid_value.id[i];
  56140. }
  56141. snmp_varbind_tail_add(&m_stat->invb, vb);
  56142. 80313be: f505 7080 add.w r0, r5, #256 ; 0x100
  56143. 80313c2: f7ff fb41 bl 8030a48 <snmp_varbind_tail_add>
  56144. 80313c6: e022 b.n 803140e <snmp_pdu_dec_varbindlist+0x26e>
  56145. derr = ERR_ARG;
  56146. }
  56147. }
  56148. break;
  56149. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
  56150. if (len == 4)
  56151. 80313c8: f8bd 200c ldrh.w r2, [sp, #12]
  56152. 80313cc: 2a04 cmp r2, #4
  56153. 80313ce: f47f af2b bne.w 8031228 <snmp_pdu_dec_varbindlist+0x88>
  56154. {
  56155. /* must be exactly 4 octets! */
  56156. vb = snmp_varbind_alloc(&oid, type, 4);
  56157. 80313d2: a804 add r0, sp, #16
  56158. 80313d4: f7ff fa8c bl 80308f0 <snmp_varbind_alloc>
  56159. if (vb != NULL)
  56160. 80313d8: 4683 mov fp, r0
  56161. 80313da: 2800 cmp r0, #0
  56162. 80313dc: f43f af24 beq.w 8031228 <snmp_pdu_dec_varbindlist+0x88>
  56163. {
  56164. derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, vb->value_len, (u8_t*)vb->value);
  56165. 80313e0: f89d 100a ldrb.w r1, [sp, #10]
  56166. 80313e4: 7c43 ldrb r3, [r0, #17]
  56167. 80313e6: 6940 ldr r0, [r0, #20]
  56168. 80313e8: f8bd 200c ldrh.w r2, [sp, #12]
  56169. 80313ec: 9000 str r0, [sp, #0]
  56170. 80313ee: 3101 adds r1, #1
  56171. 80313f0: 4441 add r1, r8
  56172. 80313f2: 4620 mov r0, r4
  56173. 80313f4: b289 uxth r1, r1
  56174. 80313f6: f7fd fa05 bl 802e804 <snmp_asn1_dec_raw>
  56175. 80313fa: 4682 mov sl, r0
  56176. snmp_varbind_tail_add(&m_stat->invb, vb);
  56177. 80313fc: 4659 mov r1, fp
  56178. 80313fe: f505 7080 add.w r0, r5, #256 ; 0x100
  56179. 8031402: f7ff fb21 bl 8030a48 <snmp_varbind_tail_add>
  56180. break;
  56181. default:
  56182. derr = ERR_ARG;
  56183. break;
  56184. }
  56185. if (derr != ERR_OK)
  56186. 8031406: f1ba 0f00 cmp.w sl, #0
  56187. 803140a: f47f af0d bne.w 8031228 <snmp_pdu_dec_varbindlist+0x88>
  56188. snmp_inc_snmpinasnparseerrs();
  56189. /* free varbinds (if available) */
  56190. snmp_varbind_list_free(&m_stat->invb);
  56191. return ERR_ARG;
  56192. }
  56193. ofs += (1 + len_octets + len);
  56194. 803140e: f8bd 200c ldrh.w r2, [sp, #12]
  56195. 8031412: f89d 300a ldrb.w r3, [sp, #10]
  56196. 8031416: 1c51 adds r1, r2, #1
  56197. 8031418: 1859 adds r1, r3, r1
  56198. 803141a: 4488 add r8, r1
  56199. vb_len -= (1 + len_octets + len);
  56200. 803141c: 8831 ldrh r1, [r6, #0]
  56201. 803141e: 43db mvns r3, r3
  56202. 8031420: 1a8a subs r2, r1, r2
  56203. 8031422: 18d3 adds r3, r2, r3
  56204. snmp_inc_snmpinasnparseerrs();
  56205. /* free varbinds (if available) */
  56206. snmp_varbind_list_free(&m_stat->invb);
  56207. return ERR_ARG;
  56208. }
  56209. ofs += (1 + len_octets + len);
  56210. 8031424: fa1f f888 uxth.w r8, r8
  56211. vb_len -= (1 + len_octets + len);
  56212. 8031428: 8033 strh r3, [r6, #0]
  56213. /* start with empty list */
  56214. m_stat->invb.count = 0;
  56215. m_stat->invb.head = NULL;
  56216. m_stat->invb.tail = NULL;
  56217. while (vb_len > 0)
  56218. 803142a: 8833 ldrh r3, [r6, #0]
  56219. 803142c: 2b00 cmp r3, #0
  56220. 803142e: f47f aee3 bne.w 80311f8 <snmp_pdu_dec_varbindlist+0x58>
  56221. }
  56222. ofs += (1 + len_octets + len);
  56223. vb_len -= (1 + len_octets + len);
  56224. }
  56225. if (m_stat->rt == SNMP_ASN1_PDU_SET_REQ)
  56226. 8031432: 7aab ldrb r3, [r5, #10]
  56227. 8031434: f895 0108 ldrb.w r0, [r5, #264] ; 0x108
  56228. 8031438: 2b03 cmp r3, #3
  56229. 803143a: d102 bne.n 8031442 <snmp_pdu_dec_varbindlist+0x2a2>
  56230. {
  56231. snmp_add_snmpintotalsetvars(m_stat->invb.count);
  56232. 803143c: f7fe fe26 bl 803008c <snmp_add_snmpintotalsetvars>
  56233. 8031440: e001 b.n 8031446 <snmp_pdu_dec_varbindlist+0x2a6>
  56234. }
  56235. else
  56236. {
  56237. snmp_add_snmpintotalreqvars(m_stat->invb.count);
  56238. 8031442: f7fe fe1b bl 803007c <snmp_add_snmpintotalreqvars>
  56239. }
  56240. *ofs_ret = ofs;
  56241. 8031446: f8a9 8000 strh.w r8, [r9]
  56242. return ERR_OK;
  56243. 803144a: 2000 movs r0, #0
  56244. }
  56245. 803144c: b240 sxtb r0, r0
  56246. 803144e: b047 add sp, #284 ; 0x11c
  56247. 8031450: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  56248. 08031454 <snmp_recv>:
  56249. /* lwIP UDP receive callback function */
  56250. static void
  56251. snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  56252. {
  56253. 8031454: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
  56254. LWIP_UNUSED_ARG(arg);
  56255. /* traverse input message process list, look for SNMP_MSG_EMPTY */
  56256. msg_ps = &msg_input_list[0];
  56257. req_idx = 0;
  56258. while ((req_idx < SNMP_CONCURRENT_REQUESTS) && (msg_ps->state != SNMP_MSG_EMPTY))
  56259. 8031458: 4da3 ldr r5, [pc, #652] ; (80316e8 <snmp_recv+0x294>)
  56260. snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  56261. {
  56262. volatile struct snmp_msg_pstat *msg_ps;
  56263. u8_t req_idx;
  56264. err_t err_ret;
  56265. u16_t payload_len = p->tot_len;
  56266. 803145a: 8917 ldrh r7, [r2, #8]
  56267. LWIP_UNUSED_ARG(arg);
  56268. /* traverse input message process list, look for SNMP_MSG_EMPTY */
  56269. msg_ps = &msg_input_list[0];
  56270. req_idx = 0;
  56271. while ((req_idx < SNMP_CONCURRENT_REQUESTS) && (msg_ps->state != SNMP_MSG_EMPTY))
  56272. 803145c: f895 605a ldrb.w r6, [r5, #90] ; 0x5a
  56273. /* lwIP UDP receive callback function */
  56274. static void
  56275. snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  56276. {
  56277. 8031460: b087 sub sp, #28
  56278. 8031462: 4699 mov r9, r3
  56279. volatile struct snmp_msg_pstat *msg_ps;
  56280. u8_t req_idx;
  56281. err_t err_ret;
  56282. u16_t payload_len = p->tot_len;
  56283. u16_t payload_ofs = 0;
  56284. u16_t varbind_ofs = 0;
  56285. 8031464: 2300 movs r3, #0
  56286. /* lwIP UDP receive callback function */
  56287. static void
  56288. snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
  56289. {
  56290. 8031466: 4688 mov r8, r1
  56291. 8031468: 4614 mov r4, r2
  56292. volatile struct snmp_msg_pstat *msg_ps;
  56293. u8_t req_idx;
  56294. err_t err_ret;
  56295. u16_t payload_len = p->tot_len;
  56296. u16_t payload_ofs = 0;
  56297. u16_t varbind_ofs = 0;
  56298. 803146a: f8ad 3010 strh.w r3, [sp, #16]
  56299. LWIP_UNUSED_ARG(arg);
  56300. /* traverse input message process list, look for SNMP_MSG_EMPTY */
  56301. msg_ps = &msg_input_list[0];
  56302. req_idx = 0;
  56303. while ((req_idx < SNMP_CONCURRENT_REQUESTS) && (msg_ps->state != SNMP_MSG_EMPTY))
  56304. 803146e: 2e00 cmp r6, #0
  56305. 8031470: f000 81aa beq.w 80317c8 <snmp_recv+0x374>
  56306. msg_ps++;
  56307. }
  56308. if (req_idx == SNMP_CONCURRENT_REQUESTS)
  56309. {
  56310. /* exceeding number of concurrent requests */
  56311. pbuf_free(p);
  56312. 8031474: 4620 mov r0, r4
  56313. 8031476: f7f9 feeb bl 802b250 <pbuf_free>
  56314. 803147a: e1d6 b.n 803182a <snmp_recv+0x3d6>
  56315. ofs_base = ofs;
  56316. snmp_asn1_dec_type(p, ofs, &type);
  56317. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  56318. if ((derr != ERR_OK) ||
  56319. (pdu_len != (1 + len_octets + len)) ||
  56320. 803147c: f89d 600e ldrb.w r6, [sp, #14]
  56321. 8031480: f8bd 3012 ldrh.w r3, [sp, #18]
  56322. 8031484: 1c75 adds r5, r6, #1
  56323. 8031486: 18eb adds r3, r5, r3
  56324. s32_t version;
  56325. ofs_base = ofs;
  56326. snmp_asn1_dec_type(p, ofs, &type);
  56327. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  56328. if ((derr != ERR_OK) ||
  56329. 8031488: 429f cmp r7, r3
  56330. 803148a: f040 80c4 bne.w 8031616 <snmp_recv+0x1c2>
  56331. (pdu_len != (1 + len_octets + len)) ||
  56332. 803148e: f89d 300f ldrb.w r3, [sp, #15]
  56333. 8031492: 2b30 cmp r3, #48 ; 0x30
  56334. 8031494: d000 beq.n 8031498 <snmp_recv+0x44>
  56335. 8031496: e0be b.n 8031616 <snmp_recv+0x1c2>
  56336. (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
  56337. {
  56338. snmp_inc_snmpinasnparseerrs();
  56339. return ERR_ARG;
  56340. }
  56341. ofs += (1 + len_octets);
  56342. 8031498: b2ad uxth r5, r5
  56343. snmp_asn1_dec_type(p, ofs, &type);
  56344. 803149a: 4629 mov r1, r5
  56345. 803149c: f10d 020f add.w r2, sp, #15
  56346. 80314a0: 4620 mov r0, r4
  56347. 80314a2: f7fc ffcf bl 802e444 <snmp_asn1_dec_type>
  56348. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  56349. 80314a6: 4620 mov r0, r4
  56350. 80314a8: 1cb1 adds r1, r6, #2
  56351. 80314aa: f10d 020e add.w r2, sp, #14
  56352. 80314ae: f10d 0312 add.w r3, sp, #18
  56353. 80314b2: f7fc ffdc bl 802e46e <snmp_asn1_dec_length>
  56354. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
  56355. 80314b6: 2800 cmp r0, #0
  56356. 80314b8: f040 80ad bne.w 8031616 <snmp_recv+0x1c2>
  56357. 80314bc: f89d 300f ldrb.w r3, [sp, #15]
  56358. 80314c0: 2b02 cmp r3, #2
  56359. 80314c2: f040 80a8 bne.w 8031616 <snmp_recv+0x1c2>
  56360. {
  56361. /* can't decode or no integer (version) */
  56362. snmp_inc_snmpinasnparseerrs();
  56363. return ERR_ARG;
  56364. }
  56365. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &version);
  56366. 80314c6: f89d 100e ldrb.w r1, [sp, #14]
  56367. 80314ca: f8bd 2012 ldrh.w r2, [sp, #18]
  56368. 80314ce: 3101 adds r1, #1
  56369. 80314d0: 4620 mov r0, r4
  56370. 80314d2: 1869 adds r1, r5, r1
  56371. 80314d4: ab05 add r3, sp, #20
  56372. 80314d6: f7fd f8a0 bl 802e61a <snmp_asn1_dec_s32t>
  56373. if (derr != ERR_OK)
  56374. 80314da: 2800 cmp r0, #0
  56375. 80314dc: f040 809b bne.w 8031616 <snmp_recv+0x1c2>
  56376. {
  56377. /* can't decode */
  56378. snmp_inc_snmpinasnparseerrs();
  56379. return ERR_ARG;
  56380. }
  56381. if (version != 0)
  56382. 80314e0: 9b05 ldr r3, [sp, #20]
  56383. 80314e2: b113 cbz r3, 80314ea <snmp_recv+0x96>
  56384. {
  56385. /* not version 1 */
  56386. snmp_inc_snmpinbadversions();
  56387. 80314e4: f7fe fd8a bl 802fffc <snmp_inc_snmpinbadversions>
  56388. 80314e8: e7c4 b.n 8031474 <snmp_recv+0x20>
  56389. return ERR_ARG;
  56390. }
  56391. ofs += (1 + len_octets + len);
  56392. 80314ea: f89d 200e ldrb.w r2, [sp, #14]
  56393. 80314ee: f8bd 3012 ldrh.w r3, [sp, #18]
  56394. 80314f2: 18d3 adds r3, r2, r3
  56395. 80314f4: 18ed adds r5, r5, r3
  56396. 80314f6: b2ad uxth r5, r5
  56397. 80314f8: 1c6e adds r6, r5, #1
  56398. 80314fa: b2b6 uxth r6, r6
  56399. snmp_asn1_dec_type(p, ofs, &type);
  56400. 80314fc: 4631 mov r1, r6
  56401. 80314fe: f10d 020f add.w r2, sp, #15
  56402. 8031502: 4620 mov r0, r4
  56403. 8031504: f7fc ff9e bl 802e444 <snmp_asn1_dec_type>
  56404. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  56405. 8031508: 1ca9 adds r1, r5, #2
  56406. 803150a: 4620 mov r0, r4
  56407. 803150c: b289 uxth r1, r1
  56408. 803150e: f10d 020e add.w r2, sp, #14
  56409. 8031512: f10d 0312 add.w r3, sp, #18
  56410. 8031516: f7fc ffaa bl 802e46e <snmp_asn1_dec_length>
  56411. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR)))
  56412. 803151a: 2800 cmp r0, #0
  56413. 803151c: d17b bne.n 8031616 <snmp_recv+0x1c2>
  56414. 803151e: f89d 300f ldrb.w r3, [sp, #15]
  56415. 8031522: 2b04 cmp r3, #4
  56416. 8031524: d177 bne.n 8031616 <snmp_recv+0x1c2>
  56417. {
  56418. /* can't decode or no octet string (community) */
  56419. snmp_inc_snmpinasnparseerrs();
  56420. return ERR_ARG;
  56421. }
  56422. derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, SNMP_COMMUNITY_STR_LEN, m_stat->community);
  56423. 8031526: f89d 100e ldrb.w r1, [sp, #14]
  56424. 803152a: 4d70 ldr r5, [pc, #448] ; (80316ec <snmp_recv+0x298>)
  56425. 803152c: f8bd 2012 ldrh.w r2, [sp, #18]
  56426. 8031530: 9500 str r5, [sp, #0]
  56427. 8031532: 3101 adds r1, #1
  56428. 8031534: 1871 adds r1, r6, r1
  56429. 8031536: 4620 mov r0, r4
  56430. 8031538: b289 uxth r1, r1
  56431. 803153a: 2340 movs r3, #64 ; 0x40
  56432. 803153c: f7fd f962 bl 802e804 <snmp_asn1_dec_raw>
  56433. if (derr != ERR_OK)
  56434. 8031540: 2800 cmp r0, #0
  56435. 8031542: d168 bne.n 8031616 <snmp_recv+0x1c2>
  56436. {
  56437. snmp_inc_snmpinasnparseerrs();
  56438. return ERR_ARG;
  56439. }
  56440. /* add zero terminator */
  56441. len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
  56442. 8031544: f8bd 3012 ldrh.w r3, [sp, #18]
  56443. m_stat->community[len] = 0;
  56444. 8031548: f1a5 0218 sub.w r2, r5, #24
  56445. {
  56446. snmp_inc_snmpinasnparseerrs();
  56447. return ERR_ARG;
  56448. }
  56449. /* add zero terminator */
  56450. len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
  56451. 803154c: 2b40 cmp r3, #64 ; 0x40
  56452. 803154e: bf28 it cs
  56453. 8031550: 2340 movcs r3, #64 ; 0x40
  56454. m_stat->community[len] = 0;
  56455. 8031552: 18d1 adds r1, r2, r3
  56456. snmp_inc_snmpinbadcommunitynames();
  56457. snmp_authfail_trap();
  56458. return ERR_ARG;
  56459. }*/
  56460. ofs += (1 + len_octets + len);
  56461. 8031554: f89d 200e ldrb.w r2, [sp, #14]
  56462. {
  56463. snmp_inc_snmpinasnparseerrs();
  56464. return ERR_ARG;
  56465. }
  56466. /* add zero terminator */
  56467. len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
  56468. 8031558: f8ad 3012 strh.w r3, [sp, #18]
  56469. m_stat->community[len] = 0;
  56470. m_stat->com_strlen = (u8_t)len;
  56471. 803155c: f885 3041 strb.w r3, [r5, #65] ; 0x41
  56472. snmp_inc_snmpinbadcommunitynames();
  56473. snmp_authfail_trap();
  56474. return ERR_ARG;
  56475. }*/
  56476. ofs += (1 + len_octets + len);
  56477. 8031560: 189b adds r3, r3, r2
  56478. 8031562: 18f6 adds r6, r6, r3
  56479. 8031564: b2b6 uxth r6, r6
  56480. 8031566: f106 0801 add.w r8, r6, #1
  56481. 803156a: fa1f f888 uxth.w r8, r8
  56482. snmp_inc_snmpinasnparseerrs();
  56483. return ERR_ARG;
  56484. }
  56485. /* add zero terminator */
  56486. len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
  56487. m_stat->community[len] = 0;
  56488. 803156e: 7608 strb r0, [r1, #24]
  56489. snmp_authfail_trap();
  56490. return ERR_ARG;
  56491. }*/
  56492. ofs += (1 + len_octets + len);
  56493. snmp_asn1_dec_type(p, ofs, &type);
  56494. 8031570: f10d 020f add.w r2, sp, #15
  56495. 8031574: 4641 mov r1, r8
  56496. 8031576: 4620 mov r0, r4
  56497. 8031578: f7fc ff64 bl 802e444 <snmp_asn1_dec_type>
  56498. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  56499. 803157c: 1cb1 adds r1, r6, #2
  56500. 803157e: 4620 mov r0, r4
  56501. 8031580: b289 uxth r1, r1
  56502. 8031582: f10d 020e add.w r2, sp, #14
  56503. 8031586: f10d 0312 add.w r3, sp, #18
  56504. 803158a: f7fc ff70 bl 802e46e <snmp_asn1_dec_length>
  56505. if (derr != ERR_OK)
  56506. 803158e: 2800 cmp r0, #0
  56507. 8031590: d141 bne.n 8031616 <snmp_recv+0x1c2>
  56508. return ERR_ARG;
  56509. }
  56510. /* FIX for write/read communuty */
  56511. /* GetRequest PDU */
  56512. if (type == (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ))
  56513. 8031592: f89d 300f ldrb.w r3, [sp, #15]
  56514. 8031596: 2ba0 cmp r3, #160 ; 0xa0
  56515. 8031598: d10f bne.n 80315ba <snmp_recv+0x166>
  56516. {
  56517. if (strncmp(sSettings.sSnmp.readCommunity, (const char*)m_stat->community, strlen(sSettings.sSnmp.readCommunity)) != 0
  56518. 803159a: 4855 ldr r0, [pc, #340] ; (80316f0 <snmp_recv+0x29c>)
  56519. 803159c: f7f0 fae4 bl 8021b68 <strlen>
  56520. 80315a0: 4629 mov r1, r5
  56521. 80315a2: 4602 mov r2, r0
  56522. 80315a4: 4852 ldr r0, [pc, #328] ; (80316f0 <snmp_recv+0x29c>)
  56523. 80315a6: f7f0 fb41 bl 8021c2c <strncmp>
  56524. 80315aa: b120 cbz r0, 80315b6 <snmp_recv+0x162>
  56525. || (strlen(sSettings.sSnmp.readCommunity) != strlen((const char*)m_stat->community)) )
  56526. {
  56527. snmp_inc_snmpinbadcommunitynames();
  56528. 80315ac: f7fe fd2e bl 803000c <snmp_inc_snmpinbadcommunitynames>
  56529. snmp_authfail_trap();
  56530. 80315b0: f000 fd7e bl 80320b0 <snmp_authfail_trap>
  56531. 80315b4: e75e b.n 8031474 <snmp_recv+0x20>
  56532. /* FIX for write/read communuty */
  56533. /* GetRequest PDU */
  56534. if (type == (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ))
  56535. {
  56536. if (strncmp(sSettings.sSnmp.readCommunity, (const char*)m_stat->community, strlen(sSettings.sSnmp.readCommunity)) != 0
  56537. || (strlen(sSettings.sSnmp.readCommunity) != strlen((const char*)m_stat->community)) )
  56538. 80315b6: 484e ldr r0, [pc, #312] ; (80316f0 <snmp_recv+0x29c>)
  56539. 80315b8: e00c b.n 80315d4 <snmp_recv+0x180>
  56540. snmp_authfail_trap();
  56541. return ERR_ARG;
  56542. }
  56543. }
  56544. /* SetRequest PDU */
  56545. else if (type == (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_SET_REQ))
  56546. 80315ba: 2ba3 cmp r3, #163 ; 0xa3
  56547. 80315bc: d112 bne.n 80315e4 <snmp_recv+0x190>
  56548. {
  56549. if (strncmp(sSettings.sSnmp.writeCommunity, (const char*)m_stat->community, strlen(sSettings.sSnmp.writeCommunity)) != 0
  56550. 80315be: 484d ldr r0, [pc, #308] ; (80316f4 <snmp_recv+0x2a0>)
  56551. 80315c0: f7f0 fad2 bl 8021b68 <strlen>
  56552. 80315c4: 4629 mov r1, r5
  56553. 80315c6: 4602 mov r2, r0
  56554. 80315c8: 484a ldr r0, [pc, #296] ; (80316f4 <snmp_recv+0x2a0>)
  56555. 80315ca: f7f0 fb2f bl 8021c2c <strncmp>
  56556. 80315ce: 2800 cmp r0, #0
  56557. 80315d0: d1ec bne.n 80315ac <snmp_recv+0x158>
  56558. || (strlen(sSettings.sSnmp.writeCommunity) != strlen((const char*)m_stat->community)) )
  56559. 80315d2: 4848 ldr r0, [pc, #288] ; (80316f4 <snmp_recv+0x2a0>)
  56560. 80315d4: f7f0 fac8 bl 8021b68 <strlen>
  56561. 80315d8: 4606 mov r6, r0
  56562. 80315da: 4628 mov r0, r5
  56563. 80315dc: f7f0 fac4 bl 8021b68 <strlen>
  56564. 80315e0: 4286 cmp r6, r0
  56565. 80315e2: d1e3 bne.n 80315ac <snmp_recv+0x158>
  56566. snmp_authfail_trap();
  56567. return ERR_ARG;
  56568. }
  56569. }
  56570. switch(type)
  56571. 80315e4: f89d 300f ldrb.w r3, [sp, #15]
  56572. 80315e8: 3ba0 subs r3, #160 ; 0xa0
  56573. 80315ea: 2b04 cmp r3, #4
  56574. 80315ec: d813 bhi.n 8031616 <snmp_recv+0x1c2>
  56575. 80315ee: e8df f003 tbb [pc, r3]
  56576. 80315f2: 0603 .short 0x0603
  56577. 80315f4: 0c09 .short 0x0c09
  56578. 80315f6: 0f .byte 0x0f
  56579. 80315f7: 00 .byte 0x00
  56580. {
  56581. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ):
  56582. // GetRequest PDU
  56583. snmp_inc_snmpingetrequests();
  56584. 80315f8: f7fe fd50 bl 803009c <snmp_inc_snmpingetrequests>
  56585. 80315fc: e100 b.n 8031800 <snmp_recv+0x3ac>
  56586. derr = ERR_OK;
  56587. break;
  56588. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_NEXT_REQ):
  56589. // GetNextRequest PDU
  56590. snmp_inc_snmpingetnexts();
  56591. 80315fe: f7fe fd55 bl 80300ac <snmp_inc_snmpingetnexts>
  56592. 8031602: e0fd b.n 8031800 <snmp_recv+0x3ac>
  56593. derr = ERR_OK;
  56594. break;
  56595. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP):
  56596. // GetResponse PDU
  56597. snmp_inc_snmpingetresponses();
  56598. 8031604: f7fe fd62 bl 80300cc <snmp_inc_snmpingetresponses>
  56599. 8031608: e734 b.n 8031474 <snmp_recv+0x20>
  56600. derr = ERR_ARG;
  56601. break;
  56602. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_SET_REQ):
  56603. // SetRequest PDU
  56604. snmp_inc_snmpinsetrequests();
  56605. 803160a: f7fe fd57 bl 80300bc <snmp_inc_snmpinsetrequests>
  56606. 803160e: e0f7 b.n 8031800 <snmp_recv+0x3ac>
  56607. derr = ERR_OK;
  56608. break;
  56609. case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP):
  56610. // Trap PDU
  56611. snmp_inc_snmpintraps();
  56612. 8031610: f7fe fd64 bl 80300dc <snmp_inc_snmpintraps>
  56613. 8031614: e72e b.n 8031474 <snmp_recv+0x20>
  56614. derr = ERR_ARG;
  56615. break;
  56616. default:
  56617. snmp_inc_snmpinasnparseerrs();
  56618. 8031616: f7fe fd01 bl 803001c <snmp_inc_snmpinasnparseerrs>
  56619. 803161a: e72b b.n 8031474 <snmp_recv+0x20>
  56620. {
  56621. /* decoded PDU length does not equal actual payload length */
  56622. snmp_inc_snmpinasnparseerrs();
  56623. return ERR_ARG;
  56624. }
  56625. snmp_asn1_dec_type(p, ofs, &type);
  56626. 803161c: 4631 mov r1, r6
  56627. 803161e: f10d 020f add.w r2, sp, #15
  56628. 8031622: 4620 mov r0, r4
  56629. 8031624: f7fc ff0e bl 802e444 <snmp_asn1_dec_type>
  56630. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  56631. 8031628: f108 0102 add.w r1, r8, #2
  56632. 803162c: 4620 mov r0, r4
  56633. 803162e: b289 uxth r1, r1
  56634. 8031630: f10d 020e add.w r2, sp, #14
  56635. 8031634: f10d 0312 add.w r3, sp, #18
  56636. 8031638: f7fc ff19 bl 802e46e <snmp_asn1_dec_length>
  56637. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
  56638. 803163c: 2800 cmp r0, #0
  56639. 803163e: d1ea bne.n 8031616 <snmp_recv+0x1c2>
  56640. 8031640: f89d 300f ldrb.w r3, [sp, #15]
  56641. 8031644: 2b02 cmp r3, #2
  56642. 8031646: d1e6 bne.n 8031616 <snmp_recv+0x1c2>
  56643. {
  56644. /* can't decode or no integer (request ID) */
  56645. snmp_inc_snmpinasnparseerrs();
  56646. return ERR_ARG;
  56647. }
  56648. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->rid);
  56649. 8031648: f89d 100e ldrb.w r1, [sp, #14]
  56650. 803164c: f8bd 2012 ldrh.w r2, [sp, #18]
  56651. 8031650: 3101 adds r1, #1
  56652. 8031652: 1871 adds r1, r6, r1
  56653. 8031654: 4620 mov r0, r4
  56654. 8031656: b289 uxth r1, r1
  56655. 8031658: f105 030c add.w r3, r5, #12
  56656. 803165c: f7fc ffdd bl 802e61a <snmp_asn1_dec_s32t>
  56657. if (derr != ERR_OK)
  56658. 8031660: 2800 cmp r0, #0
  56659. 8031662: d1d8 bne.n 8031616 <snmp_recv+0x1c2>
  56660. {
  56661. /* can't decode */
  56662. snmp_inc_snmpinasnparseerrs();
  56663. return ERR_ARG;
  56664. }
  56665. ofs += (1 + len_octets + len);
  56666. 8031664: f89d 200e ldrb.w r2, [sp, #14]
  56667. 8031668: f8bd 3012 ldrh.w r3, [sp, #18]
  56668. 803166c: 18d3 adds r3, r2, r3
  56669. 803166e: 18f6 adds r6, r6, r3
  56670. 8031670: b2b6 uxth r6, r6
  56671. 8031672: 1c77 adds r7, r6, #1
  56672. 8031674: b2bf uxth r7, r7
  56673. snmp_asn1_dec_type(p, ofs, &type);
  56674. 8031676: 4639 mov r1, r7
  56675. 8031678: f10d 020f add.w r2, sp, #15
  56676. 803167c: 4620 mov r0, r4
  56677. 803167e: f7fc fee1 bl 802e444 <snmp_asn1_dec_type>
  56678. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  56679. 8031682: 1cb1 adds r1, r6, #2
  56680. 8031684: 4620 mov r0, r4
  56681. 8031686: b289 uxth r1, r1
  56682. 8031688: f10d 020e add.w r2, sp, #14
  56683. 803168c: f10d 0312 add.w r3, sp, #18
  56684. 8031690: f7fc feed bl 802e46e <snmp_asn1_dec_length>
  56685. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
  56686. 8031694: 2800 cmp r0, #0
  56687. 8031696: d1be bne.n 8031616 <snmp_recv+0x1c2>
  56688. 8031698: f89d 300f ldrb.w r3, [sp, #15]
  56689. 803169c: 2b02 cmp r3, #2
  56690. 803169e: d1ba bne.n 8031616 <snmp_recv+0x1c2>
  56691. snmp_inc_snmpinasnparseerrs();
  56692. return ERR_ARG;
  56693. }
  56694. /* must be noError (0) for incoming requests.
  56695. log errors for mib-2 completeness and for debug purposes */
  56696. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_status);
  56697. 80316a0: f89d 100e ldrb.w r1, [sp, #14]
  56698. 80316a4: f8bd 2012 ldrh.w r2, [sp, #18]
  56699. 80316a8: 3101 adds r1, #1
  56700. 80316aa: 1879 adds r1, r7, r1
  56701. 80316ac: 4620 mov r0, r4
  56702. 80316ae: b289 uxth r1, r1
  56703. 80316b0: f105 0310 add.w r3, r5, #16
  56704. 80316b4: f7fc ffb1 bl 802e61a <snmp_asn1_dec_s32t>
  56705. if (derr != ERR_OK)
  56706. 80316b8: 2800 cmp r0, #0
  56707. 80316ba: d1ac bne.n 8031616 <snmp_recv+0x1c2>
  56708. {
  56709. /* can't decode */
  56710. snmp_inc_snmpinasnparseerrs();
  56711. return ERR_ARG;
  56712. }
  56713. switch (m_stat->error_status)
  56714. 80316bc: 692b ldr r3, [r5, #16]
  56715. 80316be: 3b01 subs r3, #1
  56716. 80316c0: 2b04 cmp r3, #4
  56717. 80316c2: d81b bhi.n 80316fc <snmp_recv+0x2a8>
  56718. 80316c4: e8df f003 tbb [pc, r3]
  56719. 80316c8: 0c090603 .word 0x0c090603
  56720. 80316cc: 18 .byte 0x18
  56721. 80316cd: 00 .byte 0x00
  56722. {
  56723. case SNMP_ES_TOOBIG:
  56724. snmp_inc_snmpintoobigs();
  56725. 80316ce: f7fe fcad bl 803002c <snmp_inc_snmpintoobigs>
  56726. 80316d2: e013 b.n 80316fc <snmp_recv+0x2a8>
  56727. break;
  56728. case SNMP_ES_NOSUCHNAME:
  56729. snmp_inc_snmpinnosuchnames();
  56730. 80316d4: f7fe fcb2 bl 803003c <snmp_inc_snmpinnosuchnames>
  56731. 80316d8: e010 b.n 80316fc <snmp_recv+0x2a8>
  56732. break;
  56733. case SNMP_ES_BADVALUE:
  56734. snmp_inc_snmpinbadvalues();
  56735. 80316da: f7fe fcb7 bl 803004c <snmp_inc_snmpinbadvalues>
  56736. 80316de: e00d b.n 80316fc <snmp_recv+0x2a8>
  56737. break;
  56738. case SNMP_ES_READONLY:
  56739. snmp_inc_snmpinreadonlys();
  56740. 80316e0: f7fe fcbc bl 803005c <snmp_inc_snmpinreadonlys>
  56741. 80316e4: e00a b.n 80316fc <snmp_recv+0x2a8>
  56742. 80316e6: bf00 nop
  56743. 80316e8: 20010dac .word 0x20010dac
  56744. 80316ec: 20010dc4 .word 0x20010dc4
  56745. 80316f0: 2000e972 .word 0x2000e972
  56746. 80316f4: 2000e986 .word 0x2000e986
  56747. break;
  56748. case SNMP_ES_GENERROR:
  56749. snmp_inc_snmpingenerrs();
  56750. 80316f8: f7fe fcb8 bl 803006c <snmp_inc_snmpingenerrs>
  56751. break;
  56752. }
  56753. ofs += (1 + len_octets + len);
  56754. 80316fc: f89d 200e ldrb.w r2, [sp, #14]
  56755. 8031700: f8bd 3012 ldrh.w r3, [sp, #18]
  56756. 8031704: 18d3 adds r3, r2, r3
  56757. 8031706: 18ff adds r7, r7, r3
  56758. 8031708: b2bf uxth r7, r7
  56759. 803170a: 1c7d adds r5, r7, #1
  56760. 803170c: b2ad uxth r5, r5
  56761. snmp_asn1_dec_type(p, ofs, &type);
  56762. 803170e: 4629 mov r1, r5
  56763. 8031710: f10d 020f add.w r2, sp, #15
  56764. 8031714: 4620 mov r0, r4
  56765. 8031716: f7fc fe95 bl 802e444 <snmp_asn1_dec_type>
  56766. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  56767. 803171a: 1cb9 adds r1, r7, #2
  56768. 803171c: 4620 mov r0, r4
  56769. 803171e: b289 uxth r1, r1
  56770. 8031720: f10d 020e add.w r2, sp, #14
  56771. 8031724: f10d 0312 add.w r3, sp, #18
  56772. 8031728: f7fc fea1 bl 802e46e <snmp_asn1_dec_length>
  56773. if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
  56774. 803172c: 2800 cmp r0, #0
  56775. 803172e: f47f af72 bne.w 8031616 <snmp_recv+0x1c2>
  56776. 8031732: f89d 300f ldrb.w r3, [sp, #15]
  56777. 8031736: 2b02 cmp r3, #2
  56778. 8031738: f47f af6d bne.w 8031616 <snmp_recv+0x1c2>
  56779. snmp_inc_snmpinasnparseerrs();
  56780. return ERR_ARG;
  56781. }
  56782. /* must be 0 for incoming requests.
  56783. decode anyway to catch bad integers (and dirty tricks) */
  56784. derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_index);
  56785. 803173c: f89d 100e ldrb.w r1, [sp, #14]
  56786. 8031740: f8bd 2012 ldrh.w r2, [sp, #18]
  56787. 8031744: 4b3a ldr r3, [pc, #232] ; (8031830 <snmp_recv+0x3dc>)
  56788. 8031746: 3101 adds r1, #1
  56789. 8031748: 1869 adds r1, r5, r1
  56790. 803174a: 4620 mov r0, r4
  56791. 803174c: b289 uxth r1, r1
  56792. 803174e: f7fc ff64 bl 802e61a <snmp_asn1_dec_s32t>
  56793. if (derr != ERR_OK)
  56794. 8031752: 2800 cmp r0, #0
  56795. 8031754: f47f af5f bne.w 8031616 <snmp_recv+0x1c2>
  56796. {
  56797. /* can't decode */
  56798. snmp_inc_snmpinasnparseerrs();
  56799. return ERR_ARG;
  56800. }
  56801. ofs += (1 + len_octets + len);
  56802. 8031758: f8bd 3012 ldrh.w r3, [sp, #18]
  56803. 803175c: f89d 200e ldrb.w r2, [sp, #14]
  56804. 8031760: 3301 adds r3, #1
  56805. 8031762: 189b adds r3, r3, r2
  56806. 8031764: 18ed adds r5, r5, r3
  56807. /* check total length, version, community, pdu type */
  56808. err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
  56809. /* Only accept requests and requests without error (be robust) */
  56810. /* Reject response and trap headers or error requests as input! */
  56811. if ((err_ret != ERR_OK) ||
  56812. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  56813. 8031766: 4b33 ldr r3, [pc, #204] ; (8031834 <snmp_recv+0x3e0>)
  56814. /* can't decode */
  56815. snmp_inc_snmpinasnparseerrs();
  56816. return ERR_ARG;
  56817. }
  56818. ofs += (1 + len_octets + len);
  56819. *ofs_ret = ofs;
  56820. 8031768: f8ad 5010 strh.w r5, [sp, #16]
  56821. /* check total length, version, community, pdu type */
  56822. err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
  56823. /* Only accept requests and requests without error (be robust) */
  56824. /* Reject response and trap headers or error requests as input! */
  56825. if ((err_ret != ERR_OK) ||
  56826. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  56827. 803176c: 7a9a ldrb r2, [r3, #10]
  56828. /* check total length, version, community, pdu type */
  56829. err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
  56830. /* Only accept requests and requests without error (be robust) */
  56831. /* Reject response and trap headers or error requests as input! */
  56832. if ((err_ret != ERR_OK) ||
  56833. 803176e: b132 cbz r2, 803177e <snmp_recv+0x32a>
  56834. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  56835. (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) &&
  56836. 8031770: 7a9a ldrb r2, [r3, #10]
  56837. /* check total length, version, community, pdu type */
  56838. err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
  56839. /* Only accept requests and requests without error (be robust) */
  56840. /* Reject response and trap headers or error requests as input! */
  56841. if ((err_ret != ERR_OK) ||
  56842. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  56843. 8031772: 2a01 cmp r2, #1
  56844. 8031774: d003 beq.n 803177e <snmp_recv+0x32a>
  56845. (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) &&
  56846. (msg_ps->rt != SNMP_ASN1_PDU_SET_REQ)) ||
  56847. 8031776: 7a9a ldrb r2, [r3, #10]
  56848. err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
  56849. /* Only accept requests and requests without error (be robust) */
  56850. /* Reject response and trap headers or error requests as input! */
  56851. if ((err_ret != ERR_OK) ||
  56852. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  56853. (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) &&
  56854. 8031778: 2a03 cmp r2, #3
  56855. 803177a: f47f ae7b bne.w 8031474 <snmp_recv+0x20>
  56856. (msg_ps->rt != SNMP_ASN1_PDU_SET_REQ)) ||
  56857. ((msg_ps->error_status != SNMP_ES_NOERROR) ||
  56858. 803177e: 691b ldr r3, [r3, #16]
  56859. 8031780: 4d2c ldr r5, [pc, #176] ; (8031834 <snmp_recv+0x3e0>)
  56860. /* Only accept requests and requests without error (be robust) */
  56861. /* Reject response and trap headers or error requests as input! */
  56862. if ((err_ret != ERR_OK) ||
  56863. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  56864. (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) &&
  56865. (msg_ps->rt != SNMP_ASN1_PDU_SET_REQ)) ||
  56866. 8031782: 2b00 cmp r3, #0
  56867. 8031784: f47f ae76 bne.w 8031474 <snmp_recv+0x20>
  56868. ((msg_ps->error_status != SNMP_ES_NOERROR) ||
  56869. (msg_ps->error_index != 0)) )
  56870. 8031788: 696b ldr r3, [r5, #20]
  56871. /* Reject response and trap headers or error requests as input! */
  56872. if ((err_ret != ERR_OK) ||
  56873. ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) &&
  56874. (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) &&
  56875. (msg_ps->rt != SNMP_ASN1_PDU_SET_REQ)) ||
  56876. ((msg_ps->error_status != SNMP_ES_NOERROR) ||
  56877. 803178a: 2b00 cmp r3, #0
  56878. 803178c: f47f ae72 bne.w 8031474 <snmp_recv+0x20>
  56879. }
  56880. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv ok, community %s\n", msg_ps->community));
  56881. /* Builds a list of variable bindings. Copy the varbinds from the pbuf
  56882. chain to glue them when these are divided over two or more pbuf's. */
  56883. err_ret = snmp_pdu_dec_varbindlist(p, varbind_ofs, &varbind_ofs, msg_ps);
  56884. 8031790: aa06 add r2, sp, #24
  56885. 8031792: 4620 mov r0, r4
  56886. 8031794: f832 1d08 ldrh.w r1, [r2, #-8]!
  56887. 8031798: 462b mov r3, r5
  56888. 803179a: f7ff fd01 bl 80311a0 <snmp_pdu_dec_varbindlist>
  56889. 803179e: 4606 mov r6, r0
  56890. /* we've decoded the incoming message, release input msg now */
  56891. pbuf_free(p);
  56892. 80317a0: 4620 mov r0, r4
  56893. 80317a2: f7f9 fd55 bl 802b250 <pbuf_free>
  56894. if ((err_ret != ERR_OK) || (msg_ps->invb.count == 0))
  56895. 80317a6: 2e00 cmp r6, #0
  56896. 80317a8: d13f bne.n 803182a <snmp_recv+0x3d6>
  56897. 80317aa: f895 3108 ldrb.w r3, [r5, #264] ; 0x108
  56898. 80317ae: 2b00 cmp r3, #0
  56899. 80317b0: d03b beq.n 803182a <snmp_recv+0x3d6>
  56900. }
  56901. msg_ps->error_status = SNMP_ES_NOERROR;
  56902. msg_ps->error_index = 0;
  56903. /* find object for each variable binding */
  56904. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  56905. 80317b2: 2301 movs r3, #1
  56906. (errors are only returned for a specific varbind failure) */
  56907. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_pdu_dec_varbindlist() failed\n"));
  56908. return;
  56909. }
  56910. msg_ps->error_status = SNMP_ES_NOERROR;
  56911. 80317b4: 612e str r6, [r5, #16]
  56912. msg_ps->vb_idx = 0;
  56913. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv varbind cnt=%"U16_F"\n",(u16_t)msg_ps->invb.count));
  56914. /* handle input event and as much objects as possible in one go */
  56915. snmp_msg_event(req_idx);
  56916. 80317b6: 4630 mov r0, r6
  56917. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_pdu_dec_varbindlist() failed\n"));
  56918. return;
  56919. }
  56920. msg_ps->error_status = SNMP_ES_NOERROR;
  56921. msg_ps->error_index = 0;
  56922. 80317b8: 616e str r6, [r5, #20]
  56923. /* find object for each variable binding */
  56924. msg_ps->state = SNMP_MSG_SEARCH_OBJ;
  56925. 80317ba: f885 305a strb.w r3, [r5, #90] ; 0x5a
  56926. /* first variable binding from list to inspect */
  56927. msg_ps->vb_idx = 0;
  56928. 80317be: f885 60f8 strb.w r6, [r5, #248] ; 0xf8
  56929. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv varbind cnt=%"U16_F"\n",(u16_t)msg_ps->invb.count));
  56930. /* handle input event and as much objects as possible in one go */
  56931. snmp_msg_event(req_idx);
  56932. 80317c2: f7ff f94d bl 8030a60 <snmp_msg_event>
  56933. 80317c6: e030 b.n 803182a <snmp_recv+0x3d6>
  56934. pbuf_free(p);
  56935. return;
  56936. }
  56937. /* accepting request */
  56938. snmp_inc_snmpinpkts();
  56939. 80317c8: f7fe fc08 bl 802ffdc <snmp_inc_snmpinpkts>
  56940. /* record used 'protocol control block' */
  56941. msg_ps->pcb = pcb;
  56942. /* source address (network order) */
  56943. msg_ps->sip = *addr;
  56944. 80317cc: f8d9 3000 ldr.w r3, [r9]
  56945. }
  56946. /* accepting request */
  56947. snmp_inc_snmpinpkts();
  56948. /* record used 'protocol control block' */
  56949. msg_ps->pcb = pcb;
  56950. 80317d0: f8c5 8000 str.w r8, [r5]
  56951. /* source address (network order) */
  56952. msg_ps->sip = *addr;
  56953. 80317d4: 606b str r3, [r5, #4]
  56954. /* source port (host order (lwIP oddity)) */
  56955. msg_ps->sp = port;
  56956. 80317d6: f8bd 3038 ldrh.w r3, [sp, #56] ; 0x38
  56957. u8_t len_octets;
  56958. u8_t type;
  56959. s32_t version;
  56960. ofs_base = ofs;
  56961. snmp_asn1_dec_type(p, ofs, &type);
  56962. 80317da: 4631 mov r1, r6
  56963. /* record used 'protocol control block' */
  56964. msg_ps->pcb = pcb;
  56965. /* source address (network order) */
  56966. msg_ps->sip = *addr;
  56967. /* source port (host order (lwIP oddity)) */
  56968. msg_ps->sp = port;
  56969. 80317dc: 812b strh r3, [r5, #8]
  56970. u8_t len_octets;
  56971. u8_t type;
  56972. s32_t version;
  56973. ofs_base = ofs;
  56974. snmp_asn1_dec_type(p, ofs, &type);
  56975. 80317de: f10d 020f add.w r2, sp, #15
  56976. 80317e2: 4620 mov r0, r4
  56977. 80317e4: f7fc fe2e bl 802e444 <snmp_asn1_dec_type>
  56978. derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
  56979. 80317e8: 4620 mov r0, r4
  56980. 80317ea: 2101 movs r1, #1
  56981. 80317ec: f10d 020e add.w r2, sp, #14
  56982. 80317f0: f10d 0312 add.w r3, sp, #18
  56983. 80317f4: f7fc fe3b bl 802e46e <snmp_asn1_dec_length>
  56984. if ((derr != ERR_OK) ||
  56985. 80317f8: 2800 cmp r0, #0
  56986. 80317fa: f43f ae3f beq.w 803147c <snmp_recv+0x28>
  56987. 80317fe: e70a b.n 8031616 <snmp_recv+0x1c2>
  56988. if (derr != ERR_OK)
  56989. {
  56990. /* unsupported input PDU for this agent (no parse error) */
  56991. return ERR_ARG;
  56992. }
  56993. m_stat->rt = type & 0x1F;
  56994. 8031800: f89d 300f ldrb.w r3, [sp, #15]
  56995. 8031804: 4d0b ldr r5, [pc, #44] ; (8031834 <snmp_recv+0x3e0>)
  56996. 8031806: f003 031f and.w r3, r3, #31
  56997. 803180a: 72ab strb r3, [r5, #10]
  56998. ofs += (1 + len_octets);
  56999. 803180c: f89d 300e ldrb.w r3, [sp, #14]
  57000. 8031810: 4498 add r8, r3
  57001. 8031812: fa1f f888 uxth.w r8, r8
  57002. 8031816: f108 0601 add.w r6, r8, #1
  57003. 803181a: b2b6 uxth r6, r6
  57004. if (len != (pdu_len - (ofs - ofs_base)))
  57005. 803181c: f8bd 3012 ldrh.w r3, [sp, #18]
  57006. 8031820: 1bbf subs r7, r7, r6
  57007. 8031822: 42bb cmp r3, r7
  57008. 8031824: f43f aefa beq.w 803161c <snmp_recv+0x1c8>
  57009. 8031828: e6f5 b.n 8031616 <snmp_recv+0x1c2>
  57010. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv varbind cnt=%"U16_F"\n",(u16_t)msg_ps->invb.count));
  57011. /* handle input event and as much objects as possible in one go */
  57012. snmp_msg_event(req_idx);
  57013. }
  57014. 803182a: b007 add sp, #28
  57015. 803182c: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
  57016. 8031830: 20010dc0 .word 0x20010dc0
  57017. 8031834: 20010dac .word 0x20010dac
  57018. 08031838 <snmp_varbind_list_sum>:
  57019. * @param root points to the root of the variable binding list
  57020. * @return the required lenght for encoding the variable bindings
  57021. */
  57022. static u16_t
  57023. snmp_varbind_list_sum(struct snmp_varbind_root *root)
  57024. {
  57025. 8031838: b5f8 push {r3, r4, r5, r6, r7, lr}
  57026. struct snmp_varbind *vb;
  57027. u32_t *uint_ptr;
  57028. s32_t *sint_ptr;
  57029. u16_t tot_len;
  57030. tot_len = 0;
  57031. 803183a: 2500 movs r5, #0
  57032. * @param root points to the root of the variable binding list
  57033. * @return the required lenght for encoding the variable bindings
  57034. */
  57035. static u16_t
  57036. snmp_varbind_list_sum(struct snmp_varbind_root *root)
  57037. {
  57038. 803183c: 4606 mov r6, r0
  57039. u32_t *uint_ptr;
  57040. s32_t *sint_ptr;
  57041. u16_t tot_len;
  57042. tot_len = 0;
  57043. vb = root->tail;
  57044. 803183e: 6844 ldr r4, [r0, #4]
  57045. sint_ptr = (s32_t*)vb->value;
  57046. snmp_asn1_enc_oid_cnt(vb->value_len / sizeof(s32_t), sint_ptr, &vb->vlen);
  57047. break;
  57048. default:
  57049. /* unsupported type */
  57050. vb->vlen = 0;
  57051. 8031840: 462f mov r7, r5
  57052. s32_t *sint_ptr;
  57053. u16_t tot_len;
  57054. tot_len = 0;
  57055. vb = root->tail;
  57056. while ( vb != NULL )
  57057. 8031842: e051 b.n 80318e8 <snmp_varbind_list_sum+0xb0>
  57058. {
  57059. /* encoded value lenght depends on type */
  57060. switch (vb->value_type)
  57061. 8031844: 7c23 ldrb r3, [r4, #16]
  57062. 8031846: 2b06 cmp r3, #6
  57063. 8031848: d020 beq.n 803188c <snmp_varbind_list_sum+0x54>
  57064. 803184a: d805 bhi.n 8031858 <snmp_varbind_list_sum+0x20>
  57065. 803184c: 2b02 cmp r3, #2
  57066. 803184e: d00c beq.n 803186a <snmp_varbind_list_sum+0x32>
  57067. 8031850: d324 bcc.n 803189c <snmp_varbind_list_sum+0x64>
  57068. 8031852: 2b04 cmp r3, #4
  57069. 8031854: d322 bcc.n 803189c <snmp_varbind_list_sum+0x64>
  57070. 8031856: e016 b.n 8031886 <snmp_varbind_list_sum+0x4e>
  57071. 8031858: 2b43 cmp r3, #67 ; 0x43
  57072. 803185a: d803 bhi.n 8031864 <snmp_varbind_list_sum+0x2c>
  57073. 803185c: 2b41 cmp r3, #65 ; 0x41
  57074. 803185e: d20b bcs.n 8031878 <snmp_varbind_list_sum+0x40>
  57075. 8031860: 2b40 cmp r3, #64 ; 0x40
  57076. 8031862: e000 b.n 8031866 <snmp_varbind_list_sum+0x2e>
  57077. 8031864: 2b44 cmp r3, #68 ; 0x44
  57078. 8031866: d119 bne.n 803189c <snmp_varbind_list_sum+0x64>
  57079. 8031868: e00d b.n 8031886 <snmp_varbind_list_sum+0x4e>
  57080. {
  57081. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
  57082. sint_ptr = (s32_t*)vb->value;
  57083. snmp_asn1_enc_s32t_cnt(*sint_ptr, &vb->vlen);
  57084. 803186a: 6963 ldr r3, [r4, #20]
  57085. 803186c: f104 0120 add.w r1, r4, #32
  57086. 8031870: 6818 ldr r0, [r3, #0]
  57087. 8031872: f7fd f81e bl 802e8b2 <snmp_asn1_enc_s32t_cnt>
  57088. break;
  57089. 8031876: e012 b.n 803189e <snmp_varbind_list_sum+0x66>
  57090. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
  57091. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
  57092. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
  57093. uint_ptr = (u32_t*)vb->value;
  57094. snmp_asn1_enc_u32t_cnt(*uint_ptr, &vb->vlen);
  57095. 8031878: 6963 ldr r3, [r4, #20]
  57096. 803187a: f104 0120 add.w r1, r4, #32
  57097. 803187e: 6818 ldr r0, [r3, #0]
  57098. 8031880: f7fd f802 bl 802e888 <snmp_asn1_enc_u32t_cnt>
  57099. break;
  57100. 8031884: e00b b.n 803189e <snmp_varbind_list_sum+0x66>
  57101. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
  57102. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
  57103. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
  57104. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
  57105. vb->vlen = vb->value_len;
  57106. 8031886: 7c63 ldrb r3, [r4, #17]
  57107. 8031888: 8423 strh r3, [r4, #32]
  57108. break;
  57109. 803188a: e008 b.n 803189e <snmp_varbind_list_sum+0x66>
  57110. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
  57111. sint_ptr = (s32_t*)vb->value;
  57112. snmp_asn1_enc_oid_cnt(vb->value_len / sizeof(s32_t), sint_ptr, &vb->vlen);
  57113. 803188c: 7c60 ldrb r0, [r4, #17]
  57114. 803188e: 6961 ldr r1, [r4, #20]
  57115. 8031890: 0880 lsrs r0, r0, #2
  57116. 8031892: f104 0220 add.w r2, r4, #32
  57117. 8031896: f7fd f821 bl 802e8dc <snmp_asn1_enc_oid_cnt>
  57118. break;
  57119. 803189a: e000 b.n 803189e <snmp_varbind_list_sum+0x66>
  57120. default:
  57121. /* unsupported type */
  57122. vb->vlen = 0;
  57123. 803189c: 8427 strh r7, [r4, #32]
  57124. break;
  57125. };
  57126. /* encoding length of value length field */
  57127. snmp_asn1_enc_length_cnt(vb->vlen, &vb->vlenlen);
  57128. 803189e: 8c20 ldrh r0, [r4, #32]
  57129. 80318a0: f104 011a add.w r1, r4, #26
  57130. 80318a4: f7fc ffe5 bl 802e872 <snmp_asn1_enc_length_cnt>
  57131. snmp_asn1_enc_oid_cnt(vb->ident_len, vb->ident, &vb->olen);
  57132. 80318a8: f104 021e add.w r2, r4, #30
  57133. 80318ac: 7a20 ldrb r0, [r4, #8]
  57134. 80318ae: 68e1 ldr r1, [r4, #12]
  57135. 80318b0: f7fd f814 bl 802e8dc <snmp_asn1_enc_oid_cnt>
  57136. snmp_asn1_enc_length_cnt(vb->olen, &vb->olenlen);
  57137. 80318b4: 8be0 ldrh r0, [r4, #30]
  57138. 80318b6: f104 0119 add.w r1, r4, #25
  57139. 80318ba: f7fc ffda bl 802e872 <snmp_asn1_enc_length_cnt>
  57140. vb->seqlen = 1 + vb->vlenlen + vb->vlen;
  57141. 80318be: 8be3 ldrh r3, [r4, #30]
  57142. 80318c0: 8c20 ldrh r0, [r4, #32]
  57143. 80318c2: 18c0 adds r0, r0, r3
  57144. 80318c4: 7ea3 ldrb r3, [r4, #26]
  57145. vb->seqlen += 1 + vb->olenlen + vb->olen;
  57146. 80318c6: 3002 adds r0, #2
  57147. 80318c8: 18c0 adds r0, r0, r3
  57148. 80318ca: 7e63 ldrb r3, [r4, #25]
  57149. 80318cc: 18c0 adds r0, r0, r3
  57150. 80318ce: b280 uxth r0, r0
  57151. 80318d0: 83a0 strh r0, [r4, #28]
  57152. snmp_asn1_enc_length_cnt(vb->seqlen, &vb->seqlenlen);
  57153. 80318d2: f104 0118 add.w r1, r4, #24
  57154. 80318d6: f7fc ffcc bl 802e872 <snmp_asn1_enc_length_cnt>
  57155. /* varbind seq */
  57156. tot_len += 1 + vb->seqlenlen + vb->seqlen;
  57157. 80318da: 8ba3 ldrh r3, [r4, #28]
  57158. 80318dc: 7e22 ldrb r2, [r4, #24]
  57159. vb = vb->prev;
  57160. 80318de: 6864 ldr r4, [r4, #4]
  57161. vb->seqlen = 1 + vb->vlenlen + vb->vlen;
  57162. vb->seqlen += 1 + vb->olenlen + vb->olen;
  57163. snmp_asn1_enc_length_cnt(vb->seqlen, &vb->seqlenlen);
  57164. /* varbind seq */
  57165. tot_len += 1 + vb->seqlenlen + vb->seqlen;
  57166. 80318e0: 3301 adds r3, #1
  57167. 80318e2: 189b adds r3, r3, r2
  57168. 80318e4: 18ed adds r5, r5, r3
  57169. 80318e6: b2ad uxth r5, r5
  57170. s32_t *sint_ptr;
  57171. u16_t tot_len;
  57172. tot_len = 0;
  57173. vb = root->tail;
  57174. while ( vb != NULL )
  57175. 80318e8: 2c00 cmp r4, #0
  57176. 80318ea: d1ab bne.n 8031844 <snmp_varbind_list_sum+0xc>
  57177. vb = vb->prev;
  57178. }
  57179. /* varbind-list seq */
  57180. root->seqlen = tot_len;
  57181. snmp_asn1_enc_length_cnt(root->seqlen, &root->seqlenlen);
  57182. 80318ec: 4628 mov r0, r5
  57183. vb = vb->prev;
  57184. }
  57185. /* varbind-list seq */
  57186. root->seqlen = tot_len;
  57187. 80318ee: 8175 strh r5, [r6, #10]
  57188. snmp_asn1_enc_length_cnt(root->seqlen, &root->seqlenlen);
  57189. 80318f0: f106 0109 add.w r1, r6, #9
  57190. 80318f4: f7fc ffbd bl 802e872 <snmp_asn1_enc_length_cnt>
  57191. tot_len += 1 + root->seqlenlen;
  57192. 80318f8: 7a73 ldrb r3, [r6, #9]
  57193. 80318fa: 3301 adds r3, #1
  57194. 80318fc: 18e8 adds r0, r5, r3
  57195. return tot_len;
  57196. }
  57197. 80318fe: b280 uxth r0, r0
  57198. 8031900: bdf8 pop {r3, r4, r5, r6, r7, pc}
  57199. 8031902: 0000 movs r0, r0
  57200. 08031904 <snmp_resp_header_sum>:
  57201. * @param rhl points to returned header lengths
  57202. * @return the required lenght for encoding the response header
  57203. */
  57204. static u16_t
  57205. snmp_resp_header_sum(struct snmp_msg_pstat *m_stat, u16_t vb_len)
  57206. {
  57207. 8031904: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
  57208. 8031908: 4604 mov r4, r0
  57209. u16_t tot_len;
  57210. struct snmp_resp_header_lengths *rhl;
  57211. rhl = &m_stat->rhl;
  57212. tot_len = vb_len;
  57213. snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
  57214. 803190a: f500 758c add.w r5, r0, #280 ; 0x118
  57215. * @param rhl points to returned header lengths
  57216. * @return the required lenght for encoding the response header
  57217. */
  57218. static u16_t
  57219. snmp_resp_header_sum(struct snmp_msg_pstat *m_stat, u16_t vb_len)
  57220. {
  57221. 803190e: 460f mov r7, r1
  57222. u16_t tot_len;
  57223. struct snmp_resp_header_lengths *rhl;
  57224. rhl = &m_stat->rhl;
  57225. tot_len = vb_len;
  57226. snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
  57227. 8031910: 6940 ldr r0, [r0, #20]
  57228. 8031912: f504 7190 add.w r1, r4, #288 ; 0x120
  57229. 8031916: f7fc ffcc bl 802e8b2 <snmp_asn1_enc_s32t_cnt>
  57230. snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
  57231. 803191a: f8b4 0120 ldrh.w r0, [r4, #288] ; 0x120
  57232. 803191e: 4629 mov r1, r5
  57233. 8031920: f7fc ffa7 bl 802e872 <snmp_asn1_enc_length_cnt>
  57234. tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
  57235. snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
  57236. 8031924: 6920 ldr r0, [r4, #16]
  57237. rhl = &m_stat->rhl;
  57238. tot_len = vb_len;
  57239. snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
  57240. snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
  57241. tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
  57242. 8031926: f894 8118 ldrb.w r8, [r4, #280] ; 0x118
  57243. 803192a: f8b4 a120 ldrh.w sl, [r4, #288] ; 0x120
  57244. snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
  57245. 803192e: f504 7191 add.w r1, r4, #290 ; 0x122
  57246. 8031932: f7fc ffbe bl 802e8b2 <snmp_asn1_enc_s32t_cnt>
  57247. snmp_asn1_enc_length_cnt(rhl->errstatlen, &rhl->errstatlenlen);
  57248. 8031936: 1c69 adds r1, r5, #1
  57249. 8031938: f8b4 0122 ldrh.w r0, [r4, #290] ; 0x122
  57250. 803193c: f7fc ff99 bl 802e872 <snmp_asn1_enc_length_cnt>
  57251. tot_len += 1 + rhl->errstatlenlen + rhl->errstatlen;
  57252. 8031940: f8b4 9122 ldrh.w r9, [r4, #290] ; 0x122
  57253. snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
  57254. 8031944: 68e0 ldr r0, [r4, #12]
  57255. snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
  57256. tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
  57257. snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
  57258. snmp_asn1_enc_length_cnt(rhl->errstatlen, &rhl->errstatlenlen);
  57259. tot_len += 1 + rhl->errstatlenlen + rhl->errstatlen;
  57260. 8031946: f894 6119 ldrb.w r6, [r4, #281] ; 0x119
  57261. snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
  57262. 803194a: f504 7192 add.w r1, r4, #292 ; 0x124
  57263. 803194e: f7fc ffb0 bl 802e8b2 <snmp_asn1_enc_s32t_cnt>
  57264. snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
  57265. 8031952: f8b4 0124 ldrh.w r0, [r4, #292] ; 0x124
  57266. 8031956: f504 718d add.w r1, r4, #282 ; 0x11a
  57267. 803195a: f7fc ff8a bl 802e872 <snmp_asn1_enc_length_cnt>
  57268. rhl = &m_stat->rhl;
  57269. tot_len = vb_len;
  57270. snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
  57271. snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
  57272. tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
  57273. 803195e: 44d1 add r9, sl
  57274. snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
  57275. snmp_asn1_enc_length_cnt(rhl->errstatlen, &rhl->errstatlenlen);
  57276. tot_len += 1 + rhl->errstatlenlen + rhl->errstatlen;
  57277. 8031960: f8b4 3124 ldrh.w r3, [r4, #292] ; 0x124
  57278. 8031964: f109 0903 add.w r9, r9, #3
  57279. 8031968: 4499 add r9, r3
  57280. 803196a: fa18 f889 uxtah r8, r8, r9
  57281. snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
  57282. snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
  57283. tot_len += 1 + rhl->ridlenlen + rhl->ridlen;
  57284. 803196e: f894 311a ldrb.w r3, [r4, #282] ; 0x11a
  57285. 8031972: 4446 add r6, r8
  57286. 8031974: 18f6 adds r6, r6, r3
  57287. 8031976: fa17 f686 uxtah r6, r7, r6
  57288. 803197a: b2b6 uxth r6, r6
  57289. rhl->pdulen = tot_len;
  57290. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  57291. 803197c: 1ce9 adds r1, r5, #3
  57292. 803197e: 4630 mov r0, r6
  57293. snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
  57294. snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
  57295. tot_len += 1 + rhl->ridlenlen + rhl->ridlen;
  57296. rhl->pdulen = tot_len;
  57297. 8031980: f8a4 6126 strh.w r6, [r4, #294] ; 0x126
  57298. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  57299. 8031984: f7fc ff75 bl 802e872 <snmp_asn1_enc_length_cnt>
  57300. tot_len += 1 + rhl->pdulenlen;
  57301. rhl->comlen = m_stat->com_strlen;
  57302. 8031988: f894 0059 ldrb.w r0, [r4, #89] ; 0x59
  57303. snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
  57304. tot_len += 1 + rhl->ridlenlen + rhl->ridlen;
  57305. rhl->pdulen = tot_len;
  57306. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  57307. tot_len += 1 + rhl->pdulenlen;
  57308. 803198c: f894 811b ldrb.w r8, [r4, #283] ; 0x11b
  57309. rhl->comlen = m_stat->com_strlen;
  57310. 8031990: f8a4 0128 strh.w r0, [r4, #296] ; 0x128
  57311. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  57312. 8031994: f504 718e add.w r1, r4, #284 ; 0x11c
  57313. 8031998: f7fc ff6b bl 802e872 <snmp_asn1_enc_length_cnt>
  57314. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  57315. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  57316. 803199c: 4b14 ldr r3, [pc, #80] ; (80319f0 <snmp_resp_header_sum+0xec>)
  57317. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  57318. tot_len += 1 + rhl->pdulenlen;
  57319. rhl->comlen = m_stat->com_strlen;
  57320. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  57321. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  57322. 803199e: f894 711c ldrb.w r7, [r4, #284] ; 0x11c
  57323. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  57324. 80319a2: 6818 ldr r0, [r3, #0]
  57325. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  57326. tot_len += 1 + rhl->pdulenlen;
  57327. rhl->comlen = m_stat->com_strlen;
  57328. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  57329. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  57330. 80319a4: f8b4 9128 ldrh.w r9, [r4, #296] ; 0x128
  57331. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  57332. 80319a8: f504 7195 add.w r1, r4, #298 ; 0x12a
  57333. 80319ac: f7fc ff81 bl 802e8b2 <snmp_asn1_enc_s32t_cnt>
  57334. snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
  57335. 80319b0: 1d69 adds r1, r5, #5
  57336. 80319b2: f8b4 012a ldrh.w r0, [r4, #298] ; 0x12a
  57337. 80319b6: f7fc ff5c bl 802e872 <snmp_asn1_enc_length_cnt>
  57338. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  57339. tot_len += 1 + rhl->pdulenlen;
  57340. rhl->comlen = m_stat->com_strlen;
  57341. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  57342. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  57343. 80319ba: f8b4 512a ldrh.w r5, [r4, #298] ; 0x12a
  57344. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  57345. snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
  57346. tot_len += 1 + rhl->verlen + rhl->verlenlen;
  57347. 80319be: f894 311d ldrb.w r3, [r4, #285] ; 0x11d
  57348. snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
  57349. tot_len += 1 + rhl->pdulenlen;
  57350. rhl->comlen = m_stat->com_strlen;
  57351. snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
  57352. tot_len += 1 + rhl->comlenlen + rhl->comlen;
  57353. 80319c2: 444d add r5, r9
  57354. 80319c4: 3503 adds r5, #3
  57355. 80319c6: 4445 add r5, r8
  57356. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  57357. snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
  57358. tot_len += 1 + rhl->verlen + rhl->verlenlen;
  57359. 80319c8: 197d adds r5, r7, r5
  57360. 80319ca: 18ed adds r5, r5, r3
  57361. 80319cc: fa16 f585 uxtah r5, r6, r5
  57362. 80319d0: b2ad uxth r5, r5
  57363. rhl->seqlen = tot_len;
  57364. snmp_asn1_enc_length_cnt(rhl->seqlen, &rhl->seqlenlen);
  57365. 80319d2: 4628 mov r0, r5
  57366. snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
  57367. snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
  57368. tot_len += 1 + rhl->verlen + rhl->verlenlen;
  57369. rhl->seqlen = tot_len;
  57370. 80319d4: f8a4 512c strh.w r5, [r4, #300] ; 0x12c
  57371. snmp_asn1_enc_length_cnt(rhl->seqlen, &rhl->seqlenlen);
  57372. 80319d8: f504 718f add.w r1, r4, #286 ; 0x11e
  57373. 80319dc: f7fc ff49 bl 802e872 <snmp_asn1_enc_length_cnt>
  57374. tot_len += 1 + rhl->seqlenlen;
  57375. 80319e0: f894 311e ldrb.w r3, [r4, #286] ; 0x11e
  57376. 80319e4: 3301 adds r3, #1
  57377. 80319e6: 18e8 adds r0, r5, r3
  57378. return tot_len;
  57379. }
  57380. 80319e8: b280 uxth r0, r0
  57381. 80319ea: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
  57382. 80319ee: bf00 nop
  57383. 80319f0: 0803b520 .word 0x0803b520
  57384. 080319f4 <snmp_varbind_list_enc>:
  57385. /**
  57386. * Encodes varbind list from head to tail.
  57387. */
  57388. static u16_t
  57389. snmp_varbind_list_enc(struct snmp_varbind_root *root, struct pbuf *p, u16_t ofs)
  57390. {
  57391. 80319f4: b570 push {r4, r5, r6, lr}
  57392. 80319f6: 4616 mov r6, r2
  57393. 80319f8: 4604 mov r4, r0
  57394. s32_t *sint_ptr;
  57395. u32_t *uint_ptr;
  57396. u8_t *raw_ptr;
  57397. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  57398. ofs += 1;
  57399. 80319fa: 3601 adds r6, #1
  57400. /**
  57401. * Encodes varbind list from head to tail.
  57402. */
  57403. static u16_t
  57404. snmp_varbind_list_enc(struct snmp_varbind_root *root, struct pbuf *p, u16_t ofs)
  57405. {
  57406. 80319fc: 460d mov r5, r1
  57407. struct snmp_varbind *vb;
  57408. s32_t *sint_ptr;
  57409. u32_t *uint_ptr;
  57410. u8_t *raw_ptr;
  57411. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  57412. 80319fe: 4608 mov r0, r1
  57413. ofs += 1;
  57414. 8031a00: b2b6 uxth r6, r6
  57415. struct snmp_varbind *vb;
  57416. s32_t *sint_ptr;
  57417. u32_t *uint_ptr;
  57418. u8_t *raw_ptr;
  57419. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  57420. 8031a02: 4611 mov r1, r2
  57421. 8031a04: 2230 movs r2, #48 ; 0x30
  57422. 8031a06: f7fc ff81 bl 802e90c <snmp_asn1_enc_type>
  57423. ofs += 1;
  57424. snmp_asn1_enc_length(p, ofs, root->seqlen);
  57425. 8031a0a: 4628 mov r0, r5
  57426. 8031a0c: 4631 mov r1, r6
  57427. 8031a0e: 8962 ldrh r2, [r4, #10]
  57428. 8031a10: f7fc ff90 bl 802e934 <snmp_asn1_enc_length>
  57429. ofs += root->seqlenlen;
  57430. 8031a14: 7a63 ldrb r3, [r4, #9]
  57431. 8031a16: e064 b.n 8031ae2 <snmp_varbind_list_enc+0xee>
  57432. vb = root->head;
  57433. while ( vb != NULL )
  57434. {
  57435. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  57436. 8031a18: 4631 mov r1, r6
  57437. ofs += 1;
  57438. 8031a1a: 3601 adds r6, #1
  57439. ofs += root->seqlenlen;
  57440. vb = root->head;
  57441. while ( vb != NULL )
  57442. {
  57443. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  57444. 8031a1c: 2230 movs r2, #48 ; 0x30
  57445. ofs += 1;
  57446. 8031a1e: b2b6 uxth r6, r6
  57447. ofs += root->seqlenlen;
  57448. vb = root->head;
  57449. while ( vb != NULL )
  57450. {
  57451. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  57452. 8031a20: 4628 mov r0, r5
  57453. 8031a22: f7fc ff73 bl 802e90c <snmp_asn1_enc_type>
  57454. ofs += 1;
  57455. snmp_asn1_enc_length(p, ofs, vb->seqlen);
  57456. 8031a26: 4631 mov r1, r6
  57457. 8031a28: 8ba2 ldrh r2, [r4, #28]
  57458. 8031a2a: 4628 mov r0, r5
  57459. 8031a2c: f7fc ff82 bl 802e934 <snmp_asn1_enc_length>
  57460. ofs += vb->seqlenlen;
  57461. 8031a30: 7e23 ldrb r3, [r4, #24]
  57462. 8031a32: 18f6 adds r6, r6, r3
  57463. 8031a34: b2b6 uxth r6, r6
  57464. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  57465. 8031a36: 4631 mov r1, r6
  57466. ofs += 1;
  57467. 8031a38: 3601 adds r6, #1
  57468. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  57469. ofs += 1;
  57470. snmp_asn1_enc_length(p, ofs, vb->seqlen);
  57471. ofs += vb->seqlenlen;
  57472. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  57473. 8031a3a: 2206 movs r2, #6
  57474. ofs += 1;
  57475. 8031a3c: b2b6 uxth r6, r6
  57476. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  57477. ofs += 1;
  57478. snmp_asn1_enc_length(p, ofs, vb->seqlen);
  57479. ofs += vb->seqlenlen;
  57480. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  57481. 8031a3e: 4628 mov r0, r5
  57482. 8031a40: f7fc ff64 bl 802e90c <snmp_asn1_enc_type>
  57483. ofs += 1;
  57484. snmp_asn1_enc_length(p, ofs, vb->olen);
  57485. 8031a44: 4631 mov r1, r6
  57486. 8031a46: 8be2 ldrh r2, [r4, #30]
  57487. 8031a48: 4628 mov r0, r5
  57488. 8031a4a: f7fc ff73 bl 802e934 <snmp_asn1_enc_length>
  57489. ofs += vb->olenlen;
  57490. 8031a4e: 7e63 ldrb r3, [r4, #25]
  57491. snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);
  57492. 8031a50: 7a22 ldrb r2, [r4, #8]
  57493. ofs += vb->seqlenlen;
  57494. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  57495. ofs += 1;
  57496. snmp_asn1_enc_length(p, ofs, vb->olen);
  57497. ofs += vb->olenlen;
  57498. 8031a52: 18f6 adds r6, r6, r3
  57499. 8031a54: b2b6 uxth r6, r6
  57500. snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);
  57501. 8031a56: 4631 mov r1, r6
  57502. 8031a58: 68e3 ldr r3, [r4, #12]
  57503. 8031a5a: 4628 mov r0, r5
  57504. 8031a5c: f7fd f81f bl 802ea9e <snmp_asn1_enc_oid>
  57505. ofs += vb->olen;
  57506. 8031a60: 8be3 ldrh r3, [r4, #30]
  57507. snmp_asn1_enc_type(p, ofs, vb->value_type);
  57508. 8031a62: 7c22 ldrb r2, [r4, #16]
  57509. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  57510. ofs += 1;
  57511. snmp_asn1_enc_length(p, ofs, vb->olen);
  57512. ofs += vb->olenlen;
  57513. snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);
  57514. ofs += vb->olen;
  57515. 8031a64: 18f6 adds r6, r6, r3
  57516. 8031a66: b2b6 uxth r6, r6
  57517. snmp_asn1_enc_type(p, ofs, vb->value_type);
  57518. 8031a68: 4631 mov r1, r6
  57519. ofs += 1;
  57520. 8031a6a: 3601 adds r6, #1
  57521. 8031a6c: b2b6 uxth r6, r6
  57522. snmp_asn1_enc_length(p, ofs, vb->olen);
  57523. ofs += vb->olenlen;
  57524. snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);
  57525. ofs += vb->olen;
  57526. snmp_asn1_enc_type(p, ofs, vb->value_type);
  57527. 8031a6e: 4628 mov r0, r5
  57528. 8031a70: f7fc ff4c bl 802e90c <snmp_asn1_enc_type>
  57529. ofs += 1;
  57530. snmp_asn1_enc_length(p, ofs, vb->vlen);
  57531. 8031a74: 4631 mov r1, r6
  57532. 8031a76: 4628 mov r0, r5
  57533. 8031a78: 8c22 ldrh r2, [r4, #32]
  57534. 8031a7a: f7fc ff5b bl 802e934 <snmp_asn1_enc_length>
  57535. ofs += vb->vlenlen;
  57536. 8031a7e: 7ea3 ldrb r3, [r4, #26]
  57537. 8031a80: 18f6 adds r6, r6, r3
  57538. switch (vb->value_type)
  57539. 8031a82: 7c23 ldrb r3, [r4, #16]
  57540. 8031a84: 2b40 cmp r3, #64 ; 0x40
  57541. ofs += vb->olen;
  57542. snmp_asn1_enc_type(p, ofs, vb->value_type);
  57543. ofs += 1;
  57544. snmp_asn1_enc_length(p, ofs, vb->vlen);
  57545. ofs += vb->vlenlen;
  57546. 8031a86: b2b6 uxth r6, r6
  57547. switch (vb->value_type)
  57548. 8031a88: d01c beq.n 8031ac4 <snmp_varbind_list_enc+0xd0>
  57549. 8031a8a: d806 bhi.n 8031a9a <snmp_varbind_list_enc+0xa6>
  57550. 8031a8c: 2b04 cmp r3, #4
  57551. 8031a8e: d019 beq.n 8031ac4 <snmp_varbind_list_enc+0xd0>
  57552. 8031a90: 2b06 cmp r3, #6
  57553. 8031a92: d01e beq.n 8031ad2 <snmp_varbind_list_enc+0xde>
  57554. 8031a94: 2b02 cmp r3, #2
  57555. 8031a96: d123 bne.n 8031ae0 <snmp_varbind_list_enc+0xec>
  57556. 8031a98: e004 b.n 8031aa4 <snmp_varbind_list_enc+0xb0>
  57557. 8031a9a: 2b43 cmp r3, #67 ; 0x43
  57558. 8031a9c: d90a bls.n 8031ab4 <snmp_varbind_list_enc+0xc0>
  57559. 8031a9e: 2b44 cmp r3, #68 ; 0x44
  57560. 8031aa0: d11e bne.n 8031ae0 <snmp_varbind_list_enc+0xec>
  57561. 8031aa2: e00f b.n 8031ac4 <snmp_varbind_list_enc+0xd0>
  57562. {
  57563. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
  57564. sint_ptr = (s32_t*)vb->value;
  57565. snmp_asn1_enc_s32t(p, ofs, vb->vlen, *sint_ptr);
  57566. 8031aa4: 6963 ldr r3, [r4, #20]
  57567. 8031aa6: 8c22 ldrh r2, [r4, #32]
  57568. 8031aa8: 681b ldr r3, [r3, #0]
  57569. 8031aaa: 4628 mov r0, r5
  57570. 8031aac: 4631 mov r1, r6
  57571. 8031aae: f7fc ffc9 bl 802ea44 <snmp_asn1_enc_s32t>
  57572. break;
  57573. 8031ab2: e015 b.n 8031ae0 <snmp_varbind_list_enc+0xec>
  57574. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
  57575. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
  57576. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
  57577. uint_ptr = (u32_t*)vb->value;
  57578. snmp_asn1_enc_u32t(p, ofs, vb->vlen, *uint_ptr);
  57579. 8031ab4: 6963 ldr r3, [r4, #20]
  57580. 8031ab6: 8c22 ldrh r2, [r4, #32]
  57581. 8031ab8: 681b ldr r3, [r3, #0]
  57582. 8031aba: 4628 mov r0, r5
  57583. 8031abc: 4631 mov r1, r6
  57584. 8031abe: f7fc ff81 bl 802e9c4 <snmp_asn1_enc_u32t>
  57585. break;
  57586. 8031ac2: e00d b.n 8031ae0 <snmp_varbind_list_enc+0xec>
  57587. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
  57588. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
  57589. case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
  57590. raw_ptr = (u8_t*)vb->value;
  57591. snmp_asn1_enc_raw(p, ofs, vb->vlen, raw_ptr);
  57592. 8031ac4: 4628 mov r0, r5
  57593. 8031ac6: 4631 mov r1, r6
  57594. 8031ac8: 8c22 ldrh r2, [r4, #32]
  57595. 8031aca: 6963 ldr r3, [r4, #20]
  57596. 8031acc: f7fd f85a bl 802eb84 <snmp_asn1_enc_raw>
  57597. break;
  57598. 8031ad0: e006 b.n 8031ae0 <snmp_varbind_list_enc+0xec>
  57599. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
  57600. break;
  57601. case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
  57602. sint_ptr = (s32_t*)vb->value;
  57603. snmp_asn1_enc_oid(p, ofs, vb->value_len / sizeof(s32_t), sint_ptr);
  57604. 8031ad2: 7c62 ldrb r2, [r4, #17]
  57605. 8031ad4: 6963 ldr r3, [r4, #20]
  57606. 8031ad6: 4628 mov r0, r5
  57607. 8031ad8: 4631 mov r1, r6
  57608. 8031ada: 0892 lsrs r2, r2, #2
  57609. 8031adc: f7fc ffdf bl 802ea9e <snmp_asn1_enc_oid>
  57610. break;
  57611. default:
  57612. /* unsupported type */
  57613. break;
  57614. };
  57615. ofs += vb->vlen;
  57616. 8031ae0: 8c23 ldrh r3, [r4, #32]
  57617. vb = vb->next;
  57618. 8031ae2: 6824 ldr r4, [r4, #0]
  57619. break;
  57620. default:
  57621. /* unsupported type */
  57622. break;
  57623. };
  57624. ofs += vb->vlen;
  57625. 8031ae4: 18f6 adds r6, r6, r3
  57626. 8031ae6: b2b6 uxth r6, r6
  57627. ofs += 1;
  57628. snmp_asn1_enc_length(p, ofs, root->seqlen);
  57629. ofs += root->seqlenlen;
  57630. vb = root->head;
  57631. while ( vb != NULL )
  57632. 8031ae8: 2c00 cmp r4, #0
  57633. 8031aea: d195 bne.n 8031a18 <snmp_varbind_list_enc+0x24>
  57634. };
  57635. ofs += vb->vlen;
  57636. vb = vb->next;
  57637. }
  57638. return ofs;
  57639. }
  57640. 8031aec: 4630 mov r0, r6
  57641. 8031aee: bd70 pop {r4, r5, r6, pc}
  57642. 08031af0 <snmp_trap_dst_ip_set>:
  57643. * @param dst IPv4 address in host order.
  57644. */
  57645. void
  57646. snmp_trap_dst_ip_set(u8_t dst_idx, ip_addr_t *dst)
  57647. {
  57648. if (dst_idx < SNMP_TRAP_DESTINATIONS)
  57649. 8031af0: b918 cbnz r0, 8031afa <snmp_trap_dst_ip_set+0xa>
  57650. {
  57651. ip_addr_set(&trap_dst[dst_idx].dip, dst);
  57652. 8031af2: b101 cbz r1, 8031af6 <snmp_trap_dst_ip_set+0x6>
  57653. 8031af4: 6809 ldr r1, [r1, #0]
  57654. 8031af6: 4b01 ldr r3, [pc, #4] ; (8031afc <snmp_trap_dst_ip_set+0xc>)
  57655. 8031af8: 6019 str r1, [r3, #0]
  57656. 8031afa: 4770 bx lr
  57657. 8031afc: 20010edc .word 0x20010edc
  57658. 08031b00 <snmp_send_response>:
  57659. * @note the caller is responsible for filling in outvb in the m_stat
  57660. * and provide error-status and index (except for tooBig errors) ...
  57661. */
  57662. err_t
  57663. snmp_send_response(struct snmp_msg_pstat *m_stat)
  57664. {
  57665. 8031b00: b5f0 push {r4, r5, r6, r7, lr}
  57666. 8031b02: 4604 mov r4, r0
  57667. 8031b04: b085 sub sp, #20
  57668. struct snmp_varbind_root emptyvb = {NULL, NULL, 0, 0, 0};
  57669. 8031b06: 220c movs r2, #12
  57670. 8031b08: 2100 movs r1, #0
  57671. 8031b0a: a801 add r0, sp, #4
  57672. struct pbuf *p;
  57673. u16_t tot_len;
  57674. err_t err;
  57675. /* pass 0, calculate length fields */
  57676. tot_len = snmp_varbind_list_sum(&m_stat->outvb);
  57677. 8031b0c: f504 7686 add.w r6, r4, #268 ; 0x10c
  57678. * and provide error-status and index (except for tooBig errors) ...
  57679. */
  57680. err_t
  57681. snmp_send_response(struct snmp_msg_pstat *m_stat)
  57682. {
  57683. struct snmp_varbind_root emptyvb = {NULL, NULL, 0, 0, 0};
  57684. 8031b10: f7ef fe52 bl 80217b8 <memset>
  57685. struct pbuf *p;
  57686. u16_t tot_len;
  57687. err_t err;
  57688. /* pass 0, calculate length fields */
  57689. tot_len = snmp_varbind_list_sum(&m_stat->outvb);
  57690. 8031b14: 4630 mov r0, r6
  57691. 8031b16: f7ff fe8f bl 8031838 <snmp_varbind_list_sum>
  57692. 8031b1a: 4601 mov r1, r0
  57693. tot_len = snmp_resp_header_sum(m_stat, tot_len);
  57694. 8031b1c: 4620 mov r0, r4
  57695. 8031b1e: f7ff fef1 bl 8031904 <snmp_resp_header_sum>
  57696. /* try allocating pbuf(s) for complete response */
  57697. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  57698. 8031b22: 2203 movs r2, #3
  57699. u16_t tot_len;
  57700. err_t err;
  57701. /* pass 0, calculate length fields */
  57702. tot_len = snmp_varbind_list_sum(&m_stat->outvb);
  57703. tot_len = snmp_resp_header_sum(m_stat, tot_len);
  57704. 8031b24: 4601 mov r1, r0
  57705. /* try allocating pbuf(s) for complete response */
  57706. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  57707. 8031b26: 2000 movs r0, #0
  57708. 8031b28: f7f9 fbdf bl 802b2ea <pbuf_alloc>
  57709. if (p == NULL)
  57710. 8031b2c: 4605 mov r5, r0
  57711. 8031b2e: b990 cbnz r0, 8031b56 <snmp_send_response+0x56>
  57712. {
  57713. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_snd_response() tooBig\n"));
  57714. /* can't construct reply, return error-status tooBig */
  57715. m_stat->error_status = SNMP_ES_TOOBIG;
  57716. 8031b30: 2301 movs r3, #1
  57717. 8031b32: 6123 str r3, [r4, #16]
  57718. m_stat->error_index = 0;
  57719. 8031b34: 6160 str r0, [r4, #20]
  57720. /* pass 0, recalculate lengths, for empty varbind-list */
  57721. tot_len = snmp_varbind_list_sum(&emptyvb);
  57722. 8031b36: a801 add r0, sp, #4
  57723. 8031b38: f7ff fe7e bl 8031838 <snmp_varbind_list_sum>
  57724. 8031b3c: 4601 mov r1, r0
  57725. tot_len = snmp_resp_header_sum(m_stat, tot_len);
  57726. 8031b3e: 4620 mov r0, r4
  57727. 8031b40: f7ff fee0 bl 8031904 <snmp_resp_header_sum>
  57728. /* retry allocation once for header and empty varbind-list */
  57729. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  57730. 8031b44: 2203 movs r2, #3
  57731. /* can't construct reply, return error-status tooBig */
  57732. m_stat->error_status = SNMP_ES_TOOBIG;
  57733. m_stat->error_index = 0;
  57734. /* pass 0, recalculate lengths, for empty varbind-list */
  57735. tot_len = snmp_varbind_list_sum(&emptyvb);
  57736. tot_len = snmp_resp_header_sum(m_stat, tot_len);
  57737. 8031b46: 4601 mov r1, r0
  57738. /* retry allocation once for header and empty varbind-list */
  57739. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  57740. 8031b48: 4628 mov r0, r5
  57741. 8031b4a: f7f9 fbce bl 802b2ea <pbuf_alloc>
  57742. }
  57743. if (p != NULL)
  57744. 8031b4e: 4605 mov r5, r0
  57745. 8031b50: 2800 cmp r0, #0
  57746. 8031b52: f000 80dc beq.w 8031d0e <snmp_send_response+0x20e>
  57747. snmp_resp_header_enc(struct snmp_msg_pstat *m_stat, struct pbuf *p)
  57748. {
  57749. u16_t ofs;
  57750. ofs = 0;
  57751. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  57752. 8031b56: 2100 movs r1, #0
  57753. 8031b58: 2230 movs r2, #48 ; 0x30
  57754. 8031b5a: 4628 mov r0, r5
  57755. 8031b5c: f7fc fed6 bl 802e90c <snmp_asn1_enc_type>
  57756. ofs += 1;
  57757. snmp_asn1_enc_length(p, ofs, m_stat->rhl.seqlen);
  57758. 8031b60: 2101 movs r1, #1
  57759. 8031b62: f8b4 212c ldrh.w r2, [r4, #300] ; 0x12c
  57760. 8031b66: 4628 mov r0, r5
  57761. 8031b68: f7fc fee4 bl 802e934 <snmp_asn1_enc_length>
  57762. ofs += m_stat->rhl.seqlenlen;
  57763. 8031b6c: f894 711e ldrb.w r7, [r4, #286] ; 0x11e
  57764. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57765. 8031b70: 2202 movs r2, #2
  57766. 8031b72: 1c79 adds r1, r7, #1
  57767. 8031b74: 4628 mov r0, r5
  57768. ofs += 1;
  57769. 8031b76: 3702 adds r7, #2
  57770. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  57771. ofs += 1;
  57772. snmp_asn1_enc_length(p, ofs, m_stat->rhl.seqlen);
  57773. ofs += m_stat->rhl.seqlenlen;
  57774. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57775. 8031b78: f7fc fec8 bl 802e90c <snmp_asn1_enc_type>
  57776. ofs += 1;
  57777. snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);
  57778. 8031b7c: 4639 mov r1, r7
  57779. 8031b7e: f8b4 212a ldrh.w r2, [r4, #298] ; 0x12a
  57780. 8031b82: 4628 mov r0, r5
  57781. 8031b84: f7fc fed6 bl 802e934 <snmp_asn1_enc_length>
  57782. ofs += m_stat->rhl.verlenlen;
  57783. 8031b88: f894 311d ldrb.w r3, [r4, #285] ; 0x11d
  57784. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);
  57785. 8031b8c: f8b4 212a ldrh.w r2, [r4, #298] ; 0x12a
  57786. ofs += m_stat->rhl.seqlenlen;
  57787. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57788. ofs += 1;
  57789. snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);
  57790. ofs += m_stat->rhl.verlenlen;
  57791. 8031b90: 18ff adds r7, r7, r3
  57792. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);
  57793. 8031b92: 4b61 ldr r3, [pc, #388] ; (8031d18 <snmp_send_response+0x218>)
  57794. 8031b94: 4639 mov r1, r7
  57795. 8031b96: 681b ldr r3, [r3, #0]
  57796. 8031b98: 4628 mov r0, r5
  57797. 8031b9a: f7fc ff53 bl 802ea44 <snmp_asn1_enc_s32t>
  57798. ofs += m_stat->rhl.verlen;
  57799. 8031b9e: f8b4 312a ldrh.w r3, [r4, #298] ; 0x12a
  57800. 8031ba2: 18ff adds r7, r7, r3
  57801. 8031ba4: b2bf uxth r7, r7
  57802. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  57803. 8031ba6: 4639 mov r1, r7
  57804. ofs += 1;
  57805. 8031ba8: 3701 adds r7, #1
  57806. snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);
  57807. ofs += m_stat->rhl.verlenlen;
  57808. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);
  57809. ofs += m_stat->rhl.verlen;
  57810. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  57811. 8031baa: 2204 movs r2, #4
  57812. ofs += 1;
  57813. 8031bac: b2bf uxth r7, r7
  57814. snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);
  57815. ofs += m_stat->rhl.verlenlen;
  57816. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);
  57817. ofs += m_stat->rhl.verlen;
  57818. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  57819. 8031bae: 4628 mov r0, r5
  57820. 8031bb0: f7fc feac bl 802e90c <snmp_asn1_enc_type>
  57821. ofs += 1;
  57822. snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);
  57823. 8031bb4: 4639 mov r1, r7
  57824. 8031bb6: f8b4 2128 ldrh.w r2, [r4, #296] ; 0x128
  57825. 8031bba: 4628 mov r0, r5
  57826. 8031bbc: f7fc feba bl 802e934 <snmp_asn1_enc_length>
  57827. ofs += m_stat->rhl.comlenlen;
  57828. 8031bc0: f894 311c ldrb.w r3, [r4, #284] ; 0x11c
  57829. snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);
  57830. 8031bc4: f8b4 2128 ldrh.w r2, [r4, #296] ; 0x128
  57831. ofs += m_stat->rhl.verlen;
  57832. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  57833. ofs += 1;
  57834. snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);
  57835. ofs += m_stat->rhl.comlenlen;
  57836. 8031bc8: 18ff adds r7, r7, r3
  57837. 8031bca: b2bf uxth r7, r7
  57838. snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);
  57839. 8031bcc: 4639 mov r1, r7
  57840. 8031bce: f104 0318 add.w r3, r4, #24
  57841. 8031bd2: 4628 mov r0, r5
  57842. 8031bd4: f7fc ffd6 bl 802eb84 <snmp_asn1_enc_raw>
  57843. ofs += m_stat->rhl.comlen;
  57844. 8031bd8: f8b4 3128 ldrh.w r3, [r4, #296] ; 0x128
  57845. 8031bdc: 18ff adds r7, r7, r3
  57846. 8031bde: b2bf uxth r7, r7
  57847. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  57848. 8031be0: 4639 mov r1, r7
  57849. ofs += 1;
  57850. 8031be2: 3701 adds r7, #1
  57851. snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);
  57852. ofs += m_stat->rhl.comlenlen;
  57853. snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);
  57854. ofs += m_stat->rhl.comlen;
  57855. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  57856. 8031be4: 22a2 movs r2, #162 ; 0xa2
  57857. ofs += 1;
  57858. 8031be6: b2bf uxth r7, r7
  57859. snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);
  57860. ofs += m_stat->rhl.comlenlen;
  57861. snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);
  57862. ofs += m_stat->rhl.comlen;
  57863. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  57864. 8031be8: 4628 mov r0, r5
  57865. 8031bea: f7fc fe8f bl 802e90c <snmp_asn1_enc_type>
  57866. ofs += 1;
  57867. snmp_asn1_enc_length(p, ofs, m_stat->rhl.pdulen);
  57868. 8031bee: 4639 mov r1, r7
  57869. 8031bf0: f8b4 2126 ldrh.w r2, [r4, #294] ; 0x126
  57870. 8031bf4: 4628 mov r0, r5
  57871. 8031bf6: f7fc fe9d bl 802e934 <snmp_asn1_enc_length>
  57872. ofs += m_stat->rhl.pdulenlen;
  57873. 8031bfa: f894 311b ldrb.w r3, [r4, #283] ; 0x11b
  57874. 8031bfe: 18ff adds r7, r7, r3
  57875. 8031c00: b2bf uxth r7, r7
  57876. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57877. 8031c02: 4639 mov r1, r7
  57878. ofs += 1;
  57879. 8031c04: 3701 adds r7, #1
  57880. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  57881. ofs += 1;
  57882. snmp_asn1_enc_length(p, ofs, m_stat->rhl.pdulen);
  57883. ofs += m_stat->rhl.pdulenlen;
  57884. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57885. 8031c06: 2202 movs r2, #2
  57886. ofs += 1;
  57887. 8031c08: b2bf uxth r7, r7
  57888. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
  57889. ofs += 1;
  57890. snmp_asn1_enc_length(p, ofs, m_stat->rhl.pdulen);
  57891. ofs += m_stat->rhl.pdulenlen;
  57892. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57893. 8031c0a: 4628 mov r0, r5
  57894. 8031c0c: f7fc fe7e bl 802e90c <snmp_asn1_enc_type>
  57895. ofs += 1;
  57896. snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);
  57897. 8031c10: 4639 mov r1, r7
  57898. 8031c12: f8b4 2124 ldrh.w r2, [r4, #292] ; 0x124
  57899. 8031c16: 4628 mov r0, r5
  57900. 8031c18: f7fc fe8c bl 802e934 <snmp_asn1_enc_length>
  57901. ofs += m_stat->rhl.ridlenlen;
  57902. 8031c1c: f894 311a ldrb.w r3, [r4, #282] ; 0x11a
  57903. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);
  57904. 8031c20: f8b4 2124 ldrh.w r2, [r4, #292] ; 0x124
  57905. ofs += m_stat->rhl.pdulenlen;
  57906. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57907. ofs += 1;
  57908. snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);
  57909. ofs += m_stat->rhl.ridlenlen;
  57910. 8031c24: 18ff adds r7, r7, r3
  57911. 8031c26: b2bf uxth r7, r7
  57912. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);
  57913. 8031c28: 4639 mov r1, r7
  57914. 8031c2a: 68e3 ldr r3, [r4, #12]
  57915. 8031c2c: 4628 mov r0, r5
  57916. 8031c2e: f7fc ff09 bl 802ea44 <snmp_asn1_enc_s32t>
  57917. ofs += m_stat->rhl.ridlen;
  57918. 8031c32: f8b4 3124 ldrh.w r3, [r4, #292] ; 0x124
  57919. 8031c36: 18ff adds r7, r7, r3
  57920. 8031c38: b2bf uxth r7, r7
  57921. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57922. 8031c3a: 4639 mov r1, r7
  57923. ofs += 1;
  57924. 8031c3c: 3701 adds r7, #1
  57925. snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);
  57926. ofs += m_stat->rhl.ridlenlen;
  57927. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);
  57928. ofs += m_stat->rhl.ridlen;
  57929. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57930. 8031c3e: 2202 movs r2, #2
  57931. ofs += 1;
  57932. 8031c40: b2bf uxth r7, r7
  57933. snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);
  57934. ofs += m_stat->rhl.ridlenlen;
  57935. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);
  57936. ofs += m_stat->rhl.ridlen;
  57937. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57938. 8031c42: 4628 mov r0, r5
  57939. 8031c44: f7fc fe62 bl 802e90c <snmp_asn1_enc_type>
  57940. ofs += 1;
  57941. snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);
  57942. 8031c48: 4639 mov r1, r7
  57943. 8031c4a: f8b4 2122 ldrh.w r2, [r4, #290] ; 0x122
  57944. 8031c4e: 4628 mov r0, r5
  57945. 8031c50: f7fc fe70 bl 802e934 <snmp_asn1_enc_length>
  57946. ofs += m_stat->rhl.errstatlenlen;
  57947. 8031c54: f894 3119 ldrb.w r3, [r4, #281] ; 0x119
  57948. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
  57949. 8031c58: f8b4 2122 ldrh.w r2, [r4, #290] ; 0x122
  57950. ofs += m_stat->rhl.ridlen;
  57951. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57952. ofs += 1;
  57953. snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);
  57954. ofs += m_stat->rhl.errstatlenlen;
  57955. 8031c5c: 18ff adds r7, r7, r3
  57956. 8031c5e: b2bf uxth r7, r7
  57957. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
  57958. 8031c60: 4639 mov r1, r7
  57959. 8031c62: 6923 ldr r3, [r4, #16]
  57960. 8031c64: 4628 mov r0, r5
  57961. 8031c66: f7fc feed bl 802ea44 <snmp_asn1_enc_s32t>
  57962. ofs += m_stat->rhl.errstatlen;
  57963. 8031c6a: f8b4 3122 ldrh.w r3, [r4, #290] ; 0x122
  57964. 8031c6e: 18ff adds r7, r7, r3
  57965. 8031c70: b2bf uxth r7, r7
  57966. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57967. 8031c72: 4639 mov r1, r7
  57968. ofs += 1;
  57969. 8031c74: 3701 adds r7, #1
  57970. snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);
  57971. ofs += m_stat->rhl.errstatlenlen;
  57972. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
  57973. ofs += m_stat->rhl.errstatlen;
  57974. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57975. 8031c76: 2202 movs r2, #2
  57976. ofs += 1;
  57977. 8031c78: b2bf uxth r7, r7
  57978. snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);
  57979. ofs += m_stat->rhl.errstatlenlen;
  57980. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
  57981. ofs += m_stat->rhl.errstatlen;
  57982. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57983. 8031c7a: 4628 mov r0, r5
  57984. 8031c7c: f7fc fe46 bl 802e90c <snmp_asn1_enc_type>
  57985. ofs += 1;
  57986. snmp_asn1_enc_length(p, ofs, m_stat->rhl.erridxlen);
  57987. 8031c80: 4639 mov r1, r7
  57988. 8031c82: f8b4 2120 ldrh.w r2, [r4, #288] ; 0x120
  57989. 8031c86: 4628 mov r0, r5
  57990. 8031c88: f7fc fe54 bl 802e934 <snmp_asn1_enc_length>
  57991. ofs += m_stat->rhl.erridxlenlen;
  57992. 8031c8c: f894 3118 ldrb.w r3, [r4, #280] ; 0x118
  57993. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.erridxlen, m_stat->error_index);
  57994. 8031c90: f8b4 2120 ldrh.w r2, [r4, #288] ; 0x120
  57995. ofs += m_stat->rhl.errstatlen;
  57996. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  57997. ofs += 1;
  57998. snmp_asn1_enc_length(p, ofs, m_stat->rhl.erridxlen);
  57999. ofs += m_stat->rhl.erridxlenlen;
  58000. 8031c94: 18ff adds r7, r7, r3
  58001. 8031c96: b2bf uxth r7, r7
  58002. snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.erridxlen, m_stat->error_index);
  58003. 8031c98: 4639 mov r1, r7
  58004. 8031c9a: 6963 ldr r3, [r4, #20]
  58005. 8031c9c: 4628 mov r0, r5
  58006. 8031c9e: f7fc fed1 bl 802ea44 <snmp_asn1_enc_s32t>
  58007. ofs += m_stat->rhl.erridxlen;
  58008. 8031ca2: f8b4 3120 ldrh.w r3, [r4, #288] ; 0x120
  58009. 8031ca6: 18fa adds r2, r7, r3
  58010. LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_snd_response() p != NULL\n"));
  58011. /* pass 1, size error, encode packet ino the pbuf(s) */
  58012. ofs = snmp_resp_header_enc(m_stat, p);
  58013. snmp_varbind_list_enc(&m_stat->outvb, p, ofs);
  58014. 8031ca8: 4630 mov r0, r6
  58015. 8031caa: 4629 mov r1, r5
  58016. 8031cac: b292 uxth r2, r2
  58017. 8031cae: f7ff fea1 bl 80319f4 <snmp_varbind_list_enc>
  58018. switch (m_stat->error_status)
  58019. 8031cb2: 6923 ldr r3, [r4, #16]
  58020. 8031cb4: 3b01 subs r3, #1
  58021. 8031cb6: 2b04 cmp r3, #4
  58022. 8031cb8: d80f bhi.n 8031cda <snmp_send_response+0x1da>
  58023. 8031cba: e8df f003 tbb [pc, r3]
  58024. 8031cbe: 0603 .short 0x0603
  58025. 8031cc0: 0e09 .short 0x0e09
  58026. 8031cc2: 0c .byte 0x0c
  58027. 8031cc3: 00 .byte 0x00
  58028. {
  58029. case SNMP_ES_TOOBIG:
  58030. snmp_inc_snmpouttoobigs();
  58031. 8031cc4: f7fe fa12 bl 80300ec <snmp_inc_snmpouttoobigs>
  58032. break;
  58033. 8031cc8: e007 b.n 8031cda <snmp_send_response+0x1da>
  58034. case SNMP_ES_NOSUCHNAME:
  58035. snmp_inc_snmpoutnosuchnames();
  58036. 8031cca: f7fe fa17 bl 80300fc <snmp_inc_snmpoutnosuchnames>
  58037. break;
  58038. 8031cce: e004 b.n 8031cda <snmp_send_response+0x1da>
  58039. case SNMP_ES_BADVALUE:
  58040. snmp_inc_snmpoutbadvalues();
  58041. 8031cd0: f7fe fa1c bl 803010c <snmp_inc_snmpoutbadvalues>
  58042. break;
  58043. 8031cd4: e001 b.n 8031cda <snmp_send_response+0x1da>
  58044. case SNMP_ES_GENERROR:
  58045. snmp_inc_snmpoutgenerrs();
  58046. 8031cd6: f7fe fa21 bl 803011c <snmp_inc_snmpoutgenerrs>
  58047. break;
  58048. }
  58049. snmp_inc_snmpoutgetresponses();
  58050. 8031cda: f7fe fa27 bl 803012c <snmp_inc_snmpoutgetresponses>
  58051. snmp_inc_snmpoutpkts();
  58052. 8031cde: f7fe f985 bl 802ffec <snmp_inc_snmpoutpkts>
  58053. /** @todo do we need separate rx and tx pcbs for threaded case? */
  58054. /** connect to the originating source */
  58055. udp_connect(m_stat->pcb, &m_stat->sip, m_stat->sp);
  58056. 8031ce2: 8922 ldrh r2, [r4, #8]
  58057. 8031ce4: 6820 ldr r0, [r4, #0]
  58058. 8031ce6: 1d21 adds r1, r4, #4
  58059. 8031ce8: f7fb ffcc bl 802dc84 <udp_connect>
  58060. err = udp_send(m_stat->pcb, p);
  58061. 8031cec: 4629 mov r1, r5
  58062. 8031cee: 6820 ldr r0, [r4, #0]
  58063. 8031cf0: f7fb ffc3 bl 802dc7a <udp_send>
  58064. /** @todo release some memory, retry and return tooBig? tooMuchHassle? */
  58065. err = ERR_MEM;
  58066. }
  58067. else
  58068. {
  58069. err = ERR_OK;
  58070. 8031cf4: f1b0 3fff cmp.w r0, #4294967295
  58071. 8031cf8: bf0c ite eq
  58072. 8031cfa: f04f 36ff moveq.w r6, #4294967295
  58073. 8031cfe: 2600 movne r6, #0
  58074. }
  58075. /** disassociate remote address and port with this pcb */
  58076. udp_disconnect(m_stat->pcb);
  58077. 8031d00: 6820 ldr r0, [r4, #0]
  58078. 8031d02: f7fb ffe5 bl 802dcd0 <udp_disconnect>
  58079. pbuf_free(p);
  58080. 8031d06: 4628 mov r0, r5
  58081. 8031d08: f7f9 faa2 bl 802b250 <pbuf_free>
  58082. 8031d0c: e000 b.n 8031d10 <snmp_send_response+0x210>
  58083. }
  58084. else
  58085. {
  58086. /* first pbuf alloc try or retry alloc failed
  58087. very low on memory, couldn't return tooBig */
  58088. return ERR_MEM;
  58089. 8031d0e: 26ff movs r6, #255 ; 0xff
  58090. }
  58091. }
  58092. 8031d10: b270 sxtb r0, r6
  58093. 8031d12: b005 add sp, #20
  58094. 8031d14: bdf0 pop {r4, r5, r6, r7, pc}
  58095. 8031d16: bf00 nop
  58096. 8031d18: 0803b520 .word 0x0803b520
  58097. 08031d1c <snmp_send_trap>:
  58098. * and .iso.org.dod.internet.private.enterprises.yourenterprise
  58099. * (sysObjectID) for specific traps.
  58100. */
  58101. err_t
  58102. snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap)
  58103. {
  58104. 8031d1c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  58105. struct pbuf *p;
  58106. u16_t i,tot_len;
  58107. for (i=0, td = &trap_dst[0]; i<SNMP_TRAP_DESTINATIONS; i++, td++)
  58108. {
  58109. if ((td->enable != 0) && !ip_addr_isany(&td->dip))
  58110. 8031d20: 4b11 ldr r3, [pc, #68] ; (8031d68 <snmp_send_trap+0x4c>)
  58111. * and .iso.org.dod.internet.private.enterprises.yourenterprise
  58112. * (sysObjectID) for specific traps.
  58113. */
  58114. err_t
  58115. snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap)
  58116. {
  58117. 8031d22: 4617 mov r7, r2
  58118. struct pbuf *p;
  58119. u16_t i,tot_len;
  58120. for (i=0, td = &trap_dst[0]; i<SNMP_TRAP_DESTINATIONS; i++, td++)
  58121. {
  58122. if ((td->enable != 0) && !ip_addr_isany(&td->dip))
  58123. 8031d24: 791a ldrb r2, [r3, #4]
  58124. * and .iso.org.dod.internet.private.enterprises.yourenterprise
  58125. * (sysObjectID) for specific traps.
  58126. */
  58127. err_t
  58128. snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap)
  58129. {
  58130. 8031d26: b085 sub sp, #20
  58131. 8031d28: 4605 mov r5, r0
  58132. 8031d2a: 460e mov r6, r1
  58133. struct pbuf *p;
  58134. u16_t i,tot_len;
  58135. for (i=0, td = &trap_dst[0]; i<SNMP_TRAP_DESTINATIONS; i++, td++)
  58136. {
  58137. if ((td->enable != 0) && !ip_addr_isany(&td->dip))
  58138. 8031d2c: 2a00 cmp r2, #0
  58139. 8031d2e: f000 81b8 beq.w 80320a2 <snmp_send_trap+0x386>
  58140. 8031d32: 6818 ldr r0, [r3, #0]
  58141. 8031d34: 2800 cmp r0, #0
  58142. 8031d36: f000 81b4 beq.w 80320a2 <snmp_send_trap+0x386>
  58143. {
  58144. /* network order trap destination */
  58145. ip_addr_copy(trap_msg.dip, td->dip);
  58146. 8031d3a: 4c0c ldr r4, [pc, #48] ; (8031d6c <snmp_send_trap+0x50>)
  58147. 8031d3c: 6060 str r0, [r4, #4]
  58148. /* lookup current source address for this dst */
  58149. dst_if = ip_route(&td->dip);
  58150. 8031d3e: 4618 mov r0, r3
  58151. 8031d40: f7fc fa10 bl 802e164 <ip_route>
  58152. ip_addr_copy(dst_ip, dst_if->ip_addr);
  58153. 8031d44: 6843 ldr r3, [r0, #4]
  58154. /* @todo: what about IPv6? */
  58155. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  58156. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  58157. trap_msg.sip_raw[2] = ip4_addr3(&dst_ip);
  58158. trap_msg.sip_raw[3] = ip4_addr4(&dst_ip);
  58159. trap_msg.gen_trap = generic_trap;
  58160. 8031d46: 6125 str r5, [r4, #16]
  58161. /* lookup current source address for this dst */
  58162. dst_if = ip_route(&td->dip);
  58163. ip_addr_copy(dst_ip, dst_if->ip_addr);
  58164. /* @todo: what about IPv6? */
  58165. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  58166. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  58167. 8031d48: f3c3 2207 ubfx r2, r3, #8, #8
  58168. ip_addr_copy(trap_msg.dip, td->dip);
  58169. /* lookup current source address for this dst */
  58170. dst_if = ip_route(&td->dip);
  58171. ip_addr_copy(dst_ip, dst_if->ip_addr);
  58172. /* @todo: what about IPv6? */
  58173. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  58174. 8031d4c: 7323 strb r3, [r4, #12]
  58175. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  58176. 8031d4e: 7362 strb r2, [r4, #13]
  58177. trap_msg.sip_raw[2] = ip4_addr3(&dst_ip);
  58178. trap_msg.sip_raw[3] = ip4_addr4(&dst_ip);
  58179. trap_msg.gen_trap = generic_trap;
  58180. trap_msg.spc_trap = specific_trap;
  58181. if (generic_trap == SNMP_GENTRAP_ENTERPRISESPC)
  58182. 8031d50: 2d06 cmp r5, #6
  58183. dst_if = ip_route(&td->dip);
  58184. ip_addr_copy(dst_ip, dst_if->ip_addr);
  58185. /* @todo: what about IPv6? */
  58186. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  58187. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  58188. trap_msg.sip_raw[2] = ip4_addr3(&dst_ip);
  58189. 8031d52: f3c3 4207 ubfx r2, r3, #16, #8
  58190. trap_msg.sip_raw[3] = ip4_addr4(&dst_ip);
  58191. 8031d56: f3c3 6307 ubfx r3, r3, #24, #8
  58192. dst_if = ip_route(&td->dip);
  58193. ip_addr_copy(dst_ip, dst_if->ip_addr);
  58194. /* @todo: what about IPv6? */
  58195. trap_msg.sip_raw[0] = ip4_addr1(&dst_ip);
  58196. trap_msg.sip_raw[1] = ip4_addr2(&dst_ip);
  58197. trap_msg.sip_raw[2] = ip4_addr3(&dst_ip);
  58198. 8031d5a: 73a2 strb r2, [r4, #14]
  58199. trap_msg.sip_raw[3] = ip4_addr4(&dst_ip);
  58200. 8031d5c: 73e3 strb r3, [r4, #15]
  58201. trap_msg.gen_trap = generic_trap;
  58202. trap_msg.spc_trap = specific_trap;
  58203. 8031d5e: 6167 str r7, [r4, #20]
  58204. if (generic_trap == SNMP_GENTRAP_ENTERPRISESPC)
  58205. 8031d60: d106 bne.n 8031d70 <snmp_send_trap+0x54>
  58206. {
  58207. /* enterprise-Specific trap */
  58208. trap_msg.enterprise = eoid;
  58209. 8031d62: 60a6 str r6, [r4, #8]
  58210. 8031d64: e008 b.n 8031d78 <snmp_send_trap+0x5c>
  58211. 8031d66: bf00 nop
  58212. 8031d68: 20010edc .word 0x20010edc
  58213. 8031d6c: 20010ee4 .word 0x20010ee4
  58214. }
  58215. else
  58216. {
  58217. /* generic (MIB-II) trap */
  58218. snmp_get_snmpgrpid_ptr(&trap_msg.enterprise);
  58219. 8031d70: f104 0008 add.w r0, r4, #8
  58220. 8031d74: f7fe f9ea bl 803014c <snmp_get_snmpgrpid_ptr>
  58221. }
  58222. snmp_get_sysuptime(&trap_msg.ts);
  58223. 8031d78: 48bb ldr r0, [pc, #748] ; (8032068 <snmp_send_trap+0x34c>)
  58224. struct snmp_trap_header_lengths *thl;
  58225. thl = &m_trap->thl;
  58226. tot_len = vb_len;
  58227. snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
  58228. 8031d7a: 4cbc ldr r4, [pc, #752] ; (803206c <snmp_send_trap+0x350>)
  58229. else
  58230. {
  58231. /* generic (MIB-II) trap */
  58232. snmp_get_snmpgrpid_ptr(&trap_msg.enterprise);
  58233. }
  58234. snmp_get_sysuptime(&trap_msg.ts);
  58235. 8031d7c: f7fd fd5a bl 802f834 <snmp_get_sysuptime>
  58236. /* pass 0, calculate length fields */
  58237. tot_len = snmp_varbind_list_sum(&trap_msg.outvb);
  58238. 8031d80: 48bb ldr r0, [pc, #748] ; (8032070 <snmp_send_trap+0x354>)
  58239. 8031d82: f7ff fd59 bl 8031838 <snmp_varbind_list_sum>
  58240. struct snmp_trap_header_lengths *thl;
  58241. thl = &m_trap->thl;
  58242. tot_len = vb_len;
  58243. snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
  58244. 8031d86: f104 0132 add.w r1, r4, #50 ; 0x32
  58245. snmp_get_snmpgrpid_ptr(&trap_msg.enterprise);
  58246. }
  58247. snmp_get_sysuptime(&trap_msg.ts);
  58248. /* pass 0, calculate length fields */
  58249. tot_len = snmp_varbind_list_sum(&trap_msg.outvb);
  58250. 8031d8a: 4606 mov r6, r0
  58251. struct snmp_trap_header_lengths *thl;
  58252. thl = &m_trap->thl;
  58253. tot_len = vb_len;
  58254. snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
  58255. 8031d8c: 69a0 ldr r0, [r4, #24]
  58256. 8031d8e: f7fc fd7b bl 802e888 <snmp_asn1_enc_u32t_cnt>
  58257. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  58258. 8031d92: 8e60 ldrh r0, [r4, #50] ; 0x32
  58259. 8031d94: f104 0128 add.w r1, r4, #40 ; 0x28
  58260. 8031d98: f7fc fd6b bl 802e872 <snmp_asn1_enc_length_cnt>
  58261. tot_len += 1 + thl->tslen + thl->tslenlen;
  58262. 8031d9c: f8b4 c032 ldrh.w ip, [r4, #50] ; 0x32
  58263. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  58264. 8031da0: 6960 ldr r0, [r4, #20]
  58265. 8031da2: f8cd c004 str.w ip, [sp, #4]
  58266. 8031da6: f104 0134 add.w r1, r4, #52 ; 0x34
  58267. thl = &m_trap->thl;
  58268. tot_len = vb_len;
  58269. snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
  58270. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  58271. tot_len += 1 + thl->tslen + thl->tslenlen;
  58272. 8031daa: f894 9028 ldrb.w r9, [r4, #40] ; 0x28
  58273. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  58274. 8031dae: f7fc fd80 bl 802e8b2 <snmp_asn1_enc_s32t_cnt>
  58275. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  58276. 8031db2: 8ea0 ldrh r0, [r4, #52] ; 0x34
  58277. 8031db4: f104 0129 add.w r1, r4, #41 ; 0x29
  58278. 8031db8: f7fc fd5b bl 802e872 <snmp_asn1_enc_length_cnt>
  58279. tot_len += 1 + thl->strplen + thl->strplenlen;
  58280. 8031dbc: 8ea3 ldrh r3, [r4, #52] ; 0x34
  58281. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  58282. 8031dbe: 6920 ldr r0, [r4, #16]
  58283. 8031dc0: 9302 str r3, [sp, #8]
  58284. 8031dc2: f104 0136 add.w r1, r4, #54 ; 0x36
  58285. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  58286. tot_len += 1 + thl->tslen + thl->tslenlen;
  58287. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  58288. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  58289. tot_len += 1 + thl->strplen + thl->strplenlen;
  58290. 8031dc6: f894 8029 ldrb.w r8, [r4, #41] ; 0x29
  58291. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  58292. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  58293. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  58294. thl->aaddrlen = 4;
  58295. 8031dca: 2504 movs r5, #4
  58296. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  58297. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  58298. tot_len += 1 + thl->strplen + thl->strplenlen;
  58299. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  58300. 8031dcc: f7fc fd71 bl 802e8b2 <snmp_asn1_enc_s32t_cnt>
  58301. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  58302. 8031dd0: 8ee0 ldrh r0, [r4, #54] ; 0x36
  58303. 8031dd2: f104 012a add.w r1, r4, #42 ; 0x2a
  58304. 8031dd6: f7fc fd4c bl 802e872 <snmp_asn1_enc_length_cnt>
  58305. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  58306. thl->aaddrlen = 4;
  58307. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  58308. 8031dda: 4628 mov r0, r5
  58309. 8031ddc: f104 012b add.w r1, r4, #43 ; 0x2b
  58310. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  58311. tot_len += 1 + thl->strplen + thl->strplenlen;
  58312. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  58313. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  58314. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  58315. 8031de0: f8b4 b036 ldrh.w fp, [r4, #54] ; 0x36
  58316. 8031de4: f894 702a ldrb.w r7, [r4, #42] ; 0x2a
  58317. thl->aaddrlen = 4;
  58318. 8031de8: 8725 strh r5, [r4, #56] ; 0x38
  58319. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  58320. 8031dea: f7fc fd42 bl 802e872 <snmp_asn1_enc_length_cnt>
  58321. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  58322. 8031dee: f894 202b ldrb.w r2, [r4, #43] ; 0x2b
  58323. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  58324. 8031df2: 68a1 ldr r1, [r4, #8]
  58325. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  58326. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  58327. thl->aaddrlen = 4;
  58328. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  58329. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  58330. 8031df4: 9203 str r2, [sp, #12]
  58331. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  58332. 8031df6: f811 0b04 ldrb.w r0, [r1], #4
  58333. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  58334. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  58335. thl->aaddrlen = 4;
  58336. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  58337. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  58338. 8031dfa: f8b4 a038 ldrh.w sl, [r4, #56] ; 0x38
  58339. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  58340. 8031dfe: f104 023a add.w r2, r4, #58 ; 0x3a
  58341. 8031e02: f7fc fd6b bl 802e8dc <snmp_asn1_enc_oid_cnt>
  58342. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  58343. 8031e06: 8f60 ldrh r0, [r4, #58] ; 0x3a
  58344. 8031e08: f104 012c add.w r1, r4, #44 ; 0x2c
  58345. 8031e0c: f7fc fd31 bl 802e872 <snmp_asn1_enc_length_cnt>
  58346. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  58347. tot_len += 1 + thl->tslen + thl->tslenlen;
  58348. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  58349. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  58350. tot_len += 1 + thl->strplen + thl->strplenlen;
  58351. 8031e10: f8dd c004 ldr.w ip, [sp, #4]
  58352. 8031e14: 9b02 ldr r3, [sp, #8]
  58353. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  58354. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  58355. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  58356. 8031e16: 8f62 ldrh r2, [r4, #58] ; 0x3a
  58357. snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
  58358. tot_len += 1 + thl->tslen + thl->tslenlen;
  58359. snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
  58360. snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
  58361. tot_len += 1 + thl->strplen + thl->strplenlen;
  58362. 8031e18: 4463 add r3, ip
  58363. 8031e1a: 3305 adds r3, #5
  58364. snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
  58365. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  58366. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  58367. 8031e1c: 449b add fp, r3
  58368. 8031e1e: 44da add sl, fp
  58369. 8031e20: fa12 fa8a uxtah sl, r2, sl
  58370. thl->aaddrlen = 4;
  58371. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  58372. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  58373. 8031e24: 44d1 add r9, sl
  58374. 8031e26: 44c8 add r8, r9
  58375. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  58376. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  58377. tot_len += 1 + thl->eidlen + thl->eidlenlen;
  58378. 8031e28: 9b03 ldr r3, [sp, #12]
  58379. snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
  58380. tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
  58381. thl->aaddrlen = 4;
  58382. snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
  58383. tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
  58384. 8031e2a: fa17 f788 uxtah r7, r7, r8
  58385. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  58386. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  58387. tot_len += 1 + thl->eidlen + thl->eidlenlen;
  58388. 8031e2e: 19df adds r7, r3, r7
  58389. 8031e30: f894 302c ldrb.w r3, [r4, #44] ; 0x2c
  58390. 8031e34: 18ff adds r7, r7, r3
  58391. 8031e36: fa16 f687 uxtah r6, r6, r7
  58392. 8031e3a: b2b6 uxth r6, r6
  58393. thl->pdulen = tot_len;
  58394. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  58395. 8031e3c: 4630 mov r0, r6
  58396. 8031e3e: f104 012d add.w r1, r4, #45 ; 0x2d
  58397. tot_len += 1 + thl->pdulenlen;
  58398. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  58399. 8031e42: 2706 movs r7, #6
  58400. snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
  58401. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  58402. tot_len += 1 + thl->eidlen + thl->eidlenlen;
  58403. thl->pdulen = tot_len;
  58404. 8031e44: 87a6 strh r6, [r4, #60] ; 0x3c
  58405. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  58406. 8031e46: f7fc fd14 bl 802e872 <snmp_asn1_enc_length_cnt>
  58407. tot_len += 1 + thl->pdulenlen;
  58408. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  58409. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  58410. 8031e4a: 4638 mov r0, r7
  58411. 8031e4c: f104 012e add.w r1, r4, #46 ; 0x2e
  58412. snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
  58413. tot_len += 1 + thl->eidlen + thl->eidlenlen;
  58414. thl->pdulen = tot_len;
  58415. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  58416. tot_len += 1 + thl->pdulenlen;
  58417. 8031e50: f894 a02d ldrb.w sl, [r4, #45] ; 0x2d
  58418. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  58419. 8031e54: 87e7 strh r7, [r4, #62] ; 0x3e
  58420. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  58421. 8031e56: f7fc fd0c bl 802e872 <snmp_asn1_enc_length_cnt>
  58422. tot_len += 1 + thl->comlenlen + thl->comlen;
  58423. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  58424. 8031e5a: 4b86 ldr r3, [pc, #536] ; (8032074 <snmp_send_trap+0x358>)
  58425. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  58426. tot_len += 1 + thl->pdulenlen;
  58427. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  58428. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  58429. tot_len += 1 + thl->comlenlen + thl->comlen;
  58430. 8031e5c: f894 902e ldrb.w r9, [r4, #46] ; 0x2e
  58431. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  58432. 8031e60: f8d3 8000 ldr.w r8, [r3]
  58433. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  58434. tot_len += 1 + thl->pdulenlen;
  58435. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  58436. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  58437. tot_len += 1 + thl->comlenlen + thl->comlen;
  58438. 8031e64: f8b4 b03e ldrh.w fp, [r4, #62] ; 0x3e
  58439. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  58440. 8031e68: 4640 mov r0, r8
  58441. 8031e6a: f104 0140 add.w r1, r4, #64 ; 0x40
  58442. 8031e6e: f7fc fd20 bl 802e8b2 <snmp_asn1_enc_s32t_cnt>
  58443. snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
  58444. 8031e72: f8b4 0040 ldrh.w r0, [r4, #64] ; 0x40
  58445. 8031e76: f104 012f add.w r1, r4, #47 ; 0x2f
  58446. 8031e7a: f7fc fcfa bl 802e872 <snmp_asn1_enc_length_cnt>
  58447. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  58448. tot_len += 1 + thl->pdulenlen;
  58449. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  58450. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  58451. tot_len += 1 + thl->comlenlen + thl->comlen;
  58452. 8031e7e: f8b4 3040 ldrh.w r3, [r4, #64] ; 0x40
  58453. 8031e82: 449b add fp, r3
  58454. 8031e84: f10b 0b03 add.w fp, fp, #3
  58455. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  58456. snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
  58457. tot_len += 1 + thl->verlen + thl->verlenlen;
  58458. 8031e88: f894 302f ldrb.w r3, [r4, #47] ; 0x2f
  58459. snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
  58460. tot_len += 1 + thl->pdulenlen;
  58461. thl->comlen = sizeof(snmp_publiccommunity) - 1;
  58462. snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
  58463. tot_len += 1 + thl->comlenlen + thl->comlen;
  58464. 8031e8c: 44da add sl, fp
  58465. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  58466. snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
  58467. tot_len += 1 + thl->verlen + thl->verlenlen;
  58468. 8031e8e: 44d1 add r9, sl
  58469. 8031e90: 4499 add r9, r3
  58470. 8031e92: fa16 f689 uxtah r6, r6, r9
  58471. 8031e96: b2b6 uxth r6, r6
  58472. thl->seqlen = tot_len;
  58473. snmp_asn1_enc_length_cnt(thl->seqlen, &thl->seqlenlen);
  58474. 8031e98: 4630 mov r0, r6
  58475. 8031e9a: f104 0130 add.w r1, r4, #48 ; 0x30
  58476. snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
  58477. snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
  58478. tot_len += 1 + thl->verlen + thl->verlenlen;
  58479. thl->seqlen = tot_len;
  58480. 8031e9e: f8a4 6042 strh.w r6, [r4, #66] ; 0x42
  58481. snmp_asn1_enc_length_cnt(thl->seqlen, &thl->seqlenlen);
  58482. 8031ea2: f7fc fce6 bl 802e872 <snmp_asn1_enc_length_cnt>
  58483. tot_len += 1 + thl->seqlenlen;
  58484. 8031ea6: f894 3030 ldrb.w r3, [r4, #48] ; 0x30
  58485. 8031eaa: 3301 adds r3, #1
  58486. 8031eac: 18f1 adds r1, r6, r3
  58487. /* pass 0, calculate length fields */
  58488. tot_len = snmp_varbind_list_sum(&trap_msg.outvb);
  58489. tot_len = snmp_trap_header_sum(&trap_msg, tot_len);
  58490. /* allocate pbuf(s) */
  58491. p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
  58492. 8031eae: 2000 movs r0, #0
  58493. 8031eb0: b289 uxth r1, r1
  58494. 8031eb2: 2203 movs r2, #3
  58495. 8031eb4: f7f9 fa19 bl 802b2ea <pbuf_alloc>
  58496. if (p != NULL)
  58497. 8031eb8: 4606 mov r6, r0
  58498. 8031eba: 2800 cmp r0, #0
  58499. 8031ebc: f000 80f3 beq.w 80320a6 <snmp_send_trap+0x38a>
  58500. snmp_trap_header_enc(struct snmp_msg_trap *m_trap, struct pbuf *p)
  58501. {
  58502. u16_t ofs;
  58503. ofs = 0;
  58504. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  58505. 8031ec0: 2100 movs r1, #0
  58506. 8031ec2: 2230 movs r2, #48 ; 0x30
  58507. 8031ec4: f7fc fd22 bl 802e90c <snmp_asn1_enc_type>
  58508. ofs += 1;
  58509. snmp_asn1_enc_length(p, ofs, m_trap->thl.seqlen);
  58510. 8031ec8: 2101 movs r1, #1
  58511. 8031eca: f8b4 2042 ldrh.w r2, [r4, #66] ; 0x42
  58512. 8031ece: 4630 mov r0, r6
  58513. 8031ed0: f7fc fd30 bl 802e934 <snmp_asn1_enc_length>
  58514. ofs += m_trap->thl.seqlenlen;
  58515. 8031ed4: f894 9030 ldrb.w r9, [r4, #48] ; 0x30
  58516. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  58517. 8031ed8: 2202 movs r2, #2
  58518. 8031eda: f109 0101 add.w r1, r9, #1
  58519. 8031ede: 4630 mov r0, r6
  58520. ofs += 1;
  58521. 8031ee0: f109 0902 add.w r9, r9, #2
  58522. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
  58523. ofs += 1;
  58524. snmp_asn1_enc_length(p, ofs, m_trap->thl.seqlen);
  58525. ofs += m_trap->thl.seqlenlen;
  58526. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  58527. 8031ee4: f7fc fd12 bl 802e90c <snmp_asn1_enc_type>
  58528. ofs += 1;
  58529. snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);
  58530. 8031ee8: 4649 mov r1, r9
  58531. 8031eea: f8b4 2040 ldrh.w r2, [r4, #64] ; 0x40
  58532. 8031eee: 4630 mov r0, r6
  58533. 8031ef0: f7fc fd20 bl 802e934 <snmp_asn1_enc_length>
  58534. ofs += m_trap->thl.verlenlen;
  58535. 8031ef4: f894 302f ldrb.w r3, [r4, #47] ; 0x2f
  58536. snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);
  58537. 8031ef8: f8b4 2040 ldrh.w r2, [r4, #64] ; 0x40
  58538. ofs += m_trap->thl.seqlenlen;
  58539. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  58540. ofs += 1;
  58541. snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);
  58542. ofs += m_trap->thl.verlenlen;
  58543. 8031efc: 4499 add r9, r3
  58544. snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);
  58545. 8031efe: 4649 mov r1, r9
  58546. 8031f00: 4643 mov r3, r8
  58547. 8031f02: 4630 mov r0, r6
  58548. 8031f04: f7fc fd9e bl 802ea44 <snmp_asn1_enc_s32t>
  58549. ofs += m_trap->thl.verlen;
  58550. 8031f08: f8b4 3040 ldrh.w r3, [r4, #64] ; 0x40
  58551. 8031f0c: 4499 add r9, r3
  58552. 8031f0e: fa1f f989 uxth.w r9, r9
  58553. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  58554. 8031f12: 462a mov r2, r5
  58555. ofs += 1;
  58556. 8031f14: f109 0501 add.w r5, r9, #1
  58557. snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);
  58558. ofs += m_trap->thl.verlenlen;
  58559. snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);
  58560. ofs += m_trap->thl.verlen;
  58561. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  58562. 8031f18: 4649 mov r1, r9
  58563. ofs += 1;
  58564. 8031f1a: b2ad uxth r5, r5
  58565. snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);
  58566. ofs += m_trap->thl.verlenlen;
  58567. snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);
  58568. ofs += m_trap->thl.verlen;
  58569. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  58570. 8031f1c: 4630 mov r0, r6
  58571. 8031f1e: f7fc fcf5 bl 802e90c <snmp_asn1_enc_type>
  58572. ofs += 1;
  58573. snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);
  58574. 8031f22: 4629 mov r1, r5
  58575. 8031f24: 8fe2 ldrh r2, [r4, #62] ; 0x3e
  58576. 8031f26: 4630 mov r0, r6
  58577. 8031f28: f7fc fd04 bl 802e934 <snmp_asn1_enc_length>
  58578. ofs += m_trap->thl.comlenlen;
  58579. 8031f2c: f894 302e ldrb.w r3, [r4, #46] ; 0x2e
  58580. snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);
  58581. 8031f30: 8fe2 ldrh r2, [r4, #62] ; 0x3e
  58582. ofs += m_trap->thl.verlen;
  58583. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
  58584. ofs += 1;
  58585. snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);
  58586. ofs += m_trap->thl.comlenlen;
  58587. 8031f32: 18ed adds r5, r5, r3
  58588. 8031f34: b2ad uxth r5, r5
  58589. snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);
  58590. 8031f36: 4629 mov r1, r5
  58591. 8031f38: 4b4f ldr r3, [pc, #316] ; (8032078 <snmp_send_trap+0x35c>)
  58592. 8031f3a: 4630 mov r0, r6
  58593. 8031f3c: f7fc fe22 bl 802eb84 <snmp_asn1_enc_raw>
  58594. ofs += m_trap->thl.comlen;
  58595. 8031f40: 8fe3 ldrh r3, [r4, #62] ; 0x3e
  58596. 8031f42: 18ed adds r5, r5, r3
  58597. 8031f44: b2ad uxth r5, r5
  58598. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  58599. 8031f46: 4629 mov r1, r5
  58600. ofs += 1;
  58601. 8031f48: 3501 adds r5, #1
  58602. snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);
  58603. ofs += m_trap->thl.comlenlen;
  58604. snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);
  58605. ofs += m_trap->thl.comlen;
  58606. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  58607. 8031f4a: 22a4 movs r2, #164 ; 0xa4
  58608. ofs += 1;
  58609. 8031f4c: b2ad uxth r5, r5
  58610. snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);
  58611. ofs += m_trap->thl.comlenlen;
  58612. snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);
  58613. ofs += m_trap->thl.comlen;
  58614. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  58615. 8031f4e: 4630 mov r0, r6
  58616. 8031f50: f7fc fcdc bl 802e90c <snmp_asn1_enc_type>
  58617. ofs += 1;
  58618. snmp_asn1_enc_length(p, ofs, m_trap->thl.pdulen);
  58619. 8031f54: 4629 mov r1, r5
  58620. 8031f56: 8fa2 ldrh r2, [r4, #60] ; 0x3c
  58621. 8031f58: 4630 mov r0, r6
  58622. 8031f5a: f7fc fceb bl 802e934 <snmp_asn1_enc_length>
  58623. ofs += m_trap->thl.pdulenlen;
  58624. 8031f5e: f894 302d ldrb.w r3, [r4, #45] ; 0x2d
  58625. 8031f62: 18ed adds r5, r5, r3
  58626. 8031f64: b2ad uxth r5, r5
  58627. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  58628. 8031f66: 4629 mov r1, r5
  58629. ofs += 1;
  58630. 8031f68: 3501 adds r5, #1
  58631. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  58632. ofs += 1;
  58633. snmp_asn1_enc_length(p, ofs, m_trap->thl.pdulen);
  58634. ofs += m_trap->thl.pdulenlen;
  58635. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  58636. 8031f6a: 463a mov r2, r7
  58637. ofs += 1;
  58638. 8031f6c: b2ad uxth r5, r5
  58639. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
  58640. ofs += 1;
  58641. snmp_asn1_enc_length(p, ofs, m_trap->thl.pdulen);
  58642. ofs += m_trap->thl.pdulenlen;
  58643. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  58644. 8031f6e: 4630 mov r0, r6
  58645. 8031f70: f7fc fccc bl 802e90c <snmp_asn1_enc_type>
  58646. ofs += 1;
  58647. snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);
  58648. 8031f74: 4629 mov r1, r5
  58649. 8031f76: 8f62 ldrh r2, [r4, #58] ; 0x3a
  58650. 8031f78: 4630 mov r0, r6
  58651. 8031f7a: f7fc fcdb bl 802e934 <snmp_asn1_enc_length>
  58652. ofs += m_trap->thl.eidlenlen;
  58653. 8031f7e: f894 302c ldrb.w r3, [r4, #44] ; 0x2c
  58654. 8031f82: 18ed adds r5, r5, r3
  58655. snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
  58656. 8031f84: 68a3 ldr r3, [r4, #8]
  58657. ofs += m_trap->thl.pdulenlen;
  58658. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
  58659. ofs += 1;
  58660. snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);
  58661. ofs += m_trap->thl.eidlenlen;
  58662. 8031f86: b2ad uxth r5, r5
  58663. snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
  58664. 8031f88: 4629 mov r1, r5
  58665. 8031f8a: f813 2b04 ldrb.w r2, [r3], #4
  58666. 8031f8e: 4630 mov r0, r6
  58667. 8031f90: f7fc fd85 bl 802ea9e <snmp_asn1_enc_oid>
  58668. ofs += m_trap->thl.eidlen;
  58669. 8031f94: 8f63 ldrh r3, [r4, #58] ; 0x3a
  58670. 8031f96: 18ed adds r5, r5, r3
  58671. 8031f98: b2ad uxth r5, r5
  58672. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
  58673. 8031f9a: 4629 mov r1, r5
  58674. ofs += 1;
  58675. 8031f9c: 3501 adds r5, #1
  58676. snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);
  58677. ofs += m_trap->thl.eidlenlen;
  58678. snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
  58679. ofs += m_trap->thl.eidlen;
  58680. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
  58681. 8031f9e: 2240 movs r2, #64 ; 0x40
  58682. ofs += 1;
  58683. 8031fa0: b2ad uxth r5, r5
  58684. snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);
  58685. ofs += m_trap->thl.eidlenlen;
  58686. snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
  58687. ofs += m_trap->thl.eidlen;
  58688. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
  58689. 8031fa2: 4630 mov r0, r6
  58690. 8031fa4: f7fc fcb2 bl 802e90c <snmp_asn1_enc_type>
  58691. ofs += 1;
  58692. snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);
  58693. 8031fa8: 4629 mov r1, r5
  58694. 8031faa: 8f22 ldrh r2, [r4, #56] ; 0x38
  58695. 8031fac: 4630 mov r0, r6
  58696. 8031fae: f7fc fcc1 bl 802e934 <snmp_asn1_enc_length>
  58697. ofs += m_trap->thl.aaddrlenlen;
  58698. 8031fb2: f894 302b ldrb.w r3, [r4, #43] ; 0x2b
  58699. snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
  58700. 8031fb6: 8f22 ldrh r2, [r4, #56] ; 0x38
  58701. ofs += m_trap->thl.eidlen;
  58702. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
  58703. ofs += 1;
  58704. snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);
  58705. ofs += m_trap->thl.aaddrlenlen;
  58706. 8031fb8: 18ed adds r5, r5, r3
  58707. 8031fba: b2ad uxth r5, r5
  58708. snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
  58709. 8031fbc: 4629 mov r1, r5
  58710. 8031fbe: f104 030c add.w r3, r4, #12
  58711. 8031fc2: 4630 mov r0, r6
  58712. 8031fc4: f7fc fdde bl 802eb84 <snmp_asn1_enc_raw>
  58713. ofs += m_trap->thl.aaddrlen;
  58714. 8031fc8: 8f23 ldrh r3, [r4, #56] ; 0x38
  58715. 8031fca: 18ed adds r5, r5, r3
  58716. 8031fcc: b2ad uxth r5, r5
  58717. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  58718. 8031fce: 4629 mov r1, r5
  58719. ofs += 1;
  58720. 8031fd0: 3501 adds r5, #1
  58721. snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);
  58722. ofs += m_trap->thl.aaddrlenlen;
  58723. snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
  58724. ofs += m_trap->thl.aaddrlen;
  58725. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  58726. 8031fd2: 2202 movs r2, #2
  58727. ofs += 1;
  58728. 8031fd4: b2ad uxth r5, r5
  58729. snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);
  58730. ofs += m_trap->thl.aaddrlenlen;
  58731. snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
  58732. ofs += m_trap->thl.aaddrlen;
  58733. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  58734. 8031fd6: 4630 mov r0, r6
  58735. 8031fd8: f7fc fc98 bl 802e90c <snmp_asn1_enc_type>
  58736. ofs += 1;
  58737. snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);
  58738. 8031fdc: 4629 mov r1, r5
  58739. 8031fde: 8ee2 ldrh r2, [r4, #54] ; 0x36
  58740. 8031fe0: 4630 mov r0, r6
  58741. 8031fe2: f7fc fca7 bl 802e934 <snmp_asn1_enc_length>
  58742. ofs += m_trap->thl.gtrplenlen;
  58743. 8031fe6: f894 302a ldrb.w r3, [r4, #42] ; 0x2a
  58744. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
  58745. 8031fea: 8ee2 ldrh r2, [r4, #54] ; 0x36
  58746. ofs += m_trap->thl.aaddrlen;
  58747. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  58748. ofs += 1;
  58749. snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);
  58750. ofs += m_trap->thl.gtrplenlen;
  58751. 8031fec: 18ed adds r5, r5, r3
  58752. 8031fee: b2ad uxth r5, r5
  58753. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
  58754. 8031ff0: 4629 mov r1, r5
  58755. 8031ff2: 6923 ldr r3, [r4, #16]
  58756. 8031ff4: 4630 mov r0, r6
  58757. 8031ff6: f7fc fce5 bl 802e9c4 <snmp_asn1_enc_u32t>
  58758. ofs += m_trap->thl.gtrplen;
  58759. 8031ffa: 8ee3 ldrh r3, [r4, #54] ; 0x36
  58760. 8031ffc: 18ed adds r5, r5, r3
  58761. 8031ffe: b2ad uxth r5, r5
  58762. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  58763. 8032000: 4629 mov r1, r5
  58764. ofs += 1;
  58765. 8032002: 3501 adds r5, #1
  58766. snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);
  58767. ofs += m_trap->thl.gtrplenlen;
  58768. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
  58769. ofs += m_trap->thl.gtrplen;
  58770. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  58771. 8032004: 2202 movs r2, #2
  58772. ofs += 1;
  58773. 8032006: b2ad uxth r5, r5
  58774. snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);
  58775. ofs += m_trap->thl.gtrplenlen;
  58776. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
  58777. ofs += m_trap->thl.gtrplen;
  58778. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  58779. 8032008: 4630 mov r0, r6
  58780. 803200a: f7fc fc7f bl 802e90c <snmp_asn1_enc_type>
  58781. ofs += 1;
  58782. snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);
  58783. 803200e: 4629 mov r1, r5
  58784. 8032010: 8ea2 ldrh r2, [r4, #52] ; 0x34
  58785. 8032012: 4630 mov r0, r6
  58786. 8032014: f7fc fc8e bl 802e934 <snmp_asn1_enc_length>
  58787. ofs += m_trap->thl.strplenlen;
  58788. 8032018: f894 3029 ldrb.w r3, [r4, #41] ; 0x29
  58789. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
  58790. 803201c: 8ea2 ldrh r2, [r4, #52] ; 0x34
  58791. ofs += m_trap->thl.gtrplen;
  58792. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
  58793. ofs += 1;
  58794. snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);
  58795. ofs += m_trap->thl.strplenlen;
  58796. 803201e: 18ed adds r5, r5, r3
  58797. 8032020: b2ad uxth r5, r5
  58798. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
  58799. 8032022: 4629 mov r1, r5
  58800. 8032024: 6963 ldr r3, [r4, #20]
  58801. 8032026: 4630 mov r0, r6
  58802. 8032028: f7fc fccc bl 802e9c4 <snmp_asn1_enc_u32t>
  58803. ofs += m_trap->thl.strplen;
  58804. 803202c: 8ea3 ldrh r3, [r4, #52] ; 0x34
  58805. 803202e: 18ed adds r5, r5, r3
  58806. 8032030: b2ad uxth r5, r5
  58807. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
  58808. 8032032: 4629 mov r1, r5
  58809. ofs += 1;
  58810. 8032034: 3501 adds r5, #1
  58811. snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);
  58812. ofs += m_trap->thl.strplenlen;
  58813. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
  58814. ofs += m_trap->thl.strplen;
  58815. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
  58816. 8032036: 2243 movs r2, #67 ; 0x43
  58817. ofs += 1;
  58818. 8032038: b2ad uxth r5, r5
  58819. snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);
  58820. ofs += m_trap->thl.strplenlen;
  58821. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
  58822. ofs += m_trap->thl.strplen;
  58823. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
  58824. 803203a: 4630 mov r0, r6
  58825. 803203c: f7fc fc66 bl 802e90c <snmp_asn1_enc_type>
  58826. ofs += 1;
  58827. snmp_asn1_enc_length(p, ofs, m_trap->thl.tslen);
  58828. 8032040: 4629 mov r1, r5
  58829. 8032042: 8e62 ldrh r2, [r4, #50] ; 0x32
  58830. 8032044: 4630 mov r0, r6
  58831. 8032046: f7fc fc75 bl 802e934 <snmp_asn1_enc_length>
  58832. ofs += m_trap->thl.tslenlen;
  58833. 803204a: f894 3028 ldrb.w r3, [r4, #40] ; 0x28
  58834. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.tslen, m_trap->ts);
  58835. 803204e: 8e62 ldrh r2, [r4, #50] ; 0x32
  58836. ofs += m_trap->thl.strplen;
  58837. snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
  58838. ofs += 1;
  58839. snmp_asn1_enc_length(p, ofs, m_trap->thl.tslen);
  58840. ofs += m_trap->thl.tslenlen;
  58841. 8032050: 18ed adds r5, r5, r3
  58842. 8032052: b2ad uxth r5, r5
  58843. snmp_asn1_enc_u32t(p, ofs, m_trap->thl.tslen, m_trap->ts);
  58844. 8032054: 4629 mov r1, r5
  58845. 8032056: 69a3 ldr r3, [r4, #24]
  58846. 8032058: 4630 mov r0, r6
  58847. 803205a: f7fc fcb3 bl 802e9c4 <snmp_asn1_enc_u32t>
  58848. ofs += m_trap->thl.tslen;
  58849. 803205e: 8e63 ldrh r3, [r4, #50] ; 0x32
  58850. 8032060: 18ea adds r2, r5, r3
  58851. {
  58852. u16_t ofs;
  58853. /* pass 1, encode packet ino the pbuf(s) */
  58854. ofs = snmp_trap_header_enc(&trap_msg, p);
  58855. snmp_varbind_list_enc(&trap_msg.outvb, p, ofs);
  58856. 8032062: 4631 mov r1, r6
  58857. 8032064: e00a b.n 803207c <snmp_send_trap+0x360>
  58858. 8032066: bf00 nop
  58859. 8032068: 20010efc .word 0x20010efc
  58860. 803206c: 20010ee4 .word 0x20010ee4
  58861. 8032070: 20010f00 .word 0x20010f00
  58862. 8032074: 0803b520 .word 0x0803b520
  58863. 8032078: 0803b524 .word 0x0803b524
  58864. 803207c: b292 uxth r2, r2
  58865. 803207e: f104 001c add.w r0, r4, #28
  58866. 8032082: f7ff fcb7 bl 80319f4 <snmp_varbind_list_enc>
  58867. snmp_inc_snmpouttraps();
  58868. 8032086: f7fe f859 bl 803013c <snmp_inc_snmpouttraps>
  58869. snmp_inc_snmpoutpkts();
  58870. 803208a: f7fd ffaf bl 802ffec <snmp_inc_snmpoutpkts>
  58871. /** send to the TRAP destination */
  58872. udp_sendto(trap_msg.pcb, p, &trap_msg.dip, SNMP_TRAP_PORT);
  58873. 803208e: 4622 mov r2, r4
  58874. 8032090: 4631 mov r1, r6
  58875. 8032092: f852 0b04 ldr.w r0, [r2], #4
  58876. 8032096: 23a2 movs r3, #162 ; 0xa2
  58877. 8032098: f7fb fddb bl 802dc52 <udp_sendto>
  58878. pbuf_free(p);
  58879. 803209c: 4630 mov r0, r6
  58880. 803209e: f7f9 f8d7 bl 802b250 <pbuf_free>
  58881. {
  58882. return ERR_MEM;
  58883. }
  58884. }
  58885. }
  58886. return ERR_OK;
  58887. 80320a2: 2000 movs r0, #0
  58888. 80320a4: e000 b.n 80320a8 <snmp_send_trap+0x38c>
  58889. pbuf_free(p);
  58890. }
  58891. else
  58892. {
  58893. return ERR_MEM;
  58894. 80320a6: 20ff movs r0, #255 ; 0xff
  58895. }
  58896. }
  58897. }
  58898. return ERR_OK;
  58899. }
  58900. 80320a8: b240 sxtb r0, r0
  58901. 80320aa: b005 add sp, #20
  58902. 80320ac: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  58903. 080320b0 <snmp_authfail_trap>:
  58904. snmp_send_trap(SNMP_GENTRAP_COLDSTART, NULL, 0);
  58905. }
  58906. void
  58907. snmp_authfail_trap(void)
  58908. {
  58909. 80320b0: b507 push {r0, r1, r2, lr}
  58910. u8_t enable;
  58911. snmp_get_snmpenableauthentraps(&enable);
  58912. 80320b2: f10d 0007 add.w r0, sp, #7
  58913. 80320b6: f7fe f84f bl 8030158 <snmp_get_snmpenableauthentraps>
  58914. if (enable == 1)
  58915. 80320ba: f89d 3007 ldrb.w r3, [sp, #7]
  58916. 80320be: 2b01 cmp r3, #1
  58917. 80320c0: d109 bne.n 80320d6 <snmp_authfail_trap+0x26>
  58918. {
  58919. trap_msg.outvb.head = NULL;
  58920. 80320c2: 2100 movs r1, #0
  58921. 80320c4: 4b04 ldr r3, [pc, #16] ; (80320d8 <snmp_authfail_trap+0x28>)
  58922. trap_msg.outvb.tail = NULL;
  58923. trap_msg.outvb.count = 0;
  58924. snmp_send_trap(SNMP_GENTRAP_AUTHFAIL, NULL, 0);
  58925. 80320c6: 2004 movs r0, #4
  58926. 80320c8: 460a mov r2, r1
  58927. {
  58928. u8_t enable;
  58929. snmp_get_snmpenableauthentraps(&enable);
  58930. if (enable == 1)
  58931. {
  58932. trap_msg.outvb.head = NULL;
  58933. 80320ca: 61d9 str r1, [r3, #28]
  58934. trap_msg.outvb.tail = NULL;
  58935. 80320cc: 6219 str r1, [r3, #32]
  58936. trap_msg.outvb.count = 0;
  58937. 80320ce: f883 1024 strb.w r1, [r3, #36] ; 0x24
  58938. snmp_send_trap(SNMP_GENTRAP_AUTHFAIL, NULL, 0);
  58939. 80320d2: f7ff fe23 bl 8031d1c <snmp_send_trap>
  58940. }
  58941. }
  58942. 80320d6: bd0e pop {r1, r2, r3, pc}
  58943. 80320d8: 20010ee4 .word 0x20010ee4
  58944. 080320dc <etharp_send_ip>:
  58945. * @params dst the destination MAC address to be copied into the ethernet header
  58946. * @return ERR_OK if the packet was sent, any other err_t on failure
  58947. */
  58948. static err_t
  58949. etharp_send_ip(struct netif *netif, struct pbuf *p, struct eth_addr *src, struct eth_addr *dst)
  58950. {
  58951. 80320dc: b5f8 push {r3, r4, r5, r6, r7, lr}
  58952. struct eth_hdr *ethhdr = (struct eth_hdr *)p->payload;
  58953. 80320de: 684c ldr r4, [r1, #4]
  58954. * @params dst the destination MAC address to be copied into the ethernet header
  58955. * @return ERR_OK if the packet was sent, any other err_t on failure
  58956. */
  58957. static err_t
  58958. etharp_send_ip(struct netif *netif, struct pbuf *p, struct eth_addr *src, struct eth_addr *dst)
  58959. {
  58960. 80320e0: 4606 mov r6, r0
  58961. 80320e2: 460d mov r5, r1
  58962. 80320e4: 4617 mov r7, r2
  58963. struct eth_hdr *ethhdr = (struct eth_hdr *)p->payload;
  58964. LWIP_ASSERT("netif->hwaddr_len must be the same as ETHARP_HWADDR_LEN for etharp!",
  58965. (netif->hwaddr_len == ETHARP_HWADDR_LEN));
  58966. ETHADDR32_COPY(&ethhdr->dest, dst);
  58967. 80320e6: 4619 mov r1, r3
  58968. 80320e8: 2206 movs r2, #6
  58969. 80320ea: 4620 mov r0, r4
  58970. 80320ec: f7ef faaa bl 8021644 <memcpy>
  58971. ETHADDR16_COPY(&ethhdr->src, src);
  58972. 80320f0: 4639 mov r1, r7
  58973. 80320f2: 1da0 adds r0, r4, #6
  58974. 80320f4: 2206 movs r2, #6
  58975. 80320f6: f7ef faa5 bl 8021644 <memcpy>
  58976. ethhdr->type = PP_HTONS(ETHTYPE_IP);
  58977. 80320fa: 2308 movs r3, #8
  58978. 80320fc: 7323 strb r3, [r4, #12]
  58979. 80320fe: 2300 movs r3, #0
  58980. 8032100: 7363 strb r3, [r4, #13]
  58981. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_send_ip: sending packet %p\n", (void *)p));
  58982. /* send the packet */
  58983. return netif->linkoutput(netif, p);
  58984. 8032102: 69b3 ldr r3, [r6, #24]
  58985. 8032104: 4630 mov r0, r6
  58986. 8032106: 4629 mov r1, r5
  58987. 8032108: 4798 blx r3
  58988. }
  58989. 803210a: bdf8 pop {r3, r4, r5, r6, r7, pc}
  58990. 0803210c <etharp_free_entry>:
  58991. #endif /* ARP_QUEUEING */
  58992. /** Clean up ARP table entries */
  58993. static void
  58994. etharp_free_entry(int i)
  58995. {
  58996. 803210c: b570 push {r4, r5, r6, lr}
  58997. /* remove from SNMP ARP index tree */
  58998. snmp_delete_arpidx_tree(arp_table[i].netif, &arp_table[i].ipaddr);
  58999. 803210e: 4d0b ldr r5, [pc, #44] ; (803213c <etharp_free_entry+0x30>)
  59000. 8032110: 2414 movs r4, #20
  59001. 8032112: 4344 muls r4, r0
  59002. 8032114: 1929 adds r1, r5, r4
  59003. #endif /* ARP_QUEUEING */
  59004. /** Clean up ARP table entries */
  59005. static void
  59006. etharp_free_entry(int i)
  59007. {
  59008. 8032116: 4606 mov r6, r0
  59009. /* remove from SNMP ARP index tree */
  59010. snmp_delete_arpidx_tree(arp_table[i].netif, &arp_table[i].ipaddr);
  59011. 8032118: 3104 adds r1, #4
  59012. 803211a: 6848 ldr r0, [r1, #4]
  59013. 803211c: f7fd fc5a bl 802f9d4 <snmp_delete_arpidx_tree>
  59014. /* and empty packet queue */
  59015. if (arp_table[i].q != NULL) {
  59016. 8032120: 5928 ldr r0, [r5, r4]
  59017. 8032122: b118 cbz r0, 803212c <etharp_free_entry+0x20>
  59018. /* remove all queued packets */
  59019. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_free_entry: freeing entry %"U16_F", packet queue %p.\n", (u16_t)i, (void *)(arp_table[i].q)));
  59020. free_etharp_q(arp_table[i].q);
  59021. 8032124: f7f9 f894 bl 802b250 <pbuf_free>
  59022. arp_table[i].q = NULL;
  59023. 8032128: 2300 movs r3, #0
  59024. 803212a: 512b str r3, [r5, r4]
  59025. }
  59026. /* recycle entry for re-use */
  59027. arp_table[i].state = ETHARP_STATE_EMPTY;
  59028. 803212c: 2314 movs r3, #20
  59029. 803212e: fb03 5506 mla r5, r3, r6, r5
  59030. 8032132: 2300 movs r3, #0
  59031. 8032134: 74ab strb r3, [r5, #18]
  59032. 8032136: 3510 adds r5, #16
  59033. 8032138: bd70 pop {r4, r5, r6, pc}
  59034. 803213a: bf00 nop
  59035. 803213c: 2000e3c4 .word 0x2000e3c4
  59036. 08032140 <etharp_find_entry>:
  59037. * @return The ARP entry index that matched or is created, ERR_MEM if no
  59038. * entry is found or could be recycled.
  59039. */
  59040. static s8_t
  59041. etharp_find_entry(ip_addr_t *ipaddr, u8_t flags)
  59042. {
  59043. 8032140: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
  59044. s8_t empty = ARP_TABLE_SIZE;
  59045. u8_t i = 0, age_pending = 0, age_stable = 0;
  59046. /* oldest entry with packets on queue */
  59047. s8_t old_queue = ARP_TABLE_SIZE;
  59048. /* its age */
  59049. u8_t age_queue = 0;
  59050. 8032144: 2500 movs r5, #0
  59051. {
  59052. s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
  59053. s8_t empty = ARP_TABLE_SIZE;
  59054. u8_t i = 0, age_pending = 0, age_stable = 0;
  59055. /* oldest entry with packets on queue */
  59056. s8_t old_queue = ARP_TABLE_SIZE;
  59057. 8032146: 240a movs r4, #10
  59058. 8032148: 4a35 ldr r2, [pc, #212] ; (8032220 <etharp_find_entry+0xe0>)
  59059. * @return The ARP entry index that matched or is created, ERR_MEM if no
  59060. * entry is found or could be recycled.
  59061. */
  59062. static s8_t
  59063. etharp_find_entry(ip_addr_t *ipaddr, u8_t flags)
  59064. {
  59065. 803214a: 9101 str r1, [sp, #4]
  59066. 803214c: 4606 mov r6, r0
  59067. s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
  59068. s8_t empty = ARP_TABLE_SIZE;
  59069. u8_t i = 0, age_pending = 0, age_stable = 0;
  59070. 803214e: 46a8 mov r8, r5
  59071. 8032150: 46aa mov sl, r5
  59072. * 4) remember the oldest pending entry with queued packets (if any)
  59073. * 5) search for a matching IP entry, either pending or stable
  59074. * until 5 matches, or all entries are searched for.
  59075. */
  59076. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  59077. 8032152: 462b mov r3, r5
  59078. */
  59079. static s8_t
  59080. etharp_find_entry(ip_addr_t *ipaddr, u8_t flags)
  59081. {
  59082. s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
  59083. s8_t empty = ARP_TABLE_SIZE;
  59084. 8032154: 4627 mov r7, r4
  59085. * entry is found or could be recycled.
  59086. */
  59087. static s8_t
  59088. etharp_find_entry(ip_addr_t *ipaddr, u8_t flags)
  59089. {
  59090. s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
  59091. 8032156: 46a4 mov ip, r4
  59092. 8032158: 46a3 mov fp, r4
  59093. */
  59094. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  59095. u8_t state = arp_table[i].state;
  59096. /* no empty entry found yet and now we do find one? */
  59097. if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) {
  59098. 803215a: 2f0a cmp r7, #10
  59099. * 5) search for a matching IP entry, either pending or stable
  59100. * until 5 matches, or all entries are searched for.
  59101. */
  59102. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  59103. u8_t state = arp_table[i].state;
  59104. 803215c: f892 9012 ldrb.w r9, [r2, #18]
  59105. /* no empty entry found yet and now we do find one? */
  59106. if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) {
  59107. 8032160: d104 bne.n 803216c <etharp_find_entry+0x2c>
  59108. 8032162: f1b9 0f00 cmp.w r9, #0
  59109. 8032166: d104 bne.n 8032172 <etharp_find_entry+0x32>
  59110. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_find_entry: found empty entry %"U16_F"\n", (u16_t)i));
  59111. /* remember first empty entry */
  59112. empty = i;
  59113. 8032168: b2df uxtb r7, r3
  59114. 803216a: e023 b.n 80321b4 <etharp_find_entry+0x74>
  59115. } else if (state != ETHARP_STATE_EMPTY) {
  59116. 803216c: f1b9 0f00 cmp.w r9, #0
  59117. 8032170: d020 beq.n 80321b4 <etharp_find_entry+0x74>
  59118. LWIP_ASSERT("state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE",
  59119. state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE);
  59120. /* if given, does IP address match IP address in ARP entry? */
  59121. if (ipaddr && ip_addr_cmp(ipaddr, &arp_table[i].ipaddr)) {
  59122. 8032172: b12e cbz r6, 8032180 <etharp_find_entry+0x40>
  59123. 8032174: 6830 ldr r0, [r6, #0]
  59124. 8032176: 6851 ldr r1, [r2, #4]
  59125. 8032178: 4288 cmp r0, r1
  59126. 803217a: d101 bne.n 8032180 <etharp_find_entry+0x40>
  59127. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: found matching entry %"U16_F"\n", (u16_t)i));
  59128. /* found exact IP address match, simply bail out */
  59129. return i;
  59130. 803217c: 4618 mov r0, r3
  59131. 803217e: e04b b.n 8032218 <etharp_find_entry+0xd8>
  59132. }
  59133. /* pending entry? */
  59134. if (state == ETHARP_STATE_PENDING) {
  59135. 8032180: f1b9 0f01 cmp.w r9, #1
  59136. 8032184: d10e bne.n 80321a4 <etharp_find_entry+0x64>
  59137. /* pending with queued packets? */
  59138. if (arp_table[i].q != NULL) {
  59139. 8032186: 6810 ldr r0, [r2, #0]
  59140. if (arp_table[i].ctime >= age_queue) {
  59141. 8032188: f892 9013 ldrb.w r9, [r2, #19]
  59142. return i;
  59143. }
  59144. /* pending entry? */
  59145. if (state == ETHARP_STATE_PENDING) {
  59146. /* pending with queued packets? */
  59147. if (arp_table[i].q != NULL) {
  59148. 803218c: b120 cbz r0, 8032198 <etharp_find_entry+0x58>
  59149. if (arp_table[i].ctime >= age_queue) {
  59150. 803218e: 45a9 cmp r9, r5
  59151. 8032190: d310 bcc.n 80321b4 <etharp_find_entry+0x74>
  59152. old_queue = i;
  59153. 8032192: b2dc uxtb r4, r3
  59154. 8032194: 464d mov r5, r9
  59155. 8032196: e00d b.n 80321b4 <etharp_find_entry+0x74>
  59156. age_queue = arp_table[i].ctime;
  59157. }
  59158. } else
  59159. /* pending without queued packets? */
  59160. {
  59161. if (arp_table[i].ctime >= age_pending) {
  59162. 8032198: 45d1 cmp r9, sl
  59163. 803219a: d30b bcc.n 80321b4 <etharp_find_entry+0x74>
  59164. old_pending = i;
  59165. 803219c: fa5f fb83 uxtb.w fp, r3
  59166. 80321a0: 46ca mov sl, r9
  59167. 80321a2: e007 b.n 80321b4 <etharp_find_entry+0x74>
  59168. age_pending = arp_table[i].ctime;
  59169. }
  59170. }
  59171. /* stable entry? */
  59172. } else if (state >= ETHARP_STATE_STABLE) {
  59173. 80321a4: d906 bls.n 80321b4 <etharp_find_entry+0x74>
  59174. /* don't record old_stable for static entries since they never expire */
  59175. if (state < ETHARP_STATE_STATIC)
  59176. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  59177. {
  59178. /* remember entry with oldest stable entry in oldest, its age in maxtime */
  59179. if (arp_table[i].ctime >= age_stable) {
  59180. 80321a6: f892 9013 ldrb.w r9, [r2, #19]
  59181. 80321aa: 45c1 cmp r9, r8
  59182. old_stable = i;
  59183. 80321ac: bf24 itt cs
  59184. 80321ae: fa5f fc83 uxtbcs.w ip, r3
  59185. 80321b2: 46c8 movcs r8, r9
  59186. * 4) remember the oldest pending entry with queued packets (if any)
  59187. * 5) search for a matching IP entry, either pending or stable
  59188. * until 5 matches, or all entries are searched for.
  59189. */
  59190. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  59191. 80321b4: 3301 adds r3, #1
  59192. 80321b6: b2db uxtb r3, r3
  59193. 80321b8: 3214 adds r2, #20
  59194. 80321ba: 2b0a cmp r3, #10
  59195. 80321bc: d1cd bne.n 803215a <etharp_find_entry+0x1a>
  59196. }
  59197. }
  59198. /* { we have no match } => try to create a new entry */
  59199. /* don't create new entry, only search? */
  59200. if (((flags & ETHARP_FLAG_FIND_ONLY) != 0) ||
  59201. 80321be: 9a01 ldr r2, [sp, #4]
  59202. 80321c0: f002 0302 and.w r3, r2, #2
  59203. 80321c4: b2db uxtb r3, r3
  59204. 80321c6: bb33 cbnz r3, 8032216 <etharp_find_entry+0xd6>
  59205. 80321c8: 2f0a cmp r7, #10
  59206. 80321ca: d102 bne.n 80321d2 <etharp_find_entry+0x92>
  59207. /* or no empty entry found and not allowed to recycle? */
  59208. ((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_FLAG_TRY_HARD) == 0))) {
  59209. 80321cc: 07d3 lsls r3, r2, #31
  59210. 80321ce: d402 bmi.n 80321d6 <etharp_find_entry+0x96>
  59211. 80321d0: e021 b.n 8032216 <etharp_find_entry+0xd6>
  59212. * { ETHARP_FLAG_TRY_HARD is set at this point }
  59213. */
  59214. /* 1) empty entry available? */
  59215. if (empty < ARP_TABLE_SIZE) {
  59216. i = empty;
  59217. 80321d2: b2fc uxtb r4, r7
  59218. 80321d4: e011 b.n 80321fa <etharp_find_entry+0xba>
  59219. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting empty entry %"U16_F"\n", (u16_t)i));
  59220. } else {
  59221. /* 2) found recyclable stable entry? */
  59222. if (old_stable < ARP_TABLE_SIZE) {
  59223. 80321d6: f1bc 0f0a cmp.w ip, #10
  59224. 80321da: d002 beq.n 80321e2 <etharp_find_entry+0xa2>
  59225. /* recycle oldest stable*/
  59226. i = old_stable;
  59227. 80321dc: fa5f f48c uxtb.w r4, ip
  59228. 80321e0: e008 b.n 80321f4 <etharp_find_entry+0xb4>
  59229. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest stable entry %"U16_F"\n", (u16_t)i));
  59230. /* no queued packets should exist on stable entries */
  59231. LWIP_ASSERT("arp_table[i].q == NULL", arp_table[i].q == NULL);
  59232. /* 3) found recyclable pending entry without queued packets? */
  59233. } else if (old_pending < ARP_TABLE_SIZE) {
  59234. 80321e2: f1bb 0f0a cmp.w fp, #10
  59235. 80321e6: d002 beq.n 80321ee <etharp_find_entry+0xae>
  59236. /* recycle oldest pending */
  59237. i = old_pending;
  59238. 80321e8: fa5f f48b uxtb.w r4, fp
  59239. 80321ec: e002 b.n 80321f4 <etharp_find_entry+0xb4>
  59240. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %"U16_F" (without queue)\n", (u16_t)i));
  59241. /* 4) found recyclable pending entry with queued packets? */
  59242. } else if (old_queue < ARP_TABLE_SIZE) {
  59243. 80321ee: 2c0a cmp r4, #10
  59244. 80321f0: d011 beq.n 8032216 <etharp_find_entry+0xd6>
  59245. /* recycle oldest pending (queued packets are free in etharp_free_entry) */
  59246. i = old_queue;
  59247. 80321f2: b2e4 uxtb r4, r4
  59248. return (s8_t)ERR_MEM;
  59249. }
  59250. /* { empty or recyclable entry found } */
  59251. LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE);
  59252. etharp_free_entry(i);
  59253. 80321f4: 4620 mov r0, r4
  59254. 80321f6: f7ff ff89 bl 803210c <etharp_free_entry>
  59255. 80321fa: 4b09 ldr r3, [pc, #36] ; (8032220 <etharp_find_entry+0xe0>)
  59256. LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE);
  59257. LWIP_ASSERT("arp_table[i].state == ETHARP_STATE_EMPTY",
  59258. arp_table[i].state == ETHARP_STATE_EMPTY);
  59259. /* IP address given? */
  59260. if (ipaddr != NULL) {
  59261. 80321fc: b126 cbz r6, 8032208 <etharp_find_entry+0xc8>
  59262. /* set IP address */
  59263. ip_addr_copy(arp_table[i].ipaddr, *ipaddr);
  59264. 80321fe: 2214 movs r2, #20
  59265. 8032200: 6831 ldr r1, [r6, #0]
  59266. 8032202: fb02 3204 mla r2, r2, r4, r3
  59267. 8032206: 6051 str r1, [r2, #4]
  59268. }
  59269. arp_table[i].ctime = 0;
  59270. 8032208: 2214 movs r2, #20
  59271. 803220a: fb02 3304 mla r3, r2, r4, r3
  59272. 803220e: 2200 movs r2, #0
  59273. 8032210: 74da strb r2, [r3, #19]
  59274. return (err_t)i;
  59275. 8032212: 4620 mov r0, r4
  59276. 8032214: e000 b.n 8032218 <etharp_find_entry+0xd8>
  59277. /* don't create new entry, only search? */
  59278. if (((flags & ETHARP_FLAG_FIND_ONLY) != 0) ||
  59279. /* or no empty entry found and not allowed to recycle? */
  59280. ((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_FLAG_TRY_HARD) == 0))) {
  59281. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: no empty entry found and not allowed to recycle\n"));
  59282. return (s8_t)ERR_MEM;
  59283. 8032216: 20ff movs r0, #255 ; 0xff
  59284. /* set IP address */
  59285. ip_addr_copy(arp_table[i].ipaddr, *ipaddr);
  59286. }
  59287. arp_table[i].ctime = 0;
  59288. return (err_t)i;
  59289. }
  59290. 8032218: b240 sxtb r0, r0
  59291. 803221a: e8bd 8ffe ldmia.w sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
  59292. 803221e: bf00 nop
  59293. 8032220: 2000e3c4 .word 0x2000e3c4
  59294. 08032224 <etharp_tmr>:
  59295. * This function should be called every ETHARP_TMR_INTERVAL milliseconds (5 seconds),
  59296. * in order to expire entries in the ARP table.
  59297. */
  59298. void
  59299. etharp_tmr(void)
  59300. {
  59301. 8032224: b570 push {r4, r5, r6, lr}
  59302. 8032226: 4c0d ldr r4, [pc, #52] ; (803225c <etharp_tmr+0x38>)
  59303. 8032228: 2500 movs r5, #0
  59304. etharp_free_entry(i);
  59305. }
  59306. else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING) {
  59307. /* Reset state to stable, so that the next transmitted packet will
  59308. re-send an ARP request. */
  59309. arp_table[i].state = ETHARP_STATE_STABLE;
  59310. 803222a: 2602 movs r6, #2
  59311. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n"));
  59312. /* remove expired entries from the ARP table */
  59313. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  59314. u8_t state = arp_table[i].state;
  59315. if (state != ETHARP_STATE_EMPTY
  59316. 803222c: 7ca3 ldrb r3, [r4, #18]
  59317. 803222e: b183 cbz r3, 8032252 <etharp_tmr+0x2e>
  59318. #if ETHARP_SUPPORT_STATIC_ENTRIES
  59319. && (state != ETHARP_STATE_STATIC)
  59320. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  59321. ) {
  59322. arp_table[i].ctime++;
  59323. 8032230: 7ce2 ldrb r2, [r4, #19]
  59324. 8032232: 3201 adds r2, #1
  59325. 8032234: b2d2 uxtb r2, r2
  59326. if ((arp_table[i].ctime >= ARP_MAXAGE) ||
  59327. 8032236: 2aef cmp r2, #239 ; 0xef
  59328. if (state != ETHARP_STATE_EMPTY
  59329. #if ETHARP_SUPPORT_STATIC_ENTRIES
  59330. && (state != ETHARP_STATE_STATIC)
  59331. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  59332. ) {
  59333. arp_table[i].ctime++;
  59334. 8032238: 74e2 strb r2, [r4, #19]
  59335. if ((arp_table[i].ctime >= ARP_MAXAGE) ||
  59336. 803223a: d803 bhi.n 8032244 <etharp_tmr+0x20>
  59337. 803223c: 2b01 cmp r3, #1
  59338. 803223e: d105 bne.n 803224c <etharp_tmr+0x28>
  59339. ((arp_table[i].state == ETHARP_STATE_PENDING) &&
  59340. 8032240: 2a01 cmp r2, #1
  59341. 8032242: d906 bls.n 8032252 <etharp_tmr+0x2e>
  59342. (arp_table[i].ctime >= ARP_MAXPENDING))) {
  59343. /* pending or stable entry has become old! */
  59344. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %"U16_F".\n",
  59345. arp_table[i].state >= ETHARP_STATE_STABLE ? "stable" : "pending", (u16_t)i));
  59346. /* clean up entries that have just been expired */
  59347. etharp_free_entry(i);
  59348. 8032244: 4628 mov r0, r5
  59349. 8032246: f7ff ff61 bl 803210c <etharp_free_entry>
  59350. 803224a: e002 b.n 8032252 <etharp_tmr+0x2e>
  59351. }
  59352. else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING) {
  59353. 803224c: 2b03 cmp r3, #3
  59354. /* Reset state to stable, so that the next transmitted packet will
  59355. re-send an ARP request. */
  59356. arp_table[i].state = ETHARP_STATE_STABLE;
  59357. 803224e: bf08 it eq
  59358. 8032250: 74a6 strbeq r6, [r4, #18]
  59359. 8032252: 3501 adds r5, #1
  59360. 8032254: 3414 adds r4, #20
  59361. {
  59362. u8_t i;
  59363. LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n"));
  59364. /* remove expired entries from the ARP table */
  59365. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  59366. 8032256: 2d0a cmp r5, #10
  59367. 8032258: d1e8 bne.n 803222c <etharp_tmr+0x8>
  59368. /* resend an ARP query here? */
  59369. }
  59370. #endif /* ARP_QUEUEING */
  59371. }
  59372. }
  59373. }
  59374. 803225a: bd70 pop {r4, r5, r6, pc}
  59375. 803225c: 2000e3c4 .word 0x2000e3c4
  59376. 08032260 <etharp_cleanup_netif>:
  59377. * Remove all ARP table entries of the specified netif.
  59378. *
  59379. * @param netif points to a network interface
  59380. */
  59381. void etharp_cleanup_netif(struct netif *netif)
  59382. {
  59383. 8032260: b570 push {r4, r5, r6, lr}
  59384. 8032262: 4d08 ldr r5, [pc, #32] ; (8032284 <etharp_cleanup_netif+0x24>)
  59385. 8032264: 4606 mov r6, r0
  59386. 8032266: 2400 movs r4, #0
  59387. u8_t i;
  59388. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  59389. u8_t state = arp_table[i].state;
  59390. if ((state != ETHARP_STATE_EMPTY) && (arp_table[i].netif == netif)) {
  59391. 8032268: 7cab ldrb r3, [r5, #18]
  59392. 803226a: b12b cbz r3, 8032278 <etharp_cleanup_netif+0x18>
  59393. 803226c: 68ab ldr r3, [r5, #8]
  59394. 803226e: 42b3 cmp r3, r6
  59395. 8032270: d102 bne.n 8032278 <etharp_cleanup_netif+0x18>
  59396. etharp_free_entry(i);
  59397. 8032272: 4620 mov r0, r4
  59398. 8032274: f7ff ff4a bl 803210c <etharp_free_entry>
  59399. 8032278: 3401 adds r4, #1
  59400. 803227a: 3514 adds r5, #20
  59401. */
  59402. void etharp_cleanup_netif(struct netif *netif)
  59403. {
  59404. u8_t i;
  59405. for (i = 0; i < ARP_TABLE_SIZE; ++i) {
  59406. 803227c: 2c0a cmp r4, #10
  59407. 803227e: d1f3 bne.n 8032268 <etharp_cleanup_netif+0x8>
  59408. u8_t state = arp_table[i].state;
  59409. if ((state != ETHARP_STATE_EMPTY) && (arp_table[i].netif == netif)) {
  59410. etharp_free_entry(i);
  59411. }
  59412. }
  59413. }
  59414. 8032280: bd70 pop {r4, r5, r6, pc}
  59415. 8032282: bf00 nop
  59416. 8032284: 2000e3c4 .word 0x2000e3c4
  59417. 08032288 <etharp_find_addr>:
  59418. * @return table index if found, -1 otherwise
  59419. */
  59420. s8_t
  59421. etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
  59422. struct eth_addr **eth_ret, ip_addr_t **ip_ret)
  59423. {
  59424. 8032288: b5f8 push {r3, r4, r5, r6, r7, lr}
  59425. LWIP_ASSERT("eth_ret != NULL && ip_ret != NULL",
  59426. eth_ret != NULL && ip_ret != NULL);
  59427. LWIP_UNUSED_ARG(netif);
  59428. i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY);
  59429. 803228a: 4608 mov r0, r1
  59430. 803228c: 2102 movs r1, #2
  59431. * @return table index if found, -1 otherwise
  59432. */
  59433. s8_t
  59434. etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
  59435. struct eth_addr **eth_ret, ip_addr_t **ip_ret)
  59436. {
  59437. 803228e: 4616 mov r6, r2
  59438. 8032290: 461f mov r7, r3
  59439. LWIP_ASSERT("eth_ret != NULL && ip_ret != NULL",
  59440. eth_ret != NULL && ip_ret != NULL);
  59441. LWIP_UNUSED_ARG(netif);
  59442. i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY);
  59443. 8032292: f7ff ff55 bl 8032140 <etharp_find_entry>
  59444. if((i >= 0) && (arp_table[i].state >= ETHARP_STATE_STABLE)) {
  59445. 8032296: 2800 cmp r0, #0
  59446. 8032298: db0c blt.n 80322b4 <etharp_find_addr+0x2c>
  59447. 803229a: 2414 movs r4, #20
  59448. 803229c: 4d07 ldr r5, [pc, #28] ; (80322bc <etharp_find_addr+0x34>)
  59449. 803229e: 4344 muls r4, r0
  59450. 80322a0: 1929 adds r1, r5, r4
  59451. 80322a2: 7c8b ldrb r3, [r1, #18]
  59452. 80322a4: 2b01 cmp r3, #1
  59453. 80322a6: d905 bls.n 80322b4 <etharp_find_addr+0x2c>
  59454. *eth_ret = &arp_table[i].ethaddr;
  59455. 80322a8: 460c mov r4, r1
  59456. 80322aa: 340c adds r4, #12
  59457. *ip_ret = &arp_table[i].ipaddr;
  59458. 80322ac: 3104 adds r1, #4
  59459. LWIP_UNUSED_ARG(netif);
  59460. i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY);
  59461. if((i >= 0) && (arp_table[i].state >= ETHARP_STATE_STABLE)) {
  59462. *eth_ret = &arp_table[i].ethaddr;
  59463. 80322ae: 6034 str r4, [r6, #0]
  59464. *ip_ret = &arp_table[i].ipaddr;
  59465. 80322b0: 6039 str r1, [r7, #0]
  59466. return i;
  59467. 80322b2: e000 b.n 80322b6 <etharp_find_addr+0x2e>
  59468. }
  59469. return -1;
  59470. 80322b4: 20ff movs r0, #255 ; 0xff
  59471. }
  59472. 80322b6: b240 sxtb r0, r0
  59473. 80322b8: bdf8 pop {r3, r4, r5, r6, r7, pc}
  59474. 80322ba: bf00 nop
  59475. 80322bc: 2000e3c4 .word 0x2000e3c4
  59476. 080322c0 <etharp_request>:
  59477. * ERR_MEM if the ARP packet couldn't be allocated
  59478. * any other err_t on failure
  59479. */
  59480. err_t
  59481. etharp_request(struct netif *netif, ip_addr_t *ipaddr)
  59482. {
  59483. 80322c0: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  59484. #endif /* LWIP_AUTOIP */
  59485. LWIP_ASSERT("netif != NULL", netif != NULL);
  59486. /* allocate a pbuf for the outgoing ARP request packet */
  59487. p = pbuf_alloc(PBUF_RAW, SIZEOF_ETHARP_PACKET, PBUF_RAM);
  59488. 80322c4: 2200 movs r2, #0
  59489. * ERR_MEM if the ARP packet couldn't be allocated
  59490. * any other err_t on failure
  59491. */
  59492. err_t
  59493. etharp_request(struct netif *netif, ip_addr_t *ipaddr)
  59494. {
  59495. 80322c6: 4606 mov r6, r0
  59496. 80322c8: 4688 mov r8, r1
  59497. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_request: sending ARP request.\n"));
  59498. return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, &ethbroadcast,
  59499. (struct eth_addr *)netif->hwaddr, &netif->ip_addr, &ethzero,
  59500. 80322ca: f100 0727 add.w r7, r0, #39 ; 0x27
  59501. 80322ce: f100 0904 add.w r9, r0, #4
  59502. #endif /* LWIP_AUTOIP */
  59503. LWIP_ASSERT("netif != NULL", netif != NULL);
  59504. /* allocate a pbuf for the outgoing ARP request packet */
  59505. p = pbuf_alloc(PBUF_RAW, SIZEOF_ETHARP_PACKET, PBUF_RAM);
  59506. 80322d2: 212a movs r1, #42 ; 0x2a
  59507. 80322d4: 2003 movs r0, #3
  59508. 80322d6: f7f9 f808 bl 802b2ea <pbuf_alloc>
  59509. /* could allocate a pbuf for an ARP request? */
  59510. if (p == NULL) {
  59511. 80322da: 4605 mov r5, r0
  59512. 80322dc: 2800 cmp r0, #0
  59513. 80322de: d03c beq.n 803235a <etharp_request+0x9a>
  59514. return ERR_MEM;
  59515. }
  59516. LWIP_ASSERT("check that first pbuf can hold struct etharp_hdr",
  59517. (p->len >= SIZEOF_ETHARP_PACKET));
  59518. ethhdr = (struct eth_hdr *)p->payload;
  59519. 80322e0: 6844 ldr r4, [r0, #4]
  59520. hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR);
  59521. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_raw: sending raw ARP packet.\n"));
  59522. hdr->opcode = htons(opcode);
  59523. 80322e2: 2001 movs r0, #1
  59524. 80322e4: f7f7 fe76 bl 8029fd4 <lwip_htons>
  59525. * 'sender IP address' MUST be sent using link-layer broadcast instead of
  59526. * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */
  59527. ethdst_hwaddr = ip_addr_islinklocal(ipsrc_addr) ? (u8_t*)(ethbroadcast.addr) : ethdst_addr->addr;
  59528. #endif /* LWIP_AUTOIP */
  59529. /* Write the ARP MAC-Addresses */
  59530. ETHADDR16_COPY(&hdr->shwaddr, hwsrc_addr);
  59531. 80322e8: 4639 mov r1, r7
  59532. (p->len >= SIZEOF_ETHARP_PACKET));
  59533. ethhdr = (struct eth_hdr *)p->payload;
  59534. hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR);
  59535. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_raw: sending raw ARP packet.\n"));
  59536. hdr->opcode = htons(opcode);
  59537. 80322ea: 82a0 strh r0, [r4, #20]
  59538. * 'sender IP address' MUST be sent using link-layer broadcast instead of
  59539. * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */
  59540. ethdst_hwaddr = ip_addr_islinklocal(ipsrc_addr) ? (u8_t*)(ethbroadcast.addr) : ethdst_addr->addr;
  59541. #endif /* LWIP_AUTOIP */
  59542. /* Write the ARP MAC-Addresses */
  59543. ETHADDR16_COPY(&hdr->shwaddr, hwsrc_addr);
  59544. 80322ec: 2206 movs r2, #6
  59545. 80322ee: f104 0016 add.w r0, r4, #22
  59546. 80322f2: f7ef f9a7 bl 8021644 <memcpy>
  59547. ETHADDR16_COPY(&hdr->dhwaddr, hwdst_addr);
  59548. 80322f6: 2206 movs r2, #6
  59549. 80322f8: f104 0020 add.w r0, r4, #32
  59550. 80322fc: 4919 ldr r1, [pc, #100] ; (8032364 <etharp_request+0xa4>)
  59551. 80322fe: f7ef f9a1 bl 8021644 <memcpy>
  59552. /* Write the Ethernet MAC-Addresses */
  59553. #if LWIP_AUTOIP
  59554. ETHADDR16_COPY(&ethhdr->dest, ethdst_hwaddr);
  59555. #else /* LWIP_AUTOIP */
  59556. ETHADDR16_COPY(&ethhdr->dest, ethdst_addr);
  59557. 8032302: 2206 movs r2, #6
  59558. 8032304: 4620 mov r0, r4
  59559. 8032306: 4918 ldr r1, [pc, #96] ; (8032368 <etharp_request+0xa8>)
  59560. 8032308: f7ef f99c bl 8021644 <memcpy>
  59561. #endif /* LWIP_AUTOIP */
  59562. ETHADDR16_COPY(&ethhdr->src, ethsrc_addr);
  59563. 803230c: 1da0 adds r0, r4, #6
  59564. 803230e: 4639 mov r1, r7
  59565. 8032310: 2206 movs r2, #6
  59566. 8032312: f7ef f997 bl 8021644 <memcpy>
  59567. /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without
  59568. * structure packing. */
  59569. IPADDR2_COPY(&hdr->sipaddr, ipsrc_addr);
  59570. 8032316: 4649 mov r1, r9
  59571. 8032318: 2204 movs r2, #4
  59572. 803231a: f104 001c add.w r0, r4, #28
  59573. 803231e: f7ef f991 bl 8021644 <memcpy>
  59574. IPADDR2_COPY(&hdr->dipaddr, ipdst_addr);
  59575. 8032322: 4641 mov r1, r8
  59576. 8032324: 2204 movs r2, #4
  59577. 8032326: f104 0026 add.w r0, r4, #38 ; 0x26
  59578. 803232a: f7ef f98b bl 8021644 <memcpy>
  59579. hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET);
  59580. 803232e: 2300 movs r3, #0
  59581. 8032330: 2201 movs r2, #1
  59582. 8032332: 73a3 strb r3, [r4, #14]
  59583. 8032334: 73e2 strb r2, [r4, #15]
  59584. hdr->proto = PP_HTONS(ETHTYPE_IP);
  59585. 8032336: 7463 strb r3, [r4, #17]
  59586. 8032338: 2208 movs r2, #8
  59587. /* set hwlen and protolen */
  59588. hdr->hwlen = ETHARP_HWADDR_LEN;
  59589. 803233a: 2306 movs r3, #6
  59590. hdr->protolen = sizeof(ip_addr_t);
  59591. 803233c: 2104 movs r1, #4
  59592. * structure packing. */
  59593. IPADDR2_COPY(&hdr->sipaddr, ipsrc_addr);
  59594. IPADDR2_COPY(&hdr->dipaddr, ipdst_addr);
  59595. hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET);
  59596. hdr->proto = PP_HTONS(ETHTYPE_IP);
  59597. 803233e: 7422 strb r2, [r4, #16]
  59598. /* set hwlen and protolen */
  59599. hdr->hwlen = ETHARP_HWADDR_LEN;
  59600. hdr->protolen = sizeof(ip_addr_t);
  59601. 8032340: 74e1 strb r1, [r4, #19]
  59602. ethhdr->type = PP_HTONS(ETHTYPE_ARP);
  59603. 8032342: 7322 strb r2, [r4, #12]
  59604. IPADDR2_COPY(&hdr->dipaddr, ipdst_addr);
  59605. hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET);
  59606. hdr->proto = PP_HTONS(ETHTYPE_IP);
  59607. /* set hwlen and protolen */
  59608. hdr->hwlen = ETHARP_HWADDR_LEN;
  59609. 8032344: 74a3 strb r3, [r4, #18]
  59610. hdr->protolen = sizeof(ip_addr_t);
  59611. ethhdr->type = PP_HTONS(ETHTYPE_ARP);
  59612. 8032346: 7363 strb r3, [r4, #13]
  59613. /* send ARP query */
  59614. result = netif->linkoutput(netif, p);
  59615. 8032348: 69b3 ldr r3, [r6, #24]
  59616. 803234a: 4630 mov r0, r6
  59617. 803234c: 4629 mov r1, r5
  59618. 803234e: 4798 blx r3
  59619. 8032350: 4604 mov r4, r0
  59620. ETHARP_STATS_INC(etharp.xmit);
  59621. /* free ARP query packet */
  59622. pbuf_free(p);
  59623. 8032352: 4628 mov r0, r5
  59624. 8032354: f7f8 ff7c bl 802b250 <pbuf_free>
  59625. 8032358: e000 b.n 803235c <etharp_request+0x9c>
  59626. /* could allocate a pbuf for an ARP request? */
  59627. if (p == NULL) {
  59628. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  59629. ("etharp_raw: could not allocate pbuf for ARP request.\n"));
  59630. ETHARP_STATS_INC(etharp.memerr);
  59631. return ERR_MEM;
  59632. 803235a: 24ff movs r4, #255 ; 0xff
  59633. {
  59634. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_request: sending ARP request.\n"));
  59635. return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, &ethbroadcast,
  59636. (struct eth_addr *)netif->hwaddr, &netif->ip_addr, &ethzero,
  59637. ipaddr, ARP_REQUEST);
  59638. }
  59639. 803235c: b260 sxtb r0, r4
  59640. 803235e: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
  59641. 8032362: bf00 nop
  59642. 8032364: 0803b531 .word 0x0803b531
  59643. 8032368: 0803b52b .word 0x0803b52b
  59644. 0803236c <etharp_query>:
  59645. * - ERR_ARG Non-unicast address given, those will not appear in ARP cache.
  59646. *
  59647. */
  59648. err_t
  59649. etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)
  59650. {
  59651. 803236c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  59652. 8032370: 4607 mov r7, r0
  59653. 8032372: 460e mov r6, r1
  59654. struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
  59655. err_t result = ERR_MEM;
  59656. s8_t i; /* ARP entry index */
  59657. /* non-unicast address? */
  59658. if (ip_addr_isbroadcast(ipaddr, netif) ||
  59659. 8032374: 6808 ldr r0, [r1, #0]
  59660. 8032376: 4639 mov r1, r7
  59661. * - ERR_ARG Non-unicast address given, those will not appear in ARP cache.
  59662. *
  59663. */
  59664. err_t
  59665. etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)
  59666. {
  59667. 8032378: 4615 mov r5, r2
  59668. struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
  59669. err_t result = ERR_MEM;
  59670. s8_t i; /* ARP entry index */
  59671. /* non-unicast address? */
  59672. if (ip_addr_isbroadcast(ipaddr, netif) ||
  59673. 803237a: f7fb fe03 bl 802df84 <ip4_addr_isbroadcast>
  59674. 803237e: 2800 cmp r0, #0
  59675. 8032380: d157 bne.n 8032432 <etharp_query+0xc6>
  59676. ip_addr_ismulticast(ipaddr) ||
  59677. 8032382: 6833 ldr r3, [r6, #0]
  59678. 8032384: f003 02f0 and.w r2, r3, #240 ; 0xf0
  59679. struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
  59680. err_t result = ERR_MEM;
  59681. s8_t i; /* ARP entry index */
  59682. /* non-unicast address? */
  59683. if (ip_addr_isbroadcast(ipaddr, netif) ||
  59684. 8032388: 2ae0 cmp r2, #224 ; 0xe0
  59685. 803238a: d052 beq.n 8032432 <etharp_query+0xc6>
  59686. ip_addr_ismulticast(ipaddr) ||
  59687. ip_addr_isany(ipaddr)) {
  59688. 803238c: 2b00 cmp r3, #0
  59689. 803238e: d050 beq.n 8032432 <etharp_query+0xc6>
  59690. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: will not add non-unicast IP address to ARP cache\n"));
  59691. return ERR_ARG;
  59692. }
  59693. /* find entry in ARP cache, ask to create entry if queueing packet */
  59694. i = etharp_find_entry(ipaddr, ETHARP_FLAG_TRY_HARD);
  59695. 8032390: 2101 movs r1, #1
  59696. 8032392: 4630 mov r0, r6
  59697. 8032394: f7ff fed4 bl 8032140 <etharp_find_entry>
  59698. /* could not find or create entry? */
  59699. if (i < 0) {
  59700. 8032398: 1e04 subs r4, r0, #0
  59701. 803239a: db4f blt.n 803243c <etharp_query+0xd0>
  59702. }
  59703. return (err_t)i;
  59704. }
  59705. /* mark a fresh entry as pending (we just sent a request) */
  59706. if (arp_table[i].state == ETHARP_STATE_EMPTY) {
  59707. 803239c: 4931 ldr r1, [pc, #196] ; (8032464 <etharp_query+0xf8>)
  59708. 803239e: 2214 movs r2, #20
  59709. 80323a0: fb02 1304 mla r3, r2, r4, r1
  59710. 80323a4: 3310 adds r3, #16
  59711. 80323a6: 7898 ldrb r0, [r3, #2]
  59712. 80323a8: b908 cbnz r0, 80323ae <etharp_query+0x42>
  59713. arp_table[i].state = ETHARP_STATE_PENDING;
  59714. 80323aa: 2001 movs r0, #1
  59715. 80323ac: 7098 strb r0, [r3, #2]
  59716. LWIP_ASSERT("arp_table[i].state == PENDING or STABLE",
  59717. ((arp_table[i].state == ETHARP_STATE_PENDING) ||
  59718. (arp_table[i].state >= ETHARP_STATE_STABLE)));
  59719. /* do we have a pending entry? or an implicit query request? */
  59720. if ((arp_table[i].state == ETHARP_STATE_PENDING) || (q == NULL)) {
  59721. 80323ae: fb02 1204 mla r2, r2, r4, r1
  59722. 80323b2: 7c93 ldrb r3, [r2, #18]
  59723. 80323b4: 2b01 cmp r3, #1
  59724. 80323b6: d000 beq.n 80323ba <etharp_query+0x4e>
  59725. 80323b8: b935 cbnz r5, 80323c8 <etharp_query+0x5c>
  59726. /* try to resolve it; send out ARP request */
  59727. result = etharp_request(netif, ipaddr);
  59728. 80323ba: 4638 mov r0, r7
  59729. 80323bc: 4631 mov r1, r6
  59730. 80323be: f7ff ff7f bl 80322c0 <etharp_request>
  59731. 80323c2: 4602 mov r2, r0
  59732. /* ARP request couldn't be sent */
  59733. /* We don't re-send arp request in etharp_tmr, but we still queue packets,
  59734. since this failure could be temporary, and the next packet calling
  59735. etharp_query again could lead to sending the queued packets. */
  59736. }
  59737. if (q == NULL) {
  59738. 80323c4: b90d cbnz r5, 80323ca <etharp_query+0x5e>
  59739. 80323c6: e036 b.n 8032436 <etharp_query+0xca>
  59740. */
  59741. err_t
  59742. etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)
  59743. {
  59744. struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
  59745. err_t result = ERR_MEM;
  59746. 80323c8: 22ff movs r2, #255 ; 0xff
  59747. }
  59748. /* packet given? */
  59749. LWIP_ASSERT("q != NULL", q != NULL);
  59750. /* stable entry? */
  59751. if (arp_table[i].state >= ETHARP_STATE_STABLE) {
  59752. 80323ca: 2314 movs r3, #20
  59753. 80323cc: 4925 ldr r1, [pc, #148] ; (8032464 <etharp_query+0xf8>)
  59754. 80323ce: 4363 muls r3, r4
  59755. 80323d0: 18c8 adds r0, r1, r3
  59756. 80323d2: 7c80 ldrb r0, [r0, #18]
  59757. 80323d4: 2801 cmp r0, #1
  59758. 80323d6: d90b bls.n 80323f0 <etharp_query+0x84>
  59759. /* we have a valid IP->Ethernet address mapping */
  59760. ETHARP_SET_HINT(netif, i);
  59761. 80323d8: 4a23 ldr r2, [pc, #140] ; (8032468 <etharp_query+0xfc>)
  59762. /* send the packet */
  59763. result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr));
  59764. 80323da: 18cb adds r3, r1, r3
  59765. /* packet given? */
  59766. LWIP_ASSERT("q != NULL", q != NULL);
  59767. /* stable entry? */
  59768. if (arp_table[i].state >= ETHARP_STATE_STABLE) {
  59769. /* we have a valid IP->Ethernet address mapping */
  59770. ETHARP_SET_HINT(netif, i);
  59771. 80323dc: 7014 strb r4, [r2, #0]
  59772. /* send the packet */
  59773. result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr));
  59774. 80323de: 4638 mov r0, r7
  59775. 80323e0: 4629 mov r1, r5
  59776. 80323e2: f107 0227 add.w r2, r7, #39 ; 0x27
  59777. 80323e6: 330c adds r3, #12
  59778. 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));
  59779. result = ERR_MEM;
  59780. }
  59781. }
  59782. return result;
  59783. }
  59784. 80323e8: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  59785. /* stable entry? */
  59786. if (arp_table[i].state >= ETHARP_STATE_STABLE) {
  59787. /* we have a valid IP->Ethernet address mapping */
  59788. ETHARP_SET_HINT(netif, i);
  59789. /* send the packet */
  59790. result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr));
  59791. 80323ec: f7ff be76 b.w 80320dc <etharp_send_ip>
  59792. /* pending entry? (either just created or already pending */
  59793. } else if (arp_table[i].state == ETHARP_STATE_PENDING) {
  59794. 80323f0: d123 bne.n 803243a <etharp_query+0xce>
  59795. 80323f2: 462b mov r3, r5
  59796. 80323f4: e003 b.n 80323fe <etharp_query+0x92>
  59797. * to copy the whole queue into a new PBUF_RAM (see bug #11400)
  59798. * PBUF_ROMs can be left as they are, since ROM must not get changed. */
  59799. p = q;
  59800. while (p) {
  59801. LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == 0));
  59802. if(p->type != PBUF_ROM) {
  59803. 80323f6: 7b1a ldrb r2, [r3, #12]
  59804. 80323f8: 2a01 cmp r2, #1
  59805. 80323fa: d128 bne.n 803244e <etharp_query+0xe2>
  59806. copy_needed = 1;
  59807. break;
  59808. }
  59809. p = p->next;
  59810. 80323fc: 681b ldr r3, [r3, #0]
  59811. int copy_needed = 0;
  59812. /* IF q includes a PBUF_REF, PBUF_POOL or PBUF_RAM, we have no choice but
  59813. * to copy the whole queue into a new PBUF_RAM (see bug #11400)
  59814. * PBUF_ROMs can be left as they are, since ROM must not get changed. */
  59815. p = q;
  59816. while (p) {
  59817. 80323fe: 2b00 cmp r3, #0
  59818. 8032400: d1f9 bne.n 80323f6 <etharp_query+0x8a>
  59819. 8032402: e01e b.n 8032442 <etharp_query+0xd6>
  59820. }
  59821. if(copy_needed) {
  59822. /* copy the whole packet into new pbufs */
  59823. p = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
  59824. if(p != NULL) {
  59825. if (pbuf_copy(p, q) != ERR_OK) {
  59826. 8032404: 4629 mov r1, r5
  59827. 8032406: f7f9 f827 bl 802b458 <pbuf_copy>
  59828. 803240a: b120 cbz r0, 8032416 <etharp_query+0xaa>
  59829. pbuf_free(p);
  59830. 803240c: 4630 mov r0, r6
  59831. 803240e: f7f8 ff1f bl 802b250 <pbuf_free>
  59832. 8032412: e024 b.n 803245e <etharp_query+0xf2>
  59833. /* referencing the old pbuf is enough */
  59834. p = q;
  59835. pbuf_ref(p);
  59836. }
  59837. /* packet could be taken over? */
  59838. if (p != NULL) {
  59839. 8032414: 462e mov r6, r5
  59840. 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));
  59841. result = ERR_MEM;
  59842. }
  59843. #else /* ARP_QUEUEING */
  59844. /* always queue one packet per ARP request only, freeing a previously queued packet */
  59845. if (arp_table[i].q != NULL) {
  59846. 8032416: 2314 movs r3, #20
  59847. 8032418: 4a12 ldr r2, [pc, #72] ; (8032464 <etharp_query+0xf8>)
  59848. 803241a: fb03 f104 mul.w r1, r3, r4
  59849. 803241e: 4615 mov r5, r2
  59850. 8032420: 5850 ldr r0, [r2, r1]
  59851. 8032422: 461f mov r7, r3
  59852. 8032424: b108 cbz r0, 803242a <etharp_query+0xbe>
  59853. 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));
  59854. pbuf_free(arp_table[i].q);
  59855. 8032426: f7f8 ff13 bl 802b250 <pbuf_free>
  59856. }
  59857. arp_table[i].q = p;
  59858. 803242a: 437c muls r4, r7
  59859. 803242c: 512e str r6, [r5, r4]
  59860. result = ERR_OK;
  59861. 803242e: 2400 movs r4, #0
  59862. 8032430: e004 b.n 803243c <etharp_query+0xd0>
  59863. /* non-unicast address? */
  59864. if (ip_addr_isbroadcast(ipaddr, netif) ||
  59865. ip_addr_ismulticast(ipaddr) ||
  59866. ip_addr_isany(ipaddr)) {
  59867. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: will not add non-unicast IP address to ARP cache\n"));
  59868. return ERR_ARG;
  59869. 8032432: 24f2 movs r4, #242 ; 0xf2
  59870. 8032434: e002 b.n 803243c <etharp_query+0xd0>
  59871. /* We don't re-send arp request in etharp_tmr, but we still queue packets,
  59872. since this failure could be temporary, and the next packet calling
  59873. etharp_query again could lead to sending the queued packets. */
  59874. }
  59875. if (q == NULL) {
  59876. return result;
  59877. 8032436: 4604 mov r4, r0
  59878. 8032438: e000 b.n 803243c <etharp_query+0xd0>
  59879. /* we have a valid IP->Ethernet address mapping */
  59880. ETHARP_SET_HINT(netif, i);
  59881. /* send the packet */
  59882. result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr));
  59883. /* pending entry? (either just created or already pending */
  59884. } else if (arp_table[i].state == ETHARP_STATE_PENDING) {
  59885. 803243a: 4614 mov r4, r2
  59886. 803243c: b260 sxtb r0, r4
  59887. 803243e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
  59888. }
  59889. }
  59890. } else {
  59891. /* referencing the old pbuf is enough */
  59892. p = q;
  59893. pbuf_ref(p);
  59894. 8032442: 4628 mov r0, r5
  59895. 8032444: f7f8 ffe1 bl 802b40a <pbuf_ref>
  59896. }
  59897. /* packet could be taken over? */
  59898. if (p != NULL) {
  59899. 8032448: 2d00 cmp r5, #0
  59900. 803244a: d1e3 bne.n 8032414 <etharp_query+0xa8>
  59901. 803244c: e007 b.n 803245e <etharp_query+0xf2>
  59902. }
  59903. p = p->next;
  59904. }
  59905. if(copy_needed) {
  59906. /* copy the whole packet into new pbufs */
  59907. p = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
  59908. 803244e: 2003 movs r0, #3
  59909. 8032450: 8919 ldrh r1, [r3, #8]
  59910. 8032452: 2200 movs r2, #0
  59911. 8032454: f7f8 ff49 bl 802b2ea <pbuf_alloc>
  59912. if(p != NULL) {
  59913. 8032458: 4606 mov r6, r0
  59914. 803245a: 2800 cmp r0, #0
  59915. 803245c: d1d2 bne.n 8032404 <etharp_query+0x98>
  59916. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i));
  59917. #endif /* ARP_QUEUEING */
  59918. } else {
  59919. ETHARP_STATS_INC(etharp.memerr);
  59920. 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));
  59921. result = ERR_MEM;
  59922. 803245e: 24ff movs r4, #255 ; 0xff
  59923. 8032460: e7ec b.n 803243c <etharp_query+0xd0>
  59924. 8032462: bf00 nop
  59925. 8032464: 2000e3c4 .word 0x2000e3c4
  59926. 8032468: 2000e3c0 .word 0x2000e3c0
  59927. 0803246c <etharp_output_to_arp_index>:
  59928. /** Just a small helper function that sends a pbuf to an ethernet address
  59929. * in the arp_table specified by the index 'arp_idx'.
  59930. */
  59931. static err_t
  59932. etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
  59933. {
  59934. 803246c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
  59935. LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
  59936. arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
  59937. /* if arp table entry is about to expire: re-request it,
  59938. but only if its state is ETHARP_STATE_STABLE to prevent flooding the
  59939. network with ARP requests if this address is used frequently. */
  59940. if ((arp_table[arp_idx].state == ETHARP_STATE_STABLE) &&
  59941. 8032470: 4b10 ldr r3, [pc, #64] ; (80324b4 <etharp_output_to_arp_index+0x48>)
  59942. /** Just a small helper function that sends a pbuf to an ethernet address
  59943. * in the arp_table specified by the index 'arp_idx'.
  59944. */
  59945. static err_t
  59946. etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
  59947. {
  59948. 8032472: 4615 mov r5, r2
  59949. LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
  59950. arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
  59951. /* if arp table entry is about to expire: re-request it,
  59952. but only if its state is ETHARP_STATE_STABLE to prevent flooding the
  59953. network with ARP requests if this address is used frequently. */
  59954. if ((arp_table[arp_idx].state == ETHARP_STATE_STABLE) &&
  59955. 8032474: 2214 movs r2, #20
  59956. /** Just a small helper function that sends a pbuf to an ethernet address
  59957. * in the arp_table specified by the index 'arp_idx'.
  59958. */
  59959. static err_t
  59960. etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
  59961. {
  59962. 8032476: 460e mov r6, r1
  59963. LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
  59964. arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
  59965. /* if arp table entry is about to expire: re-request it,
  59966. but only if its state is ETHARP_STATE_STABLE to prevent flooding the
  59967. network with ARP requests if this address is used frequently. */
  59968. if ((arp_table[arp_idx].state == ETHARP_STATE_STABLE) &&
  59969. 8032478: fb02 3105 mla r1, r2, r5, r3
  59970. /** Just a small helper function that sends a pbuf to an ethernet address
  59971. * in the arp_table specified by the index 'arp_idx'.
  59972. */
  59973. static err_t
  59974. etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
  59975. {
  59976. 803247c: 4607 mov r7, r0
  59977. LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
  59978. arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
  59979. /* if arp table entry is about to expire: re-request it,
  59980. but only if its state is ETHARP_STATE_STABLE to prevent flooding the
  59981. network with ARP requests if this address is used frequently. */
  59982. if ((arp_table[arp_idx].state == ETHARP_STATE_STABLE) &&
  59983. 803247e: 7c8a ldrb r2, [r1, #18]
  59984. 8032480: 2a02 cmp r2, #2
  59985. 8032482: f101 0410 add.w r4, r1, #16
  59986. 8032486: d108 bne.n 803249a <etharp_output_to_arp_index+0x2e>
  59987. 8032488: 7cca ldrb r2, [r1, #19]
  59988. 803248a: 2ae3 cmp r2, #227 ; 0xe3
  59989. 803248c: d905 bls.n 803249a <etharp_output_to_arp_index+0x2e>
  59990. (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED)) {
  59991. if (etharp_request(netif, &arp_table[arp_idx].ipaddr) == ERR_OK) {
  59992. 803248e: 3104 adds r1, #4
  59993. 8032490: f7ff ff16 bl 80322c0 <etharp_request>
  59994. 8032494: b908 cbnz r0, 803249a <etharp_output_to_arp_index+0x2e>
  59995. arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING;
  59996. 8032496: 2303 movs r3, #3
  59997. 8032498: 70a3 strb r3, [r4, #2]
  59998. }
  59999. }
  60000. return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr),
  60001. 803249a: 4b06 ldr r3, [pc, #24] ; (80324b4 <etharp_output_to_arp_index+0x48>)
  60002. 803249c: 2214 movs r2, #20
  60003. 803249e: fb02 3305 mla r3, r2, r5, r3
  60004. 80324a2: 4638 mov r0, r7
  60005. 80324a4: 4631 mov r1, r6
  60006. 80324a6: f107 0227 add.w r2, r7, #39 ; 0x27
  60007. 80324aa: 330c adds r3, #12
  60008. &arp_table[arp_idx].ethaddr);
  60009. }
  60010. 80324ac: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr}
  60011. if (etharp_request(netif, &arp_table[arp_idx].ipaddr) == ERR_OK) {
  60012. arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING;
  60013. }
  60014. }
  60015. return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr),
  60016. 80324b0: f7ff be14 b.w 80320dc <etharp_send_ip>
  60017. 80324b4: 2000e3c4 .word 0x2000e3c4
  60018. 080324b8 <etharp_output>:
  60019. * - ERR_RTE No route to destination (no gateway to external networks),
  60020. * or the return type of either etharp_query() or etharp_send_ip().
  60021. */
  60022. err_t
  60023. etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)
  60024. {
  60025. 80324b8: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
  60026. 80324ba: 4604 mov r4, r0
  60027. 80324bc: 460e mov r6, r1
  60028. LWIP_ASSERT("netif != NULL", netif != NULL);
  60029. LWIP_ASSERT("q != NULL", q != NULL);
  60030. LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL);
  60031. /* make room for Ethernet header - should not fail */
  60032. if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) {
  60033. 80324be: 4608 mov r0, r1
  60034. 80324c0: 210e movs r1, #14
  60035. * - ERR_RTE No route to destination (no gateway to external networks),
  60036. * or the return type of either etharp_query() or etharp_send_ip().
  60037. */
  60038. err_t
  60039. etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)
  60040. {
  60041. 80324c2: 4615 mov r5, r2
  60042. LWIP_ASSERT("netif != NULL", netif != NULL);
  60043. LWIP_ASSERT("q != NULL", q != NULL);
  60044. LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL);
  60045. /* make room for Ethernet header - should not fail */
  60046. if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) {
  60047. 80324c4: f7f8 fe99 bl 802b1fa <pbuf_header>
  60048. 80324c8: 2800 cmp r0, #0
  60049. 80324ca: d163 bne.n 8032594 <etharp_output+0xdc>
  60050. /* Determine on destination hardware address. Broadcasts and multicasts
  60051. * are special, other IP addresses are looked up in the ARP table. */
  60052. /* broadcast destination IP address? */
  60053. if (ip_addr_isbroadcast(ipaddr, netif)) {
  60054. 80324cc: 6828 ldr r0, [r5, #0]
  60055. 80324ce: 4621 mov r1, r4
  60056. 80324d0: f7fb fd58 bl 802df84 <ip4_addr_isbroadcast>
  60057. 80324d4: 2800 cmp r0, #0
  60058. 80324d6: d155 bne.n 8032584 <etharp_output+0xcc>
  60059. /* broadcast on Ethernet also */
  60060. dest = (struct eth_addr *)&ethbroadcast;
  60061. /* multicast destination IP address? */
  60062. } else if (ip_addr_ismulticast(ipaddr)) {
  60063. 80324d8: 682b ldr r3, [r5, #0]
  60064. 80324da: f003 02f0 and.w r2, r3, #240 ; 0xf0
  60065. 80324de: 2ae0 cmp r2, #224 ; 0xe0
  60066. 80324e0: d114 bne.n 803250c <etharp_output+0x54>
  60067. /* Hash IP multicast address to MAC address.*/
  60068. mcastaddr.addr[0] = LL_MULTICAST_ADDR_0;
  60069. 80324e2: 2301 movs r3, #1
  60070. 80324e4: f88d 3000 strb.w r3, [sp]
  60071. mcastaddr.addr[1] = LL_MULTICAST_ADDR_1;
  60072. mcastaddr.addr[2] = LL_MULTICAST_ADDR_2;
  60073. 80324e8: 235e movs r3, #94 ; 0x5e
  60074. 80324ea: f88d 3002 strb.w r3, [sp, #2]
  60075. mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f;
  60076. 80324ee: 786b ldrb r3, [r5, #1]
  60077. dest = (struct eth_addr *)&ethbroadcast;
  60078. /* multicast destination IP address? */
  60079. } else if (ip_addr_ismulticast(ipaddr)) {
  60080. /* Hash IP multicast address to MAC address.*/
  60081. mcastaddr.addr[0] = LL_MULTICAST_ADDR_0;
  60082. mcastaddr.addr[1] = LL_MULTICAST_ADDR_1;
  60083. 80324f0: f88d 0001 strb.w r0, [sp, #1]
  60084. mcastaddr.addr[2] = LL_MULTICAST_ADDR_2;
  60085. mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f;
  60086. 80324f4: f003 037f and.w r3, r3, #127 ; 0x7f
  60087. 80324f8: f88d 3003 strb.w r3, [sp, #3]
  60088. mcastaddr.addr[4] = ip4_addr3(ipaddr);
  60089. 80324fc: 78ab ldrb r3, [r5, #2]
  60090. 80324fe: f88d 3004 strb.w r3, [sp, #4]
  60091. mcastaddr.addr[5] = ip4_addr4(ipaddr);
  60092. 8032502: 78eb ldrb r3, [r5, #3]
  60093. 8032504: f88d 3005 strb.w r3, [sp, #5]
  60094. /* destination Ethernet address is multicast */
  60095. dest = &mcastaddr;
  60096. 8032508: 466b mov r3, sp
  60097. 803250a: e03c b.n 8032586 <etharp_output+0xce>
  60098. /* unicast destination IP address? */
  60099. } else {
  60100. s8_t i;
  60101. /* outside local network? if so, this can neither be a global broadcast nor
  60102. a subnet broadcast. */
  60103. if (!ip_addr_netcmp(ipaddr, &(netif->ip_addr), &(netif->netmask)) &&
  60104. 803250c: 6862 ldr r2, [r4, #4]
  60105. 803250e: ea83 0102 eor.w r1, r3, r2
  60106. 8032512: 68a2 ldr r2, [r4, #8]
  60107. 8032514: 4211 tst r1, r2
  60108. 8032516: d009 beq.n 803252c <etharp_output+0x74>
  60109. !ip_addr_islinklocal(ipaddr)) {
  60110. 8032518: b29b uxth r3, r3
  60111. /* unicast destination IP address? */
  60112. } else {
  60113. s8_t i;
  60114. /* outside local network? if so, this can neither be a global broadcast nor
  60115. a subnet broadcast. */
  60116. if (!ip_addr_netcmp(ipaddr, &(netif->ip_addr), &(netif->netmask)) &&
  60117. 803251a: f64f 62a9 movw r2, #65193 ; 0xfea9
  60118. 803251e: 4293 cmp r3, r2
  60119. 8032520: d004 beq.n 803252c <etharp_output+0x74>
  60120. router for forwarding". */
  60121. if (!ip_addr_islinklocal(&iphdr->src))
  60122. #endif /* LWIP_AUTOIP */
  60123. {
  60124. /* interface has default gateway? */
  60125. if (!ip_addr_isany(&netif->gw)) {
  60126. 8032522: 68e3 ldr r3, [r4, #12]
  60127. 8032524: f104 010c add.w r1, r4, #12
  60128. 8032528: b90b cbnz r3, 803252e <etharp_output+0x76>
  60129. 803252a: e035 b.n 8032598 <etharp_output+0xe0>
  60130. /* unicast destination IP address? */
  60131. } else {
  60132. s8_t i;
  60133. /* outside local network? if so, this can neither be a global broadcast nor
  60134. a subnet broadcast. */
  60135. if (!ip_addr_netcmp(ipaddr, &(netif->ip_addr), &(netif->netmask)) &&
  60136. 803252c: 4629 mov r1, r5
  60137. if (netif->addr_hint != NULL) {
  60138. /* per-pcb cached entry was given */
  60139. u8_t etharp_cached_entry = *(netif->addr_hint);
  60140. if (etharp_cached_entry < ARP_TABLE_SIZE) {
  60141. #endif /* LWIP_NETIF_HWADDRHINT */
  60142. if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) &&
  60143. 803252e: 4b1c ldr r3, [pc, #112] ; (80325a0 <etharp_output+0xe8>)
  60144. 8032530: 781a ldrb r2, [r3, #0]
  60145. 8032532: 4b1c ldr r3, [pc, #112] ; (80325a4 <etharp_output+0xec>)
  60146. 8032534: 2014 movs r0, #20
  60147. 8032536: fb00 3302 mla r3, r0, r2, r3
  60148. 803253a: 7c98 ldrb r0, [r3, #18]
  60149. 803253c: 2801 cmp r0, #1
  60150. 803253e: d904 bls.n 803254a <etharp_output+0x92>
  60151. 8032540: 6808 ldr r0, [r1, #0]
  60152. 8032542: 685b ldr r3, [r3, #4]
  60153. 8032544: 4298 cmp r0, r3
  60154. 8032546: d100 bne.n 803254a <etharp_output+0x92>
  60155. 8032548: e00d b.n 8032566 <etharp_output+0xae>
  60156. 803254a: 2300 movs r3, #0
  60157. * @return
  60158. * - ERR_RTE No route to destination (no gateway to external networks),
  60159. * or the return type of either etharp_query() or etharp_send_ip().
  60160. */
  60161. err_t
  60162. etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)
  60163. 803254c: 4f15 ldr r7, [pc, #84] ; (80325a4 <etharp_output+0xec>)
  60164. if (netif->addr_hint != NULL) {
  60165. /* per-pcb cached entry was given */
  60166. u8_t etharp_cached_entry = *(netif->addr_hint);
  60167. if (etharp_cached_entry < ARP_TABLE_SIZE) {
  60168. #endif /* LWIP_NETIF_HWADDRHINT */
  60169. if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) &&
  60170. 803254e: 461a mov r2, r3
  60171. * @return
  60172. * - ERR_RTE No route to destination (no gateway to external networks),
  60173. * or the return type of either etharp_query() or etharp_send_ip().
  60174. */
  60175. err_t
  60176. etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)
  60177. 8032550: 18f8 adds r0, r7, r3
  60178. #endif /* LWIP_NETIF_HWADDRHINT */
  60179. /* find stable entry: do this here since this is a critical path for
  60180. throughput and etharp_find_entry() is kind of slow */
  60181. for (i = 0; i < ARP_TABLE_SIZE; i++) {
  60182. if ((arp_table[i].state >= ETHARP_STATE_STABLE) &&
  60183. 8032552: 7c85 ldrb r5, [r0, #18]
  60184. 8032554: 2d01 cmp r5, #1
  60185. 8032556: d90b bls.n 8032570 <etharp_output+0xb8>
  60186. 8032558: 680d ldr r5, [r1, #0]
  60187. 803255a: 6840 ldr r0, [r0, #4]
  60188. 803255c: 4285 cmp r5, r0
  60189. 803255e: d107 bne.n 8032570 <etharp_output+0xb8>
  60190. (ip_addr_cmp(dst_addr, &arp_table[i].ipaddr))) {
  60191. /* found an existing, stable entry */
  60192. ETHARP_SET_HINT(netif, i);
  60193. 8032560: 4b0f ldr r3, [pc, #60] ; (80325a0 <etharp_output+0xe8>)
  60194. 8032562: b2d2 uxtb r2, r2
  60195. 8032564: 701a strb r2, [r3, #0]
  60196. return etharp_output_to_arp_index(netif, q, i);
  60197. 8032566: 4620 mov r0, r4
  60198. 8032568: 4631 mov r1, r6
  60199. 803256a: f7ff ff7f bl 803246c <etharp_output_to_arp_index>
  60200. 803256e: e014 b.n 803259a <etharp_output+0xe2>
  60201. 8032570: 3314 adds r3, #20
  60202. }
  60203. #endif /* LWIP_NETIF_HWADDRHINT */
  60204. /* find stable entry: do this here since this is a critical path for
  60205. throughput and etharp_find_entry() is kind of slow */
  60206. for (i = 0; i < ARP_TABLE_SIZE; i++) {
  60207. 8032572: 3201 adds r2, #1
  60208. 8032574: 2bc8 cmp r3, #200 ; 0xc8
  60209. 8032576: b2d2 uxtb r2, r2
  60210. 8032578: d1ea bne.n 8032550 <etharp_output+0x98>
  60211. return etharp_output_to_arp_index(netif, q, i);
  60212. }
  60213. }
  60214. /* no stable entry found, use the (slower) query function:
  60215. queue on destination Ethernet address belonging to ipaddr */
  60216. return etharp_query(netif, dst_addr, q);
  60217. 803257a: 4620 mov r0, r4
  60218. 803257c: 4632 mov r2, r6
  60219. 803257e: f7ff fef5 bl 803236c <etharp_query>
  60220. 8032582: e00a b.n 803259a <etharp_output+0xe2>
  60221. * are special, other IP addresses are looked up in the ARP table. */
  60222. /* broadcast destination IP address? */
  60223. if (ip_addr_isbroadcast(ipaddr, netif)) {
  60224. /* broadcast on Ethernet also */
  60225. dest = (struct eth_addr *)&ethbroadcast;
  60226. 8032584: 4b08 ldr r3, [pc, #32] ; (80325a8 <etharp_output+0xf0>)
  60227. }
  60228. /* continuation for multicast/broadcast destinations */
  60229. /* obtain source Ethernet address of the given interface */
  60230. /* send packet directly on the link */
  60231. return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr), dest);
  60232. 8032586: 4620 mov r0, r4
  60233. 8032588: 4631 mov r1, r6
  60234. 803258a: f104 0227 add.w r2, r4, #39 ; 0x27
  60235. 803258e: f7ff fda5 bl 80320dc <etharp_send_ip>
  60236. 8032592: e002 b.n 803259a <etharp_output+0xe2>
  60237. if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) {
  60238. /* bail out */
  60239. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
  60240. ("etharp_output: could not allocate room for header.\n"));
  60241. LINK_STATS_INC(link.lenerr);
  60242. return ERR_BUF;
  60243. 8032594: 20fe movs r0, #254 ; 0xfe
  60244. 8032596: e000 b.n 803259a <etharp_output+0xe2>
  60245. /* send to hardware address of default gateway IP address */
  60246. dst_addr = &(netif->gw);
  60247. /* no default gateway available */
  60248. } else {
  60249. /* no route to destination error (default gateway missing) */
  60250. return ERR_RTE;
  60251. 8032598: 20fc movs r0, #252 ; 0xfc
  60252. /* continuation for multicast/broadcast destinations */
  60253. /* obtain source Ethernet address of the given interface */
  60254. /* send packet directly on the link */
  60255. return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr), dest);
  60256. }
  60257. 803259a: b240 sxtb r0, r0
  60258. 803259c: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc}
  60259. 803259e: bf00 nop
  60260. 80325a0: 2000e3c0 .word 0x2000e3c0
  60261. 80325a4: 2000e3c4 .word 0x2000e3c4
  60262. 80325a8: 0803b52b .word 0x0803b52b
  60263. 080325ac <ethernet_input>:
  60264. * @param p the recevied packet, p->payload pointing to the ethernet header
  60265. * @param netif the network interface on which the packet was received
  60266. */
  60267. err_t
  60268. ethernet_input(struct pbuf *p, struct netif *netif)
  60269. {
  60270. 80325ac: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  60271. u16_t type;
  60272. #if LWIP_ARP || ETHARP_SUPPORT_VLAN
  60273. s16_t ip_hdr_offset = SIZEOF_ETH_HDR;
  60274. #endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */
  60275. if (p->len <= SIZEOF_ETH_HDR) {
  60276. 80325b0: 8943 ldrh r3, [r0, #10]
  60277. 80325b2: 2b0e cmp r3, #14
  60278. * @param p the recevied packet, p->payload pointing to the ethernet header
  60279. * @param netif the network interface on which the packet was received
  60280. */
  60281. err_t
  60282. ethernet_input(struct pbuf *p, struct netif *netif)
  60283. {
  60284. 80325b4: b087 sub sp, #28
  60285. 80325b6: 4604 mov r4, r0
  60286. 80325b8: 460d mov r5, r1
  60287. u16_t type;
  60288. #if LWIP_ARP || ETHARP_SUPPORT_VLAN
  60289. s16_t ip_hdr_offset = SIZEOF_ETH_HDR;
  60290. #endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */
  60291. if (p->len <= SIZEOF_ETH_HDR) {
  60292. 80325ba: f240 80ed bls.w 8032798 <ethernet_input+0x1ec>
  60293. ETHARP_STATS_INC(etharp.drop);
  60294. goto free_and_return;
  60295. }
  60296. /* points to packet payload, which starts with an Ethernet header */
  60297. ethhdr = (struct eth_hdr *)p->payload;
  60298. 80325be: 6840 ldr r0, [r0, #4]
  60299. #if LWIP_ARP_FILTER_NETIF
  60300. netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, htons(type));
  60301. #endif /* LWIP_ARP_FILTER_NETIF*/
  60302. if (ethhdr->dest.addr[0] & 1) {
  60303. 80325c0: 7803 ldrb r3, [r0, #0]
  60304. (unsigned)ethhdr->dest.addr[3], (unsigned)ethhdr->dest.addr[4], (unsigned)ethhdr->dest.addr[5],
  60305. (unsigned)ethhdr->src.addr[0], (unsigned)ethhdr->src.addr[1], (unsigned)ethhdr->src.addr[2],
  60306. (unsigned)ethhdr->src.addr[3], (unsigned)ethhdr->src.addr[4], (unsigned)ethhdr->src.addr[5],
  60307. (unsigned)htons(ethhdr->type)));
  60308. type = ethhdr->type;
  60309. 80325c2: 8986 ldrh r6, [r0, #12]
  60310. #if LWIP_ARP_FILTER_NETIF
  60311. netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, htons(type));
  60312. #endif /* LWIP_ARP_FILTER_NETIF*/
  60313. if (ethhdr->dest.addr[0] & 1) {
  60314. 80325c4: 07da lsls r2, r3, #31
  60315. 80325c6: d513 bpl.n 80325f0 <ethernet_input+0x44>
  60316. /* this might be a multicast or broadcast packet */
  60317. if (ethhdr->dest.addr[0] == LL_MULTICAST_ADDR_0) {
  60318. 80325c8: 2b01 cmp r3, #1
  60319. 80325ca: d108 bne.n 80325de <ethernet_input+0x32>
  60320. if ((ethhdr->dest.addr[1] == LL_MULTICAST_ADDR_1) &&
  60321. 80325cc: 7843 ldrb r3, [r0, #1]
  60322. 80325ce: b97b cbnz r3, 80325f0 <ethernet_input+0x44>
  60323. 80325d0: 7883 ldrb r3, [r0, #2]
  60324. 80325d2: 2b5e cmp r3, #94 ; 0x5e
  60325. 80325d4: d10c bne.n 80325f0 <ethernet_input+0x44>
  60326. (ethhdr->dest.addr[2] == LL_MULTICAST_ADDR_2)) {
  60327. /* mark the pbuf as link-layer multicast */
  60328. p->flags |= PBUF_FLAG_LLMCAST;
  60329. 80325d6: 7b63 ldrb r3, [r4, #13]
  60330. 80325d8: f043 0310 orr.w r3, r3, #16
  60331. 80325dc: e007 b.n 80325ee <ethernet_input+0x42>
  60332. }
  60333. } else if (eth_addr_cmp(&ethhdr->dest, &ethbroadcast)) {
  60334. 80325de: 4972 ldr r1, [pc, #456] ; (80327a8 <ethernet_input+0x1fc>)
  60335. 80325e0: 2206 movs r2, #6
  60336. 80325e2: f7ee fffd bl 80215e0 <memcmp>
  60337. 80325e6: b918 cbnz r0, 80325f0 <ethernet_input+0x44>
  60338. /* mark the pbuf as link-layer broadcast */
  60339. p->flags |= PBUF_FLAG_LLBCAST;
  60340. 80325e8: 7b63 ldrb r3, [r4, #13]
  60341. 80325ea: f043 0308 orr.w r3, r3, #8
  60342. 80325ee: 7363 strb r3, [r4, #13]
  60343. }
  60344. }
  60345. switch (type) {
  60346. 80325f0: 2e08 cmp r6, #8
  60347. 80325f2: d004 beq.n 80325fe <ethernet_input+0x52>
  60348. 80325f4: f5b6 6fc1 cmp.w r6, #1544 ; 0x608
  60349. 80325f8: f040 80ce bne.w 8032798 <ethernet_input+0x1ec>
  60350. 80325fc: e014 b.n 8032628 <ethernet_input+0x7c>
  60351. #if LWIP_ARP
  60352. /* IP packet? */
  60353. case PP_HTONS(ETHTYPE_IP):
  60354. if (!(netif->flags & NETIF_FLAG_ETHARP)) {
  60355. 80325fe: f895 302d ldrb.w r3, [r5, #45] ; 0x2d
  60356. 8032602: f003 0320 and.w r3, r3, #32
  60357. 8032606: b2db uxtb r3, r3
  60358. 8032608: 2b00 cmp r3, #0
  60359. 803260a: f000 80c5 beq.w 8032798 <ethernet_input+0x1ec>
  60360. #if ETHARP_TRUST_IP_MAC
  60361. /* update ARP table */
  60362. etharp_ip_input(netif, p);
  60363. #endif /* ETHARP_TRUST_IP_MAC */
  60364. /* skip Ethernet header */
  60365. if(pbuf_header(p, -ip_hdr_offset)) {
  60366. 803260e: 4620 mov r0, r4
  60367. 8032610: f06f 010d mvn.w r1, #13
  60368. 8032614: f7f8 fdf1 bl 802b1fa <pbuf_header>
  60369. 8032618: 2800 cmp r0, #0
  60370. 803261a: f040 80bd bne.w 8032798 <ethernet_input+0x1ec>
  60371. LWIP_ASSERT("Can't move over header in packet", 0);
  60372. goto free_and_return;
  60373. } else {
  60374. /* pass to IP layer */
  60375. ip_input(p, netif);
  60376. 803261e: 4620 mov r0, r4
  60377. 8032620: 4629 mov r1, r5
  60378. 8032622: f7fb fdc3 bl 802e1ac <ip_input>
  60379. }
  60380. break;
  60381. 8032626: e0ba b.n 803279e <ethernet_input+0x1f2>
  60382. case PP_HTONS(ETHTYPE_ARP):
  60383. if (!(netif->flags & NETIF_FLAG_ETHARP)) {
  60384. 8032628: f895 302d ldrb.w r3, [r5, #45] ; 0x2d
  60385. 803262c: f003 0320 and.w r3, r3, #32
  60386. 8032630: b2db uxtb r3, r3
  60387. 8032632: 2b00 cmp r3, #0
  60388. 8032634: f000 80b0 beq.w 8032798 <ethernet_input+0x1ec>
  60389. LWIP_ERROR("netif != NULL", (netif != NULL), return;);
  60390. /* drop short ARP packets: we have to check for p->len instead of p->tot_len here
  60391. since a struct etharp_hdr is pointed to p->payload, so it musn't be chained! */
  60392. if (p->len < SIZEOF_ETHARP_PACKET) {
  60393. 8032638: 8963 ldrh r3, [r4, #10]
  60394. 803263a: 2b29 cmp r3, #41 ; 0x29
  60395. 803263c: d800 bhi.n 8032640 <ethernet_input+0x94>
  60396. 803263e: e0ab b.n 8032798 <ethernet_input+0x1ec>
  60397. ETHARP_STATS_INC(etharp.drop);
  60398. pbuf_free(p);
  60399. return;
  60400. }
  60401. ethhdr = (struct eth_hdr *)p->payload;
  60402. 8032640: 6866 ldr r6, [r4, #4]
  60403. hdr = (struct etharp_hdr *)(((u8_t*)ethhdr) + SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR);
  60404. }
  60405. #endif /* ETHARP_SUPPORT_VLAN */
  60406. /* RFC 826 "Packet Reception": */
  60407. if ((hdr->hwtype != PP_HTONS(HWTYPE_ETHERNET)) ||
  60408. 8032642: 89f3 ldrh r3, [r6, #14]
  60409. 8032644: f5b3 7f80 cmp.w r3, #256 ; 0x100
  60410. 8032648: f040 80a6 bne.w 8032798 <ethernet_input+0x1ec>
  60411. 803264c: 7cb3 ldrb r3, [r6, #18]
  60412. 803264e: 2b06 cmp r3, #6
  60413. 8032650: f040 80a2 bne.w 8032798 <ethernet_input+0x1ec>
  60414. (hdr->hwlen != ETHARP_HWADDR_LEN) ||
  60415. 8032654: 7cf7 ldrb r7, [r6, #19]
  60416. 8032656: 2f04 cmp r7, #4
  60417. 8032658: f040 809e bne.w 8032798 <ethernet_input+0x1ec>
  60418. (hdr->protolen != sizeof(ip_addr_t)) ||
  60419. 803265c: 8a33 ldrh r3, [r6, #16]
  60420. 803265e: 2b08 cmp r3, #8
  60421. 8032660: f040 809a bne.w 8032798 <ethernet_input+0x1ec>
  60422. autoip_arp_reply(netif, hdr);
  60423. #endif /* LWIP_AUTOIP */
  60424. /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without
  60425. * structure packing (not using structure copy which breaks strict-aliasing rules). */
  60426. IPADDR2_COPY(&sipaddr, &hdr->sipaddr);
  60427. 8032664: f106 0a1c add.w sl, r6, #28
  60428. 8032668: 4651 mov r1, sl
  60429. 803266a: 463a mov r2, r7
  60430. 803266c: a804 add r0, sp, #16
  60431. 803266e: f7ee ffe9 bl 8021644 <memcpy>
  60432. IPADDR2_COPY(&dipaddr, &hdr->dipaddr);
  60433. 8032672: f106 0226 add.w r2, r6, #38 ; 0x26
  60434. 8032676: 9203 str r2, [sp, #12]
  60435. 8032678: 4611 mov r1, r2
  60436. 803267a: a805 add r0, sp, #20
  60437. 803267c: 463a mov r2, r7
  60438. 803267e: f7ee ffe1 bl 8021644 <memcpy>
  60439. /* this interface is not configured? */
  60440. if (ip_addr_isany(&netif->ip_addr)) {
  60441. 8032682: 686b ldr r3, [r5, #4]
  60442. 8032684: b12b cbz r3, 8032692 <ethernet_input+0xe6>
  60443. for_us = 0;
  60444. } else {
  60445. /* ARP packet directed to us? */
  60446. for_us = (u8_t)ip_addr_cmp(&dipaddr, &(netif->ip_addr));
  60447. 8032686: 9a05 ldr r2, [sp, #20]
  60448. 8032688: 1ad1 subs r1, r2, r3
  60449. 803268a: 424a negs r2, r1
  60450. 803268c: 414a adcs r2, r1
  60451. 803268e: 9201 str r2, [sp, #4]
  60452. 8032690: e000 b.n 8032694 <ethernet_input+0xe8>
  60453. IPADDR2_COPY(&sipaddr, &hdr->sipaddr);
  60454. IPADDR2_COPY(&dipaddr, &hdr->dipaddr);
  60455. /* this interface is not configured? */
  60456. if (ip_addr_isany(&netif->ip_addr)) {
  60457. for_us = 0;
  60458. 8032692: 9301 str r3, [sp, #4]
  60459. /* ARP message directed to us?
  60460. -> add IP address in ARP cache; assume requester wants to talk to us,
  60461. can result in directly sending the queued packets for this host.
  60462. ARP message not directed to us?
  60463. -> update the source IP address in the cache, if present */
  60464. etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),
  60465. 8032694: 9b01 ldr r3, [sp, #4]
  60466. 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",
  60467. ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
  60468. ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
  60469. ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
  60470. /* non-unicast address? */
  60471. if (ip_addr_isany(ipaddr) ||
  60472. 8032696: 9804 ldr r0, [sp, #16]
  60473. /* ARP message directed to us?
  60474. -> add IP address in ARP cache; assume requester wants to talk to us,
  60475. can result in directly sending the queued packets for this host.
  60476. ARP message not directed to us?
  60477. -> update the source IP address in the cache, if present */
  60478. etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),
  60479. 8032698: f106 0716 add.w r7, r6, #22
  60480. 803269c: 2b00 cmp r3, #0
  60481. 803269e: bf0c ite eq
  60482. 80326a0: f04f 0802 moveq.w r8, #2
  60483. 80326a4: f04f 0801 movne.w r8, #1
  60484. case PP_HTONS(ETHTYPE_ARP):
  60485. if (!(netif->flags & NETIF_FLAG_ETHARP)) {
  60486. goto free_and_return;
  60487. }
  60488. /* pass p to ARP module */
  60489. etharp_arp_input(netif, (struct eth_addr*)(netif->hwaddr), p);
  60490. 80326a8: f105 0927 add.w r9, r5, #39 ; 0x27
  60491. 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",
  60492. ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
  60493. ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
  60494. ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
  60495. /* non-unicast address? */
  60496. if (ip_addr_isany(ipaddr) ||
  60497. 80326ac: 2800 cmp r0, #0
  60498. 80326ae: d03d beq.n 803272c <ethernet_input+0x180>
  60499. ip_addr_isbroadcast(ipaddr, netif) ||
  60500. 80326b0: 4629 mov r1, r5
  60501. 80326b2: f7fb fc67 bl 802df84 <ip4_addr_isbroadcast>
  60502. 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",
  60503. ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
  60504. ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
  60505. ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
  60506. /* non-unicast address? */
  60507. if (ip_addr_isany(ipaddr) ||
  60508. 80326b6: 9002 str r0, [sp, #8]
  60509. 80326b8: 2800 cmp r0, #0
  60510. 80326ba: d137 bne.n 803272c <ethernet_input+0x180>
  60511. ip_addr_isbroadcast(ipaddr, netif) ||
  60512. ip_addr_ismulticast(ipaddr)) {
  60513. 80326bc: 9a04 ldr r2, [sp, #16]
  60514. 80326be: f002 02f0 and.w r2, r2, #240 ; 0xf0
  60515. ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),
  60516. ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
  60517. ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
  60518. /* non-unicast address? */
  60519. if (ip_addr_isany(ipaddr) ||
  60520. ip_addr_isbroadcast(ipaddr, netif) ||
  60521. 80326c2: 2ae0 cmp r2, #224 ; 0xe0
  60522. 80326c4: d032 beq.n 803272c <ethernet_input+0x180>
  60523. ip_addr_ismulticast(ipaddr)) {
  60524. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: will not add non-unicast IP address to ARP cache\n"));
  60525. return ERR_ARG;
  60526. }
  60527. /* find or create ARP entry */
  60528. i = etharp_find_entry(ipaddr, flags);
  60529. 80326c6: a804 add r0, sp, #16
  60530. 80326c8: 4641 mov r1, r8
  60531. 80326ca: f7ff fd39 bl 8032140 <etharp_find_entry>
  60532. /* bail out if no entry could be found */
  60533. if (i < 0) {
  60534. 80326ce: 2800 cmp r0, #0
  60535. 80326d0: db2c blt.n 803272c <ethernet_input+0x180>
  60536. arp_table[i].state = ETHARP_STATE_STATIC;
  60537. } else
  60538. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  60539. {
  60540. /* mark it stable */
  60541. arp_table[i].state = ETHARP_STATE_STABLE;
  60542. 80326d2: 4b36 ldr r3, [pc, #216] ; (80327ac <ethernet_input+0x200>)
  60543. 80326d4: f04f 0814 mov.w r8, #20
  60544. 80326d8: fb08 f800 mul.w r8, r8, r0
  60545. 80326dc: eb03 0108 add.w r1, r3, r8
  60546. 80326e0: 2202 movs r2, #2
  60547. 80326e2: 748a strb r2, [r1, #18]
  60548. }
  60549. /* record network interface */
  60550. arp_table[i].netif = netif;
  60551. 80326e4: 608d str r5, [r1, #8]
  60552. arp_table[i].state = ETHARP_STATE_STATIC;
  60553. } else
  60554. #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
  60555. {
  60556. /* mark it stable */
  60557. arp_table[i].state = ETHARP_STATE_STABLE;
  60558. 80326e6: f101 0b10 add.w fp, r1, #16
  60559. }
  60560. /* record network interface */
  60561. arp_table[i].netif = netif;
  60562. /* insert in SNMP ARP index tree */
  60563. snmp_insert_arpidx_tree(netif, &arp_table[i].ipaddr);
  60564. 80326ea: 4628 mov r0, r5
  60565. 80326ec: 3104 adds r1, #4
  60566. 80326ee: 9300 str r3, [sp, #0]
  60567. 80326f0: f7fd f90e bl 802f910 <snmp_insert_arpidx_tree>
  60568. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: updating stable entry %"S16_F"\n", (s16_t)i));
  60569. /* update address */
  60570. ETHADDR32_COPY(&arp_table[i].ethaddr, ethaddr);
  60571. 80326f4: 9b00 ldr r3, [sp, #0]
  60572. 80326f6: eb03 0008 add.w r0, r3, r8
  60573. 80326fa: 2206 movs r2, #6
  60574. 80326fc: 300c adds r0, #12
  60575. 80326fe: 4639 mov r1, r7
  60576. 8032700: f7ee ffa0 bl 8021644 <memcpy>
  60577. /* reset time stamp */
  60578. arp_table[i].ctime = 0;
  60579. 8032704: 9a02 ldr r2, [sp, #8]
  60580. 8032706: f88b 2003 strb.w r2, [fp, #3]
  60581. /* get the packet pointer */
  60582. p = q->p;
  60583. /* now queue entry can be freed */
  60584. memp_free(MEMP_ARP_QUEUE, q);
  60585. #else /* ARP_QUEUEING */
  60586. if (arp_table[i].q != NULL) {
  60587. 803270a: 9b00 ldr r3, [sp, #0]
  60588. 803270c: f853 b008 ldr.w fp, [r3, r8]
  60589. 8032710: f1bb 0f00 cmp.w fp, #0
  60590. 8032714: d00a beq.n 803272c <ethernet_input+0x180>
  60591. struct pbuf *p = arp_table[i].q;
  60592. arp_table[i].q = NULL;
  60593. 8032716: f843 2008 str.w r2, [r3, r8]
  60594. #endif /* ARP_QUEUEING */
  60595. /* send the queued IP packet */
  60596. etharp_send_ip(netif, p, (struct eth_addr*)(netif->hwaddr), ethaddr);
  60597. 803271a: 4628 mov r0, r5
  60598. 803271c: 4659 mov r1, fp
  60599. 803271e: 464a mov r2, r9
  60600. 8032720: 463b mov r3, r7
  60601. 8032722: f7ff fcdb bl 80320dc <etharp_send_ip>
  60602. /* free the queued IP packet */
  60603. pbuf_free(p);
  60604. 8032726: 4658 mov r0, fp
  60605. 8032728: f7f8 fd92 bl 802b250 <pbuf_free>
  60606. -> update the source IP address in the cache, if present */
  60607. etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),
  60608. for_us ? ETHARP_FLAG_TRY_HARD : ETHARP_FLAG_FIND_ONLY);
  60609. /* now act on the message itself */
  60610. switch (hdr->opcode) {
  60611. 803272c: 8ab3 ldrh r3, [r6, #20]
  60612. 803272e: f5b3 7f80 cmp.w r3, #256 ; 0x100
  60613. 8032732: d003 beq.n 803273c <ethernet_input+0x190>
  60614. 8032734: f5b3 7f00 cmp.w r3, #512 ; 0x200
  60615. 8032738: d12e bne.n 8032798 <ethernet_input+0x1ec>
  60616. 803273a: e029 b.n 8032790 <ethernet_input+0x1e4>
  60617. * reply. In any case, we time-stamp any existing ARP entry,
  60618. * and possiby send out an IP packet that was queued on it. */
  60619. LWIP_DEBUGF (ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: incoming ARP request\n"));
  60620. /* ARP request for our address? */
  60621. if (for_us) {
  60622. 803273c: 9b01 ldr r3, [sp, #4]
  60623. 803273e: b35b cbz r3, 8032798 <ethernet_input+0x1ec>
  60624. LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: replying to ARP request for our IP address\n"));
  60625. /* Re-use pbuf to send ARP reply.
  60626. Since we are re-using an existing pbuf, we can't call etharp_raw since
  60627. that would allocate a new pbuf. */
  60628. hdr->opcode = htons(ARP_REPLY);
  60629. 8032740: 2002 movs r0, #2
  60630. 8032742: f7f7 fc47 bl 8029fd4 <lwip_htons>
  60631. 8032746: 82b0 strh r0, [r6, #20]
  60632. IPADDR2_COPY(&hdr->dipaddr, &hdr->sipaddr);
  60633. 8032748: 4651 mov r1, sl
  60634. 803274a: 2204 movs r2, #4
  60635. 803274c: 9803 ldr r0, [sp, #12]
  60636. 803274e: f7ee ff79 bl 8021644 <memcpy>
  60637. IPADDR2_COPY(&hdr->sipaddr, &netif->ip_addr);
  60638. 8032752: 1d29 adds r1, r5, #4
  60639. 8032754: 2204 movs r2, #4
  60640. 8032756: 4650 mov r0, sl
  60641. 8032758: f7ee ff74 bl 8021644 <memcpy>
  60642. * 'sender IP address' MUST be sent using link-layer broadcast instead of
  60643. * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */
  60644. ethdst_hwaddr = ip_addr_islinklocal(&netif->ip_addr) ? (u8_t*)(ethbroadcast.addr) : hdr->shwaddr.addr;
  60645. #endif /* LWIP_AUTOIP */
  60646. ETHADDR16_COPY(&hdr->dhwaddr, &hdr->shwaddr);
  60647. 803275c: 4639 mov r1, r7
  60648. 803275e: 2206 movs r2, #6
  60649. 8032760: f106 0020 add.w r0, r6, #32
  60650. 8032764: f7ee ff6e bl 8021644 <memcpy>
  60651. #if LWIP_AUTOIP
  60652. ETHADDR16_COPY(&ethhdr->dest, ethdst_hwaddr);
  60653. #else /* LWIP_AUTOIP */
  60654. ETHADDR16_COPY(&ethhdr->dest, &hdr->shwaddr);
  60655. 8032768: 4639 mov r1, r7
  60656. 803276a: 2206 movs r2, #6
  60657. 803276c: 4630 mov r0, r6
  60658. 803276e: f7ee ff69 bl 8021644 <memcpy>
  60659. #endif /* LWIP_AUTOIP */
  60660. ETHADDR16_COPY(&hdr->shwaddr, ethaddr);
  60661. 8032772: 4649 mov r1, r9
  60662. 8032774: 2206 movs r2, #6
  60663. 8032776: 4638 mov r0, r7
  60664. 8032778: f7ee ff64 bl 8021644 <memcpy>
  60665. ETHADDR16_COPY(&ethhdr->src, ethaddr);
  60666. 803277c: 4649 mov r1, r9
  60667. 803277e: 1db0 adds r0, r6, #6
  60668. 8032780: 2206 movs r2, #6
  60669. 8032782: f7ee ff5f bl 8021644 <memcpy>
  60670. /* hwtype, hwaddr_len, proto, protolen and the type in the ethernet header
  60671. are already correct, we tested that before */
  60672. /* return ARP reply */
  60673. netif->linkoutput(netif, p);
  60674. 8032786: 69ab ldr r3, [r5, #24]
  60675. 8032788: 4628 mov r0, r5
  60676. 803278a: 4621 mov r1, r4
  60677. 803278c: 4798 blx r3
  60678. 803278e: e003 b.n 8032798 <ethernet_input+0x1ec>
  60679. #if (LWIP_DHCP && DHCP_DOES_ARP_CHECK)
  60680. /* DHCP wants to know about ARP replies from any host with an
  60681. * IP address also offered to us by the DHCP server. We do not
  60682. * want to take a duplicate IP address on a single network.
  60683. * @todo How should we handle redundant (fail-over) interfaces? */
  60684. dhcp_arp_reply(netif, &sipaddr);
  60685. 8032790: 4628 mov r0, r5
  60686. 8032792: a904 add r1, sp, #16
  60687. 8032794: f7f8 f8f4 bl 802a980 <dhcp_arp_reply>
  60688. /* This means the pbuf is freed or consumed,
  60689. so the caller doesn't have to free it again */
  60690. return ERR_OK;
  60691. free_and_return:
  60692. pbuf_free(p);
  60693. 8032798: 4620 mov r0, r4
  60694. 803279a: f7f8 fd59 bl 802b250 <pbuf_free>
  60695. return ERR_OK;
  60696. }
  60697. 803279e: 2000 movs r0, #0
  60698. 80327a0: b007 add sp, #28
  60699. 80327a2: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
  60700. 80327a6: bf00 nop
  60701. 80327a8: 0803b52b .word 0x0803b52b
  60702. 80327ac: 2000e3c4 .word 0x2000e3c4
  60703. 080327b0 <arp_timer>:
  60704. return ERR_OK;
  60705. }
  60706. static void arp_timer(void *arg)
  60707. {
  60708. 80327b0: b508 push {r3, lr}
  60709. etharp_tmr();
  60710. 80327b2: f7ff fd37 bl 8032224 <etharp_tmr>
  60711. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  60712. 80327b6: 4904 ldr r1, [pc, #16] ; (80327c8 <arp_timer+0x18>)
  60713. 80327b8: f241 3088 movw r0, #5000 ; 0x1388
  60714. 80327bc: 2200 movs r2, #0
  60715. }
  60716. 80327be: e8bd 4008 ldmia.w sp!, {r3, lr}
  60717. static void arp_timer(void *arg)
  60718. {
  60719. etharp_tmr();
  60720. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  60721. 80327c2: f7fa bfcb b.w 802d75c <sys_timeout>
  60722. 80327c6: bf00 nop
  60723. 80327c8: 080327b1 .word 0x080327b1
  60724. 080327cc <ethernetif_input>:
  60725. }
  60726. }
  60727. */
  60728. void ethernetif_input(void * pvParameters)
  60729. {
  60730. 80327cc: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
  60731. struct pbuf *p;
  60732. for( ;; )
  60733. {
  60734. if(xSemaphoreTake(s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
  60735. 80327d0: f8df 80c4 ldr.w r8, [pc, #196] ; 8032898 <ethernetif_input+0xcc>
  60736. }
  60737. }
  60738. */
  60739. void ethernetif_input(void * pvParameters)
  60740. {
  60741. 80327d4: b085 sub sp, #20
  60742. struct pbuf *p;
  60743. for( ;; )
  60744. {
  60745. if(xSemaphoreTake(s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
  60746. 80327d6: 2100 movs r1, #0
  60747. 80327d8: 2264 movs r2, #100 ; 0x64
  60748. 80327da: f8d8 0000 ldr.w r0, [r8]
  60749. 80327de: 460b mov r3, r1
  60750. 80327e0: f7f5 fd44 bl 802826c <xQueueGenericReceive>
  60751. 80327e4: 2801 cmp r0, #1
  60752. 80327e6: d1f6 bne.n 80327d6 <ethernetif_input+0xa>
  60753. }
  60754. }
  60755. /* Release descriptors to DMA */
  60756. /* Check if received frame with multiple DMA buffer segments */
  60757. if (DMA_RX_FRAME_infos->Seg_Count > 1)
  60758. 80327e8: f8df a0b0 ldr.w sl, [pc, #176] ; 803289c <ethernetif_input+0xd0>
  60759. /* Clear Segment_Count */
  60760. DMA_RX_FRAME_infos->Seg_Count =0;
  60761. /* When Rx Buffer unavailable flag is set: clear it and resume reception */
  60762. if ((ETH->DMASR & ETH_DMASR_RBUS) != (u32)RESET)
  60763. 80327ec: f8df 90b0 ldr.w r9, [pc, #176] ; 80328a0 <ethernetif_input+0xd4>
  60764. __IO ETH_DMADESCTypeDef *DMARxNextDesc;
  60765. p = NULL;
  60766. /* Get received frame */
  60767. frame = ETH_Get_Received_Frame_interrupt();
  60768. 80327f0: a801 add r0, sp, #4
  60769. 80327f2: f000 fe2f bl 8033454 <ETH_Get_Received_Frame_interrupt>
  60770. 80327f6: 9e03 ldr r6, [sp, #12]
  60771. /* check that frame has no error */
  60772. if ((frame.descriptor->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET)
  60773. 80327f8: 6837 ldr r7, [r6, #0]
  60774. 80327fa: f417 4700 ands.w r7, r7, #32768 ; 0x8000
  60775. 80327fe: d001 beq.n 8032804 <ethernetif_input+0x38>
  60776. uint32_t l=0,i =0;
  60777. FrameTypeDef frame;
  60778. u8 *buffer;
  60779. __IO ETH_DMADESCTypeDef *DMARxNextDesc;
  60780. p = NULL;
  60781. 8032800: 2400 movs r4, #0
  60782. 8032802: e016 b.n 8032832 <ethernetif_input+0x66>
  60783. /* Obtain the size of the packet and put it into the "len" variable. */
  60784. len = frame.length;
  60785. buffer = (u8 *)frame.buffer;
  60786. /* We allocate a pbuf chain of pbufs from the pool. */
  60787. p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
  60788. 8032804: 2003 movs r0, #3
  60789. 8032806: f8bd 1004 ldrh.w r1, [sp, #4]
  60790. if ((frame.descriptor->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET)
  60791. {
  60792. /* Obtain the size of the packet and put it into the "len" variable. */
  60793. len = frame.length;
  60794. buffer = (u8 *)frame.buffer;
  60795. 803280a: f8dd b008 ldr.w fp, [sp, #8]
  60796. /* We allocate a pbuf chain of pbufs from the pool. */
  60797. p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
  60798. 803280e: 4602 mov r2, r0
  60799. 8032810: f7f8 fd6b bl 802b2ea <pbuf_alloc>
  60800. /* Copy received frame from ethernet driver buffer to stack buffer */
  60801. if (p != NULL)
  60802. 8032814: 4604 mov r4, r0
  60803. 8032816: 2800 cmp r0, #0
  60804. 8032818: d0f2 beq.n 8032800 <ethernetif_input+0x34>
  60805. 803281a: 4605 mov r5, r0
  60806. {
  60807. for (q = p; q != NULL; q = q->next)
  60808. {
  60809. memcpy((u8_t*)q->payload, (u8_t*)&buffer[l], q->len);
  60810. 803281c: 6868 ldr r0, [r5, #4]
  60811. 803281e: 896a ldrh r2, [r5, #10]
  60812. 8032820: eb0b 0107 add.w r1, fp, r7
  60813. 8032824: f7ee ff0e bl 8021644 <memcpy>
  60814. l = l + q->len;
  60815. 8032828: 896b ldrh r3, [r5, #10]
  60816. p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
  60817. /* Copy received frame from ethernet driver buffer to stack buffer */
  60818. if (p != NULL)
  60819. {
  60820. for (q = p; q != NULL; q = q->next)
  60821. 803282a: 682d ldr r5, [r5, #0]
  60822. {
  60823. memcpy((u8_t*)q->payload, (u8_t*)&buffer[l], q->len);
  60824. l = l + q->len;
  60825. 803282c: 18ff adds r7, r7, r3
  60826. p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
  60827. /* Copy received frame from ethernet driver buffer to stack buffer */
  60828. if (p != NULL)
  60829. {
  60830. for (q = p; q != NULL; q = q->next)
  60831. 803282e: 2d00 cmp r5, #0
  60832. 8032830: d1f4 bne.n 803281c <ethernetif_input+0x50>
  60833. }
  60834. }
  60835. /* Release descriptors to DMA */
  60836. /* Check if received frame with multiple DMA buffer segments */
  60837. if (DMA_RX_FRAME_infos->Seg_Count > 1)
  60838. 8032832: f8da 3000 ldr.w r3, [sl]
  60839. 8032836: 689a ldr r2, [r3, #8]
  60840. 8032838: 2a01 cmp r2, #1
  60841. {
  60842. DMARxNextDesc = DMA_RX_FRAME_infos->FS_Rx_Desc;
  60843. 803283a: bf88 it hi
  60844. 803283c: 681e ldrhi r6, [r3, #0]
  60845. }
  60846. /* Set Own bit in Rx descriptors: gives the buffers back to DMA */
  60847. for (i=0; i<DMA_RX_FRAME_infos->Seg_Count; i++)
  60848. {
  60849. DMARxNextDesc->Status = ETH_DMARxDesc_OWN;
  60850. 803283e: f04f 4000 mov.w r0, #2147483648 ; 0x80000000
  60851. uint32_t l=0,i =0;
  60852. FrameTypeDef frame;
  60853. u8 *buffer;
  60854. __IO ETH_DMADESCTypeDef *DMARxNextDesc;
  60855. p = NULL;
  60856. 8032842: 2200 movs r2, #0
  60857. 8032844: e002 b.n 803284c <ethernetif_input+0x80>
  60858. }
  60859. /* Set Own bit in Rx descriptors: gives the buffers back to DMA */
  60860. for (i=0; i<DMA_RX_FRAME_infos->Seg_Count; i++)
  60861. {
  60862. DMARxNextDesc->Status = ETH_DMARxDesc_OWN;
  60863. 8032846: 6030 str r0, [r6, #0]
  60864. DMARxNextDesc = (ETH_DMADESCTypeDef *)(DMARxNextDesc->Buffer2NextDescAddr);
  60865. 8032848: 68f6 ldr r6, [r6, #12]
  60866. {
  60867. DMARxNextDesc = frame.descriptor;
  60868. }
  60869. /* Set Own bit in Rx descriptors: gives the buffers back to DMA */
  60870. for (i=0; i<DMA_RX_FRAME_infos->Seg_Count; i++)
  60871. 803284a: 3201 adds r2, #1
  60872. 803284c: 6899 ldr r1, [r3, #8]
  60873. 803284e: 428a cmp r2, r1
  60874. 8032850: d3f9 bcc.n 8032846 <ethernetif_input+0x7a>
  60875. DMARxNextDesc->Status = ETH_DMARxDesc_OWN;
  60876. DMARxNextDesc = (ETH_DMADESCTypeDef *)(DMARxNextDesc->Buffer2NextDescAddr);
  60877. }
  60878. /* Clear Segment_Count */
  60879. DMA_RX_FRAME_infos->Seg_Count =0;
  60880. 8032852: 2200 movs r2, #0
  60881. 8032854: 609a str r2, [r3, #8]
  60882. /* When Rx Buffer unavailable flag is set: clear it and resume reception */
  60883. if ((ETH->DMASR & ETH_DMASR_RBUS) != (u32)RESET)
  60884. 8032856: f8d9 3000 ldr.w r3, [r9]
  60885. 803285a: 061b lsls r3, r3, #24
  60886. 803285c: d504 bpl.n 8032868 <ethernetif_input+0x9c>
  60887. {
  60888. /* Clear RBUS ETHERNET DMA flag */
  60889. ETH->DMASR = ETH_DMASR_RBUS;
  60890. 803285e: 2380 movs r3, #128 ; 0x80
  60891. 8032860: f8c9 3000 str.w r3, [r9]
  60892. /* Resume DMA reception */
  60893. ETH->DMARPDR = 0;
  60894. 8032864: 4b0a ldr r3, [pc, #40] ; (8032890 <ethernetif_input+0xc4>)
  60895. 8032866: 601a str r2, [r3, #0]
  60896. {
  60897. if(xSemaphoreTake(s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
  60898. {
  60899. GET_NEXT_FRAGMENT:
  60900. p = low_level_input( s_pxNetIf );
  60901. if (p != NULL)
  60902. 8032868: 2c00 cmp r4, #0
  60903. 803286a: d0b4 beq.n 80327d6 <ethernetif_input+0xa>
  60904. {
  60905. if (ERR_OK != s_pxNetIf->input( p, s_pxNetIf))
  60906. 803286c: 4b09 ldr r3, [pc, #36] ; (8032894 <ethernetif_input+0xc8>)
  60907. 803286e: 6819 ldr r1, [r3, #0]
  60908. 8032870: 4620 mov r0, r4
  60909. 8032872: 690b ldr r3, [r1, #16]
  60910. 8032874: 4798 blx r3
  60911. 8032876: 4601 mov r1, r0
  60912. 8032878: b118 cbz r0, 8032882 <ethernetif_input+0xb6>
  60913. {
  60914. pbuf_free(p);
  60915. 803287a: 4620 mov r0, r4
  60916. 803287c: f7f8 fce8 bl 802b250 <pbuf_free>
  60917. 8032880: e7a9 b.n 80327d6 <ethernetif_input+0xa>
  60918. p=NULL;
  60919. }
  60920. else
  60921. {
  60922. xSemaphoreTake(s_xSemaphore, 0);
  60923. 8032882: f8d8 0000 ldr.w r0, [r8]
  60924. 8032886: 460a mov r2, r1
  60925. 8032888: 460b mov r3, r1
  60926. 803288a: f7f5 fcef bl 802826c <xQueueGenericReceive>
  60927. goto GET_NEXT_FRAGMENT;
  60928. 803288e: e7af b.n 80327f0 <ethernetif_input+0x24>
  60929. 8032890: 40029008 .word 0x40029008
  60930. 8032894: 2000e48c .word 0x2000e48c
  60931. 8032898: 2000e494 .word 0x2000e494
  60932. 803289c: 2001306c .word 0x2001306c
  60933. 80328a0: 40029014 .word 0x40029014
  60934. 080328a4 <low_level_output>:
  60935. * to become availale since the stack doesn't retry to send a packet
  60936. * dropped because of memory failure (except for the TCP timers).
  60937. */
  60938. static err_t low_level_output(struct netif *netif, struct pbuf *p)
  60939. {
  60940. 80328a4: b570 push {r4, r5, r6, lr}
  60941. static SemaphoreHandle_t xTxSemaphore = NULL;
  60942. struct pbuf *q;
  60943. uint32_t l = 0;
  60944. u8 *buffer ;
  60945. if (xTxSemaphore == NULL)
  60946. 80328a6: 4e19 ldr r6, [pc, #100] ; (803290c <low_level_output+0x68>)
  60947. 80328a8: 6835 ldr r5, [r6, #0]
  60948. * to become availale since the stack doesn't retry to send a packet
  60949. * dropped because of memory failure (except for the TCP timers).
  60950. */
  60951. static err_t low_level_output(struct netif *netif, struct pbuf *p)
  60952. {
  60953. 80328aa: 460c mov r4, r1
  60954. static SemaphoreHandle_t xTxSemaphore = NULL;
  60955. struct pbuf *q;
  60956. uint32_t l = 0;
  60957. u8 *buffer ;
  60958. if (xTxSemaphore == NULL)
  60959. 80328ac: b95d cbnz r5, 80328c6 <low_level_output+0x22>
  60960. {
  60961. vSemaphoreCreateBinary (xTxSemaphore);
  60962. 80328ae: 2001 movs r0, #1
  60963. 80328b0: 4629 mov r1, r5
  60964. 80328b2: 2203 movs r2, #3
  60965. 80328b4: f7f5 fb69 bl 8027f8a <xQueueGenericCreate>
  60966. 80328b8: 6030 str r0, [r6, #0]
  60967. 80328ba: b120 cbz r0, 80328c6 <low_level_output+0x22>
  60968. 80328bc: 4629 mov r1, r5
  60969. 80328be: 462a mov r2, r5
  60970. 80328c0: 462b mov r3, r5
  60971. 80328c2: f7f5 fb9f bl 8028004 <xQueueGenericSend>
  60972. }
  60973. if (xSemaphoreTake(xTxSemaphore, netifGUARD_BLOCK_TIME))
  60974. 80328c6: 4b11 ldr r3, [pc, #68] ; (803290c <low_level_output+0x68>)
  60975. 80328c8: 2100 movs r1, #0
  60976. 80328ca: 6818 ldr r0, [r3, #0]
  60977. 80328cc: 22fa movs r2, #250 ; 0xfa
  60978. 80328ce: 460b mov r3, r1
  60979. 80328d0: f7f5 fccc bl 802826c <xQueueGenericReceive>
  60980. 80328d4: b1c0 cbz r0, 8032908 <low_level_output+0x64>
  60981. {
  60982. buffer = (u8 *)(DMATxDescToSet->Buffer1Addr);
  60983. 80328d6: 4b0e ldr r3, [pc, #56] ; (8032910 <low_level_output+0x6c>)
  60984. 80328d8: 681b ldr r3, [r3, #0]
  60985. static err_t low_level_output(struct netif *netif, struct pbuf *p)
  60986. {
  60987. static SemaphoreHandle_t xTxSemaphore = NULL;
  60988. struct pbuf *q;
  60989. uint32_t l = 0;
  60990. 80328da: 2500 movs r5, #0
  60991. vSemaphoreCreateBinary (xTxSemaphore);
  60992. }
  60993. if (xSemaphoreTake(xTxSemaphore, netifGUARD_BLOCK_TIME))
  60994. {
  60995. buffer = (u8 *)(DMATxDescToSet->Buffer1Addr);
  60996. 80328dc: 689e ldr r6, [r3, #8]
  60997. 80328de: e007 b.n 80328f0 <low_level_output+0x4c>
  60998. for(q = p; q != NULL; q = q->next)
  60999. {
  61000. memcpy((u8_t*)&buffer[l], q->payload, q->len);
  61001. 80328e0: 1970 adds r0, r6, r5
  61002. 80328e2: 6861 ldr r1, [r4, #4]
  61003. 80328e4: 8962 ldrh r2, [r4, #10]
  61004. 80328e6: f7ee fead bl 8021644 <memcpy>
  61005. l = l + q->len;
  61006. 80328ea: 8963 ldrh r3, [r4, #10]
  61007. }
  61008. if (xSemaphoreTake(xTxSemaphore, netifGUARD_BLOCK_TIME))
  61009. {
  61010. buffer = (u8 *)(DMATxDescToSet->Buffer1Addr);
  61011. for(q = p; q != NULL; q = q->next)
  61012. 80328ec: 6824 ldr r4, [r4, #0]
  61013. {
  61014. memcpy((u8_t*)&buffer[l], q->payload, q->len);
  61015. l = l + q->len;
  61016. 80328ee: 18ed adds r5, r5, r3
  61017. }
  61018. if (xSemaphoreTake(xTxSemaphore, netifGUARD_BLOCK_TIME))
  61019. {
  61020. buffer = (u8 *)(DMATxDescToSet->Buffer1Addr);
  61021. for(q = p; q != NULL; q = q->next)
  61022. 80328f0: 2c00 cmp r4, #0
  61023. 80328f2: d1f5 bne.n 80328e0 <low_level_output+0x3c>
  61024. {
  61025. memcpy((u8_t*)&buffer[l], q->payload, q->len);
  61026. l = l + q->len;
  61027. }
  61028. ETH_Prepare_Transmit_Descriptors(l);
  61029. 80328f4: b2a8 uxth r0, r5
  61030. 80328f6: f000 fdfd bl 80334f4 <ETH_Prepare_Transmit_Descriptors>
  61031. xSemaphoreGive(xTxSemaphore);
  61032. 80328fa: 4b04 ldr r3, [pc, #16] ; (803290c <low_level_output+0x68>)
  61033. 80328fc: 4621 mov r1, r4
  61034. 80328fe: 6818 ldr r0, [r3, #0]
  61035. 8032900: 4622 mov r2, r4
  61036. 8032902: 4623 mov r3, r4
  61037. 8032904: f7f5 fb7e bl 8028004 <xQueueGenericSend>
  61038. }
  61039. return ERR_OK;
  61040. }
  61041. 8032908: 2000 movs r0, #0
  61042. 803290a: bd70 pop {r4, r5, r6, pc}
  61043. 803290c: 2000e490 .word 0x2000e490
  61044. 8032910: 20011200 .word 0x20011200
  61045. 08032914 <ethernetif_init>:
  61046. #if LWIP_NETIF_HOSTNAME
  61047. /* Initialize interface hostname */
  61048. netif->hostname = "lwip";
  61049. #endif /* LWIP_NETIF_HOSTNAME */
  61050. netif->name[0] = IFNAME0;
  61051. 8032914: 2373 movs r3, #115 ; 0x73
  61052. * @return ERR_OK if the loopif is initialized
  61053. * ERR_MEM if private data couldn't be allocated
  61054. * any other err_t on error
  61055. */
  61056. err_t ethernetif_init(struct netif *netif)
  61057. {
  61058. 8032916: b530 push {r4, r5, lr}
  61059. #if LWIP_NETIF_HOSTNAME
  61060. /* Initialize interface hostname */
  61061. netif->hostname = "lwip";
  61062. #endif /* LWIP_NETIF_HOSTNAME */
  61063. netif->name[0] = IFNAME0;
  61064. 8032918: f880 302e strb.w r3, [r0, #46] ; 0x2e
  61065. netif->name[1] = IFNAME1;
  61066. 803291c: 2374 movs r3, #116 ; 0x74
  61067. 803291e: f880 302f strb.w r3, [r0, #47] ; 0x2f
  61068. netif->output = etharp_output;
  61069. 8032922: 4b37 ldr r3, [pc, #220] ; (8032a00 <ethernetif_init+0xec>)
  61070. netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
  61071. s_pxNetIf =netif;
  61072. /* create binary semaphore used for informing ethernetif of frame reception */
  61073. if (s_xSemaphore == NULL)
  61074. 8032924: 4d37 ldr r5, [pc, #220] ; (8032a04 <ethernetif_init+0xf0>)
  61075. #endif /* LWIP_NETIF_HOSTNAME */
  61076. netif->name[0] = IFNAME0;
  61077. netif->name[1] = IFNAME1;
  61078. netif->output = etharp_output;
  61079. 8032926: 6143 str r3, [r0, #20]
  61080. netif->linkoutput = low_level_output;
  61081. 8032928: 4b37 ldr r3, [pc, #220] ; (8032a08 <ethernetif_init+0xf4>)
  61082. * @return ERR_OK if the loopif is initialized
  61083. * ERR_MEM if private data couldn't be allocated
  61084. * any other err_t on error
  61085. */
  61086. err_t ethernetif_init(struct netif *netif)
  61087. {
  61088. 803292a: b087 sub sp, #28
  61089. netif->name[0] = IFNAME0;
  61090. netif->name[1] = IFNAME1;
  61091. netif->output = etharp_output;
  61092. netif->linkoutput = low_level_output;
  61093. 803292c: 6183 str r3, [r0, #24]
  61094. {
  61095. uint8_t mac[6];
  61096. uint32_t i;
  61097. /* set netif MAC hardware address length */
  61098. netif->hwaddr_len = ETHARP_HWADDR_LEN;
  61099. 803292e: 2306 movs r3, #6
  61100. * @return ERR_OK if the loopif is initialized
  61101. * ERR_MEM if private data couldn't be allocated
  61102. * any other err_t on error
  61103. */
  61104. err_t ethernetif_init(struct netif *netif)
  61105. {
  61106. 8032930: 4604 mov r4, r0
  61107. {
  61108. uint8_t mac[6];
  61109. uint32_t i;
  61110. /* set netif MAC hardware address length */
  61111. netif->hwaddr_len = ETHARP_HWADDR_LEN;
  61112. 8032932: f880 3026 strb.w r3, [r0, #38] ; 0x26
  61113. /* set netif MAC hardware address */
  61114. SETTINGS_GetMac(mac);
  61115. 8032936: a804 add r0, sp, #16
  61116. 8032938: f7f5 f820 bl 802797c <SETTINGS_GetMac>
  61117. netif->hwaddr[0] = mac[0];
  61118. 803293c: f89d 3010 ldrb.w r3, [sp, #16]
  61119. netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
  61120. s_pxNetIf =netif;
  61121. /* create binary semaphore used for informing ethernetif of frame reception */
  61122. if (s_xSemaphore == NULL)
  61123. 8032940: 6829 ldr r1, [r5, #0]
  61124. /* set netif MAC hardware address */
  61125. SETTINGS_GetMac(mac);
  61126. netif->hwaddr[0] = mac[0];
  61127. 8032942: f884 3027 strb.w r3, [r4, #39] ; 0x27
  61128. netif->hwaddr[1] = mac[1];
  61129. 8032946: f89d 3011 ldrb.w r3, [sp, #17]
  61130. 803294a: f884 3028 strb.w r3, [r4, #40] ; 0x28
  61131. netif->hwaddr[2] = mac[2];
  61132. 803294e: f89d 3012 ldrb.w r3, [sp, #18]
  61133. 8032952: f884 3029 strb.w r3, [r4, #41] ; 0x29
  61134. netif->hwaddr[3] = mac[3];
  61135. 8032956: f89d 3013 ldrb.w r3, [sp, #19]
  61136. 803295a: f884 302a strb.w r3, [r4, #42] ; 0x2a
  61137. netif->hwaddr[4] = mac[4];
  61138. 803295e: f89d 3014 ldrb.w r3, [sp, #20]
  61139. 8032962: f884 302b strb.w r3, [r4, #43] ; 0x2b
  61140. netif->hwaddr[5] = mac[5];
  61141. 8032966: f89d 3015 ldrb.w r3, [sp, #21]
  61142. 803296a: f884 302c strb.w r3, [r4, #44] ; 0x2c
  61143. /* set netif maximum transfer unit */
  61144. netif->mtu = 1500;
  61145. 803296e: f240 53dc movw r3, #1500 ; 0x5dc
  61146. 8032972: 84a3 strh r3, [r4, #36] ; 0x24
  61147. /* Accept broadcast address and ARP traffic */
  61148. netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
  61149. 8032974: 2322 movs r3, #34 ; 0x22
  61150. 8032976: f884 302d strb.w r3, [r4, #45] ; 0x2d
  61151. s_pxNetIf =netif;
  61152. 803297a: 4b24 ldr r3, [pc, #144] ; (8032a0c <ethernetif_init+0xf8>)
  61153. 803297c: 601c str r4, [r3, #0]
  61154. /* create binary semaphore used for informing ethernetif of frame reception */
  61155. if (s_xSemaphore == NULL)
  61156. 803297e: b919 cbnz r1, 8032988 <ethernetif_init+0x74>
  61157. {
  61158. s_xSemaphore= xSemaphoreCreateCounting(20,0);
  61159. 8032980: 2014 movs r0, #20
  61160. 8032982: f7f5 fb29 bl 8027fd8 <xQueueCreateCountingSemaphore>
  61161. 8032986: 6028 str r0, [r5, #0]
  61162. }
  61163. /* initialize MAC address in ethernet MAC */
  61164. ETH_MACAddressConfig(ETH_MAC_Address0, netif->hwaddr);
  61165. 8032988: f104 0127 add.w r1, r4, #39 ; 0x27
  61166. 803298c: 2000 movs r0, #0
  61167. 803298e: f000 fd49 bl 8033424 <ETH_MACAddressConfig>
  61168. /* Initialize Tx Descriptors list: Chain Mode */
  61169. ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
  61170. 8032992: 481f ldr r0, [pc, #124] ; (8032a10 <ethernetif_init+0xfc>)
  61171. 8032994: 491f ldr r1, [pc, #124] ; (8032a14 <ethernetif_init+0x100>)
  61172. /* Enable Ethernet Rx interrrupt */
  61173. {
  61174. for(i=0; i<ETH_RXBUFNB; i++)
  61175. {
  61176. ETH_DMARxDescReceiveITConfig(&DMARxDscrTab[i], ENABLE);
  61177. 8032996: 4d20 ldr r5, [pc, #128] ; (8032a18 <ethernetif_init+0x104>)
  61178. /* initialize MAC address in ethernet MAC */
  61179. ETH_MACAddressConfig(ETH_MAC_Address0, netif->hwaddr);
  61180. /* Initialize Tx Descriptors list: Chain Mode */
  61181. ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
  61182. 8032998: 2205 movs r2, #5
  61183. 803299a: f000 fe31 bl 8033600 <ETH_DMATxDescChainInit>
  61184. /* Initialize Rx Descriptors list: Chain Mode */
  61185. ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
  61186. 803299e: 481e ldr r0, [pc, #120] ; (8032a18 <ethernetif_init+0x104>)
  61187. 80329a0: 491e ldr r1, [pc, #120] ; (8032a1c <ethernetif_init+0x108>)
  61188. 80329a2: 2205 movs r2, #5
  61189. 80329a4: f000 fe00 bl 80335a8 <ETH_DMARxDescChainInit>
  61190. /* Enable Ethernet Rx interrrupt */
  61191. {
  61192. for(i=0; i<ETH_RXBUFNB; i++)
  61193. 80329a8: 2400 movs r4, #0
  61194. {
  61195. ETH_DMARxDescReceiveITConfig(&DMARxDscrTab[i], ENABLE);
  61196. 80329aa: eb05 1044 add.w r0, r5, r4, lsl #5
  61197. 80329ae: 2101 movs r1, #1
  61198. /* Initialize Rx Descriptors list: Chain Mode */
  61199. ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
  61200. /* Enable Ethernet Rx interrrupt */
  61201. {
  61202. for(i=0; i<ETH_RXBUFNB; i++)
  61203. 80329b0: 3401 adds r4, #1
  61204. {
  61205. ETH_DMARxDescReceiveITConfig(&DMARxDscrTab[i], ENABLE);
  61206. 80329b2: f000 fe4b bl 803364c <ETH_DMARxDescReceiveITConfig>
  61207. /* Initialize Rx Descriptors list: Chain Mode */
  61208. ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
  61209. /* Enable Ethernet Rx interrrupt */
  61210. {
  61211. for(i=0; i<ETH_RXBUFNB; i++)
  61212. 80329b6: 2c05 cmp r4, #5
  61213. 80329b8: d1f7 bne.n 80329aa <ethernetif_init+0x96>
  61214. #ifdef CHECKSUM_BY_HARDWARE
  61215. /* Enable the checksum insertion for the Tx frames */
  61216. {
  61217. for(i=0; i<ETH_TXBUFNB; i++)
  61218. {
  61219. ETH_DMATxDescChecksumInsertionConfig(&DMATxDscrTab[i], ETH_DMATxDesc_ChecksumTCPUDPICMPFull);
  61220. 80329ba: 4d15 ldr r5, [pc, #84] ; (8032a10 <ethernetif_init+0xfc>)
  61221. /* Initialize Rx Descriptors list: Chain Mode */
  61222. ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
  61223. /* Enable Ethernet Rx interrrupt */
  61224. {
  61225. for(i=0; i<ETH_RXBUFNB; i++)
  61226. 80329bc: 2400 movs r4, #0
  61227. #ifdef CHECKSUM_BY_HARDWARE
  61228. /* Enable the checksum insertion for the Tx frames */
  61229. {
  61230. for(i=0; i<ETH_TXBUFNB; i++)
  61231. {
  61232. ETH_DMATxDescChecksumInsertionConfig(&DMATxDscrTab[i], ETH_DMATxDesc_ChecksumTCPUDPICMPFull);
  61233. 80329be: eb05 1044 add.w r0, r5, r4, lsl #5
  61234. 80329c2: f44f 0140 mov.w r1, #12582912 ; 0xc00000
  61235. }
  61236. #ifdef CHECKSUM_BY_HARDWARE
  61237. /* Enable the checksum insertion for the Tx frames */
  61238. {
  61239. for(i=0; i<ETH_TXBUFNB; i++)
  61240. 80329c6: 3401 adds r4, #1
  61241. {
  61242. ETH_DMATxDescChecksumInsertionConfig(&DMATxDscrTab[i], ETH_DMATxDesc_ChecksumTCPUDPICMPFull);
  61243. 80329c8: f000 fe3c bl 8033644 <ETH_DMATxDescChecksumInsertionConfig>
  61244. }
  61245. #ifdef CHECKSUM_BY_HARDWARE
  61246. /* Enable the checksum insertion for the Tx frames */
  61247. {
  61248. for(i=0; i<ETH_TXBUFNB; i++)
  61249. 80329cc: 2c05 cmp r4, #5
  61250. 80329ce: d1f6 bne.n 80329be <ethernetif_init+0xaa>
  61251. }
  61252. }
  61253. #endif
  61254. /* create the task that handles the ETH_MAC */
  61255. xTaskCreate(ethernetif_input, "Eth_if", netifINTERFACE_TASK_STACK_SIZE, NULL,
  61256. 80329d0: 2400 movs r4, #0
  61257. 80329d2: 2304 movs r3, #4
  61258. 80329d4: 2296 movs r2, #150 ; 0x96
  61259. 80329d6: e88d 0018 stmia.w sp, {r3, r4}
  61260. 80329da: 4911 ldr r1, [pc, #68] ; (8032a20 <ethernetif_init+0x10c>)
  61261. 80329dc: 9402 str r4, [sp, #8]
  61262. 80329de: 4623 mov r3, r4
  61263. 80329e0: 9403 str r4, [sp, #12]
  61264. 80329e2: 4810 ldr r0, [pc, #64] ; (8032a24 <ethernetif_init+0x110>)
  61265. 80329e4: f7f5 fd20 bl 8028428 <xTaskGenericCreate>
  61266. netifINTERFACE_TASK_PRIORITY,NULL);
  61267. /* Enable MAC and DMA transmission and reception */
  61268. ETH_Start();
  61269. 80329e8: f000 fe86 bl 80336f8 <ETH_Start>
  61270. /* initialize the hardware */
  61271. low_level_init(netif);
  61272. etharp_init();
  61273. sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
  61274. 80329ec: f241 3088 movw r0, #5000 ; 0x1388
  61275. 80329f0: 490d ldr r1, [pc, #52] ; (8032a28 <ethernetif_init+0x114>)
  61276. 80329f2: 4622 mov r2, r4
  61277. 80329f4: f7fa feb2 bl 802d75c <sys_timeout>
  61278. return ERR_OK;
  61279. }
  61280. 80329f8: 4620 mov r0, r4
  61281. 80329fa: b007 add sp, #28
  61282. 80329fc: bd30 pop {r4, r5, pc}
  61283. 80329fe: bf00 nop
  61284. 8032a00: 080324b9 .word 0x080324b9
  61285. 8032a04: 2000e494 .word 0x2000e494
  61286. 8032a08: 080328a5 .word 0x080328a5
  61287. 8032a0c: 2000e48c .word 0x2000e48c
  61288. 8032a10: 20011204 .word 0x20011204
  61289. 8032a14: 20013110 .word 0x20013110
  61290. 8032a18: 20013070 .word 0x20013070
  61291. 8032a1c: 200112a4 .word 0x200112a4
  61292. 8032a20: 0803b537 .word 0x0803b537
  61293. 8032a24: 080327cd .word 0x080327cd
  61294. 8032a28: 080327b1 .word 0x080327b1
  61295. 08032a2c <sys_mbox_new>:
  61296. * int size -- Size of elements in the mailbox
  61297. * Outputs:
  61298. * sys_mbox_t -- Handle to new mailbox
  61299. *---------------------------------------------------------------------------*/
  61300. err_t sys_mbox_new( sys_mbox_t *pxMailBox, int iSize )
  61301. {
  61302. 8032a2c: b510 push {r4, lr}
  61303. err_t xReturn = ERR_MEM;
  61304. *pxMailBox = xQueueCreate( iSize, sizeof( void * ) );
  61305. 8032a2e: 2200 movs r2, #0
  61306. * int size -- Size of elements in the mailbox
  61307. * Outputs:
  61308. * sys_mbox_t -- Handle to new mailbox
  61309. *---------------------------------------------------------------------------*/
  61310. err_t sys_mbox_new( sys_mbox_t *pxMailBox, int iSize )
  61311. {
  61312. 8032a30: 4604 mov r4, r0
  61313. err_t xReturn = ERR_MEM;
  61314. *pxMailBox = xQueueCreate( iSize, sizeof( void * ) );
  61315. 8032a32: 4608 mov r0, r1
  61316. 8032a34: 2104 movs r1, #4
  61317. 8032a36: f7f5 faa8 bl 8027f8a <xQueueGenericCreate>
  61318. 8032a3a: 6020 str r0, [r4, #0]
  61319. xReturn = ERR_OK;
  61320. SYS_STATS_INC_USED( mbox );
  61321. }
  61322. return xReturn;
  61323. }
  61324. 8032a3c: 2800 cmp r0, #0
  61325. 8032a3e: bf14 ite ne
  61326. 8032a40: 2000 movne r0, #0
  61327. 8032a42: f06f 0000 mvneq.w r0, #0
  61328. 8032a46: bd10 pop {r4, pc}
  61329. 08032a48 <sys_mbox_trypost>:
  61330. * Outputs:
  61331. * err_t -- ERR_OK if message posted, else ERR_MEM
  61332. * if not.
  61333. *---------------------------------------------------------------------------*/
  61334. err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
  61335. {
  61336. 8032a48: b51f push {r0, r1, r2, r3, r4, lr}
  61337. err_t xReturn;
  61338. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  61339. if( xInsideISR != pdFALSE )
  61340. 8032a4a: 4a0b ldr r2, [pc, #44] ; (8032a78 <sys_mbox_trypost+0x30>)
  61341. * Outputs:
  61342. * err_t -- ERR_OK if message posted, else ERR_MEM
  61343. * if not.
  61344. *---------------------------------------------------------------------------*/
  61345. err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
  61346. {
  61347. 8032a4c: 9101 str r1, [sp, #4]
  61348. err_t xReturn;
  61349. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  61350. if( xInsideISR != pdFALSE )
  61351. 8032a4e: 6812 ldr r2, [r2, #0]
  61352. {
  61353. xReturn = xQueueSendFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken );
  61354. 8032a50: 6800 ldr r0, [r0, #0]
  61355. * if not.
  61356. *---------------------------------------------------------------------------*/
  61357. err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
  61358. {
  61359. err_t xReturn;
  61360. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  61361. 8032a52: 2300 movs r3, #0
  61362. 8032a54: 9303 str r3, [sp, #12]
  61363. if( xInsideISR != pdFALSE )
  61364. {
  61365. xReturn = xQueueSendFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken );
  61366. 8032a56: a901 add r1, sp, #4
  61367. err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
  61368. {
  61369. err_t xReturn;
  61370. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  61371. if( xInsideISR != pdFALSE )
  61372. 8032a58: b11a cbz r2, 8032a62 <sys_mbox_trypost+0x1a>
  61373. {
  61374. xReturn = xQueueSendFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken );
  61375. 8032a5a: aa03 add r2, sp, #12
  61376. 8032a5c: f7f5 fb8a bl 8028174 <xQueueGenericSendFromISR>
  61377. 8032a60: e002 b.n 8032a68 <sys_mbox_trypost+0x20>
  61378. }
  61379. else
  61380. {
  61381. xReturn = xQueueSend( *pxMailBox, &pxMessageToPost, ( TickType_t ) 0 );
  61382. 8032a62: 4613 mov r3, r2
  61383. 8032a64: f7f5 face bl 8028004 <xQueueGenericSend>
  61384. 8032a68: b2c0 uxtb r0, r0
  61385. xReturn = ERR_MEM;
  61386. SYS_STATS_INC( mbox.err );
  61387. }
  61388. return xReturn;
  61389. }
  61390. 8032a6a: 3801 subs r0, #1
  61391. 8032a6c: bf18 it ne
  61392. 8032a6e: f06f 0000 mvnne.w r0, #0
  61393. 8032a72: b005 add sp, #20
  61394. 8032a74: bd00 pop {pc}
  61395. 8032a76: bf00 nop
  61396. 8032a78: 2000e498 .word 0x2000e498
  61397. 08032a7c <sys_arch_mbox_fetch>:
  61398. * Outputs:
  61399. * u32_t -- SYS_ARCH_TIMEOUT if timeout, else number
  61400. * of milliseconds until received.
  61401. *---------------------------------------------------------------------------*/
  61402. u32_t sys_arch_mbox_fetch( sys_mbox_t *pxMailBox, void **ppvBuffer, u32_t ulTimeOut )
  61403. {
  61404. 8032a7c: e92d 41f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, lr}
  61405. 8032a80: 4607 mov r7, r0
  61406. 8032a82: 460c mov r4, r1
  61407. 8032a84: 4690 mov r8, r2
  61408. void *pvDummy;
  61409. TickType_t xStartTime, xEndTime, xElapsed;
  61410. unsigned long ulReturn;
  61411. xStartTime = xTaskGetTickCount();
  61412. 8032a86: f7f5 fe33 bl 80286f0 <xTaskGetTickCount>
  61413. 8032a8a: 4605 mov r5, r0
  61414. if( NULL == ppvBuffer )
  61415. 8032a8c: b904 cbnz r4, 8032a90 <sys_arch_mbox_fetch+0x14>
  61416. {
  61417. ppvBuffer = &pvDummy;
  61418. 8032a8e: ac01 add r4, sp, #4
  61419. }
  61420. if( ulTimeOut != 0UL )
  61421. 8032a90: f1b8 0f00 cmp.w r8, #0
  61422. 8032a94: d015 beq.n 8032ac2 <sys_arch_mbox_fetch+0x46>
  61423. {
  61424. configASSERT( xInsideISR == ( portBASE_TYPE ) 0 );
  61425. 8032a96: 4b13 ldr r3, [pc, #76] ; (8032ae4 <sys_arch_mbox_fetch+0x68>)
  61426. 8032a98: 681e ldr r6, [r3, #0]
  61427. 8032a9a: b116 cbz r6, 8032aa2 <sys_arch_mbox_fetch+0x26>
  61428. 8032a9c: f7f6 f942 bl 8028d24 <ulPortSetInterruptMask>
  61429. 8032aa0: e7fe b.n 8032aa0 <sys_arch_mbox_fetch+0x24>
  61430. if( pdTRUE == xQueueReceive( *pxMailBox, &( *ppvBuffer ), ulTimeOut/ portTICK_PERIOD_MS ) )
  61431. 8032aa2: 6838 ldr r0, [r7, #0]
  61432. 8032aa4: 4621 mov r1, r4
  61433. 8032aa6: 4642 mov r2, r8
  61434. 8032aa8: 4633 mov r3, r6
  61435. 8032aaa: f7f5 fbdf bl 802826c <xQueueGenericReceive>
  61436. 8032aae: 2801 cmp r0, #1
  61437. 8032ab0: d103 bne.n 8032aba <sys_arch_mbox_fetch+0x3e>
  61438. {
  61439. xEndTime = xTaskGetTickCount();
  61440. 8032ab2: f7f5 fe1d bl 80286f0 <xTaskGetTickCount>
  61441. xElapsed = ( xEndTime - xStartTime ) * portTICK_PERIOD_MS;
  61442. 8032ab6: 1b40 subs r0, r0, r5
  61443. 8032ab8: e011 b.n 8032ade <sys_arch_mbox_fetch+0x62>
  61444. ulReturn = xElapsed;
  61445. }
  61446. else
  61447. {
  61448. /* Timed out. */
  61449. *ppvBuffer = NULL;
  61450. 8032aba: 6026 str r6, [r4, #0]
  61451. ulReturn = SYS_ARCH_TIMEOUT;
  61452. 8032abc: f04f 30ff mov.w r0, #4294967295
  61453. 8032ac0: e00d b.n 8032ade <sys_arch_mbox_fetch+0x62>
  61454. }
  61455. }
  61456. else
  61457. {
  61458. while( pdTRUE != xQueueReceive( *pxMailBox, &( *ppvBuffer ), portMAX_DELAY ) );
  61459. 8032ac2: 2300 movs r3, #0
  61460. 8032ac4: 6838 ldr r0, [r7, #0]
  61461. 8032ac6: 4621 mov r1, r4
  61462. 8032ac8: f04f 32ff mov.w r2, #4294967295
  61463. 8032acc: f7f5 fbce bl 802826c <xQueueGenericReceive>
  61464. 8032ad0: 2801 cmp r0, #1
  61465. 8032ad2: d1f6 bne.n 8032ac2 <sys_arch_mbox_fetch+0x46>
  61466. xEndTime = xTaskGetTickCount();
  61467. 8032ad4: f7f5 fe0c bl 80286f0 <xTaskGetTickCount>
  61468. xElapsed = ( xEndTime - xStartTime ) * portTICK_PERIOD_MS;
  61469. if( xElapsed == 0UL )
  61470. 8032ad8: 1b40 subs r0, r0, r5
  61471. 8032ada: bf08 it eq
  61472. 8032adc: 2001 moveq r0, #1
  61473. ulReturn = xElapsed;
  61474. }
  61475. return ulReturn;
  61476. }
  61477. 8032ade: e8bd 81fc ldmia.w sp!, {r2, r3, r4, r5, r6, r7, r8, pc}
  61478. 8032ae2: bf00 nop
  61479. 8032ae4: 2000e498 .word 0x2000e498
  61480. 08032ae8 <sys_mutex_new>:
  61481. /** Create a new mutex
  61482. * @param mutex pointer to the mutex to create
  61483. * @return a new mutex */
  61484. err_t sys_mutex_new( sys_mutex_t *pxMutex )
  61485. {
  61486. 8032ae8: b510 push {r4, lr}
  61487. 8032aea: 4604 mov r4, r0
  61488. err_t xReturn = ERR_MEM;
  61489. *pxMutex = xSemaphoreCreateMutex();
  61490. 8032aec: 2001 movs r0, #1
  61491. 8032aee: f7f5 fb17 bl 8028120 <xQueueCreateMutex>
  61492. 8032af2: 6020 str r0, [r4, #0]
  61493. {
  61494. SYS_STATS_INC( mutex.err );
  61495. }
  61496. return xReturn;
  61497. }
  61498. 8032af4: 2800 cmp r0, #0
  61499. 8032af6: bf14 ite ne
  61500. 8032af8: 2000 movne r0, #0
  61501. 8032afa: f06f 0000 mvneq.w r0, #0
  61502. 8032afe: bd10 pop {r4, pc}
  61503. 08032b00 <sys_mutex_lock>:
  61504. /** Lock a mutex
  61505. * @param mutex the mutex to lock */
  61506. void sys_mutex_lock( sys_mutex_t *pxMutex )
  61507. {
  61508. 8032b00: b510 push {r4, lr}
  61509. 8032b02: 4604 mov r4, r0
  61510. while( xSemaphoreTake( *pxMutex, portMAX_DELAY ) != pdPASS );
  61511. 8032b04: 2100 movs r1, #0
  61512. 8032b06: 6820 ldr r0, [r4, #0]
  61513. 8032b08: f04f 32ff mov.w r2, #4294967295
  61514. 8032b0c: 460b mov r3, r1
  61515. 8032b0e: f7f5 fbad bl 802826c <xQueueGenericReceive>
  61516. 8032b12: 2801 cmp r0, #1
  61517. 8032b14: d1f6 bne.n 8032b04 <sys_mutex_lock+0x4>
  61518. }
  61519. 8032b16: bd10 pop {r4, pc}
  61520. 08032b18 <sys_mutex_unlock>:
  61521. /** Unlock a mutex
  61522. * @param mutex the mutex to unlock */
  61523. void sys_mutex_unlock(sys_mutex_t *pxMutex )
  61524. {
  61525. xSemaphoreGive( *pxMutex );
  61526. 8032b18: 2100 movs r1, #0
  61527. 8032b1a: 6800 ldr r0, [r0, #0]
  61528. 8032b1c: 460a mov r2, r1
  61529. 8032b1e: 460b mov r3, r1
  61530. 8032b20: f7f5 ba70 b.w 8028004 <xQueueGenericSend>
  61531. 08032b24 <sys_init>:
  61532. *---------------------------------------------------------------------------*
  61533. * Description:
  61534. * Initialize sys arch
  61535. *---------------------------------------------------------------------------*/
  61536. void sys_init(void)
  61537. {
  61538. 8032b24: 4770 bx lr
  61539. 08032b26 <sys_now>:
  61540. }
  61541. u32_t sys_now(void)
  61542. {
  61543. return xTaskGetTickCount();
  61544. 8032b26: f7f5 bde3 b.w 80286f0 <xTaskGetTickCount>
  61545. 08032b2a <sys_thread_new>:
  61546. * int prio -- Thread priority
  61547. * Outputs:
  61548. * sys_thread_t -- Pointer to per-thread timeouts.
  61549. *---------------------------------------------------------------------------*/
  61550. sys_thread_t sys_thread_new( const char *pcName, void( *pxThread )( void *pvParameters ), void *pvArg, int iStackSize, int iPriority )
  61551. {
  61552. 8032b2a: b570 push {r4, r5, r6, lr}
  61553. 8032b2c: b086 sub sp, #24
  61554. 8032b2e: 4606 mov r6, r0
  61555. TaskHandle_t xCreatedTask;
  61556. portBASE_TYPE xResult;
  61557. sys_thread_t xReturn;
  61558. xResult = xTaskCreate( pxThread, pcName, iStackSize, pvArg, iPriority, &xCreatedTask );
  61559. 8032b30: 9c0a ldr r4, [sp, #40] ; 0x28
  61560. * int prio -- Thread priority
  61561. * Outputs:
  61562. * sys_thread_t -- Pointer to per-thread timeouts.
  61563. *---------------------------------------------------------------------------*/
  61564. sys_thread_t sys_thread_new( const char *pcName, void( *pxThread )( void *pvParameters ), void *pvArg, int iStackSize, int iPriority )
  61565. {
  61566. 8032b32: 4615 mov r5, r2
  61567. TaskHandle_t xCreatedTask;
  61568. portBASE_TYPE xResult;
  61569. sys_thread_t xReturn;
  61570. xResult = xTaskCreate( pxThread, pcName, iStackSize, pvArg, iPriority, &xCreatedTask );
  61571. 8032b34: 9400 str r4, [sp, #0]
  61572. 8032b36: aa05 add r2, sp, #20
  61573. 8032b38: 2400 movs r4, #0
  61574. 8032b3a: 9201 str r2, [sp, #4]
  61575. 8032b3c: 9402 str r4, [sp, #8]
  61576. 8032b3e: b29a uxth r2, r3
  61577. 8032b40: 9403 str r4, [sp, #12]
  61578. 8032b42: 4608 mov r0, r1
  61579. 8032b44: 462b mov r3, r5
  61580. 8032b46: 4631 mov r1, r6
  61581. 8032b48: f7f5 fc6e bl 8028428 <xTaskGenericCreate>
  61582. if( xResult == pdPASS )
  61583. 8032b4c: 2801 cmp r0, #1
  61584. {
  61585. xReturn = xCreatedTask;
  61586. 8032b4e: bf0c ite eq
  61587. 8032b50: 9805 ldreq r0, [sp, #20]
  61588. }
  61589. else
  61590. {
  61591. xReturn = NULL;
  61592. 8032b52: 4620 movne r0, r4
  61593. }
  61594. return xReturn;
  61595. }
  61596. 8032b54: b006 add sp, #24
  61597. 8032b56: bd70 pop {r4, r5, r6, pc}
  61598. 08032b58 <sys_arch_protect>:
  61599. * operating system.
  61600. * Outputs:
  61601. * sys_prot_t -- Previous protection level (not used here)
  61602. *---------------------------------------------------------------------------*/
  61603. sys_prot_t sys_arch_protect( void )
  61604. {
  61605. 8032b58: b508 push {r3, lr}
  61606. if( xInsideISR == pdFALSE )
  61607. 8032b5a: 4b03 ldr r3, [pc, #12] ; (8032b68 <sys_arch_protect+0x10>)
  61608. 8032b5c: 681b ldr r3, [r3, #0]
  61609. 8032b5e: b90b cbnz r3, 8032b64 <sys_arch_protect+0xc>
  61610. {
  61611. taskENTER_CRITICAL();
  61612. 8032b60: f7f6 f8e8 bl 8028d34 <vPortEnterCritical>
  61613. }
  61614. return ( sys_prot_t ) 1;
  61615. }
  61616. 8032b64: 2001 movs r0, #1
  61617. 8032b66: bd08 pop {r3, pc}
  61618. 8032b68: 2000e498 .word 0x2000e498
  61619. 08032b6c <sys_arch_unprotect>:
  61620. * sys_prot_t -- Previous protection level (not used here)
  61621. *---------------------------------------------------------------------------*/
  61622. void sys_arch_unprotect( sys_prot_t xValue )
  61623. {
  61624. (void) xValue;
  61625. if( xInsideISR == pdFALSE )
  61626. 8032b6c: 4b02 ldr r3, [pc, #8] ; (8032b78 <sys_arch_unprotect+0xc>)
  61627. 8032b6e: 681b ldr r3, [r3, #0]
  61628. 8032b70: b90b cbnz r3, 8032b76 <sys_arch_unprotect+0xa>
  61629. {
  61630. taskEXIT_CRITICAL();
  61631. 8032b72: f7f6 b90b b.w 8028d8c <vPortExitCritical>
  61632. 8032b76: 4770 bx lr
  61633. 8032b78: 2000e498 .word 0x2000e498
  61634. 08032b7c <vTaskWebReinit>:
  61635. * Если флаг не устанавливается в положенное время, то сбрасывается
  61636. * флаг sSettings.sFlags.netsettingsChanged, сохраняется вся структура
  61637. * настроек в памяти и контроллер перезагружается.
  61638. */
  61639. void vTaskWebReinit(void * pvParameters)
  61640. {
  61641. 8032b7c: b538 push {r3, r4, r5, lr}
  61642. static uint16_t timeCounter = 0;
  61643. for (;;)
  61644. {
  61645. /* Контроль времени работы задачи */
  61646. if (timeCounter++ > TIME_COUNTER_10_MIN)
  61647. 8032b7e: 4c20 ldr r4, [pc, #128] ; (8032c00 <vTaskWebReinit+0x84>)
  61648. if (fConfirmWebParams)
  61649. {
  61650. fConfirmWebParams = false;
  61651. /* Сохраняем временные сетевые настройки в постоянные */
  61652. sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;
  61653. 8032b80: 4d20 ldr r5, [pc, #128] ; (8032c04 <vTaskWebReinit+0x88>)
  61654. static uint16_t timeCounter = 0;
  61655. for (;;)
  61656. {
  61657. /* Контроль времени работы задачи */
  61658. if (timeCounter++ > TIME_COUNTER_10_MIN)
  61659. 8032b82: 8823 ldrh r3, [r4, #0]
  61660. 8032b84: 1c5a adds r2, r3, #1
  61661. 8032b86: f5b3 7f16 cmp.w r3, #600 ; 0x258
  61662. 8032b8a: 8022 strh r2, [r4, #0]
  61663. 8032b8c: d914 bls.n 8032bb8 <vTaskWebReinit+0x3c>
  61664. {
  61665. SetWebReinitFlag(false);
  61666. 8032b8e: 2000 movs r0, #0
  61667. 8032b90: f7f4 fd06 bl 80275a0 <SetWebReinitFlag>
  61668. HTTP_SaveSettings();
  61669. 8032b94: f7f7 f979 bl 8029e8a <HTTP_SaveSettings>
  61670. vTaskDelay(1010);
  61671. 8032b98: f240 30f2 movw r0, #1010 ; 0x3f2
  61672. 8032b9c: f7f5 feda bl 8028954 <vTaskDelay>
  61673. 8032ba0: f3bf 8f4f dsb sy
  61674. (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
  61675. 8032ba4: 4a18 ldr r2, [pc, #96] ; (8032c08 <vTaskWebReinit+0x8c>)
  61676. 8032ba6: 4b19 ldr r3, [pc, #100] ; (8032c0c <vTaskWebReinit+0x90>)
  61677. 8032ba8: 68d1 ldr r1, [r2, #12]
  61678. 8032baa: f401 61e0 and.w r1, r1, #1792 ; 0x700
  61679. 8032bae: 430b orrs r3, r1
  61680. __STATIC_INLINE void NVIC_SystemReset(void)
  61681. //static inline void NVIC_SystemReset(void)
  61682. {
  61683. __DSB(); /* Ensure all outstanding memory accesses included
  61684. buffered write are completed before reset */
  61685. SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  61686. 8032bb0: 60d3 str r3, [r2, #12]
  61687. 8032bb2: f3bf 8f4f dsb sy
  61688. 8032bb6: e7fe b.n 8032bb6 <vTaskWebReinit+0x3a>
  61689. NVIC_SystemReset();
  61690. }
  61691. if (fConfirmWebParams)
  61692. 8032bb8: 4b15 ldr r3, [pc, #84] ; (8032c10 <vTaskWebReinit+0x94>)
  61693. 8032bba: 781a ldrb r2, [r3, #0]
  61694. 8032bbc: b1d2 cbz r2, 8032bf4 <vTaskWebReinit+0x78>
  61695. {
  61696. fConfirmWebParams = false;
  61697. 8032bbe: 2200 movs r2, #0
  61698. /* Сохраняем временные сетевые настройки в постоянные */
  61699. sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;
  61700. strcpy(sSettings.sWebParams.ip, sSettings.sWebTempParams.ip);
  61701. 8032bc0: 4814 ldr r0, [pc, #80] ; (8032c14 <vTaskWebReinit+0x98>)
  61702. NVIC_SystemReset();
  61703. }
  61704. if (fConfirmWebParams)
  61705. {
  61706. fConfirmWebParams = false;
  61707. 8032bc2: 701a strb r2, [r3, #0]
  61708. /* Сохраняем временные сетевые настройки в постоянные */
  61709. sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;
  61710. 8032bc4: f895 305d ldrb.w r3, [r5, #93] ; 0x5d
  61711. strcpy(sSettings.sWebParams.ip, sSettings.sWebTempParams.ip);
  61712. 8032bc8: f100 012e add.w r1, r0, #46 ; 0x2e
  61713. if (fConfirmWebParams)
  61714. {
  61715. fConfirmWebParams = false;
  61716. /* Сохраняем временные сетевые настройки в постоянные */
  61717. sSettings.sWebParams.dhcpEnable = sSettings.sWebTempParams.dhcpEnable;
  61718. 8032bcc: f885 302f strb.w r3, [r5, #47] ; 0x2f
  61719. strcpy(sSettings.sWebParams.ip, sSettings.sWebTempParams.ip);
  61720. 8032bd0: f7ee ff6c bl 8021aac <strcpy>
  61721. strcpy(sSettings.sWebParams.gate, sSettings.sWebTempParams.gate);
  61722. 8032bd4: 4810 ldr r0, [pc, #64] ; (8032c18 <vTaskWebReinit+0x9c>)
  61723. 8032bd6: f100 012e add.w r1, r0, #46 ; 0x2e
  61724. 8032bda: f7ee ff67 bl 8021aac <strcpy>
  61725. strcpy(sSettings.sWebParams.mask, sSettings.sWebTempParams.mask);
  61726. 8032bde: 480f ldr r0, [pc, #60] ; (8032c1c <vTaskWebReinit+0xa0>)
  61727. 8032be0: f100 012e add.w r1, r0, #46 ; 0x2e
  61728. 8032be4: f7ee ff62 bl 8021aac <strcpy>
  61729. HTTP_SaveSettings();
  61730. 8032be8: f7f7 f94f bl 8029e8a <HTTP_SaveSettings>
  61731. vTaskDelete(xHandleWebReinit);
  61732. 8032bec: 4b0c ldr r3, [pc, #48] ; (8032c20 <vTaskWebReinit+0xa4>)
  61733. 8032bee: 6818 ldr r0, [r3, #0]
  61734. 8032bf0: f7f5 fcf2 bl 80285d8 <vTaskDelete>
  61735. }
  61736. vTaskDelay(1000);
  61737. 8032bf4: f44f 707a mov.w r0, #1000 ; 0x3e8
  61738. 8032bf8: f7f5 feac bl 8028954 <vTaskDelay>
  61739. }
  61740. 8032bfc: e7c1 b.n 8032b82 <vTaskWebReinit+0x6>
  61741. 8032bfe: bf00 nop
  61742. 8032c00: 2000e49e .word 0x2000e49e
  61743. 8032c04: 2000e874 .word 0x2000e874
  61744. 8032c08: e000ed00 .word 0xe000ed00
  61745. 8032c0c: 05fa0004 .word 0x05fa0004
  61746. 8032c10: 200028a0 .word 0x200028a0
  61747. 8032c14: 2000e876 .word 0x2000e876
  61748. 8032c18: 2000e885 .word 0x2000e885
  61749. 8032c1c: 2000e894 .word 0x2000e894
  61750. 8032c20: 2000e4a0 .word 0x2000e4a0
  61751. 08032c24 <LwIP_DHCP_task>:
  61752. * @brief LwIP_DHCP_Process_Handle
  61753. * @param None
  61754. * @retval None
  61755. */
  61756. void LwIP_DHCP_task(void * pvParameters)
  61757. {
  61758. 8032c24: b530 push {r4, r5, lr}
  61759. DHCP_state = DHCP_TIMEOUT;
  61760. /* Stop DHCP */
  61761. dhcp_stop(&xnetif);
  61762. if (sSettings.sFlags.netsettingsChanged == true)
  61763. 8032c26: 4d48 ldr r5, [pc, #288] ; (8032d48 <LwIP_DHCP_task+0x124>)
  61764. * @brief LwIP_DHCP_Process_Handle
  61765. * @param None
  61766. * @retval None
  61767. */
  61768. void LwIP_DHCP_task(void * pvParameters)
  61769. {
  61770. 8032c28: b085 sub sp, #20
  61771. struct ip_addr ipaddr;
  61772. struct ip_addr netmask;
  61773. struct ip_addr gw;
  61774. uint8_t DHCP_state;
  61775. DHCP_state = DHCP_START;
  61776. 8032c2a: 2400 movs r4, #0
  61777. for (;;)
  61778. {
  61779. switch (DHCP_state)
  61780. 8032c2c: b11c cbz r4, 8032c36 <LwIP_DHCP_task+0x12>
  61781. 8032c2e: 2c01 cmp r4, #1
  61782. 8032c30: f040 8085 bne.w 8032d3e <LwIP_DHCP_task+0x11a>
  61783. 8032c34: e004 b.n 8032c40 <LwIP_DHCP_task+0x1c>
  61784. {
  61785. case DHCP_START:
  61786. {
  61787. dhcp_start(&xnetif);
  61788. 8032c36: 4845 ldr r0, [pc, #276] ; (8032d4c <LwIP_DHCP_task+0x128>)
  61789. 8032c38: f7f8 f80e bl 802ac58 <dhcp_start>
  61790. DHCP_state = DHCP_WAIT_ADDRESS;
  61791. 8032c3c: 2401 movs r4, #1
  61792. //PRINT_USART("\n\rLooking for DHCP server please wait...\n\r");
  61793. }
  61794. break;
  61795. 8032c3e: e07e b.n 8032d3e <LwIP_DHCP_task+0x11a>
  61796. case DHCP_WAIT_ADDRESS:
  61797. {
  61798. /* Read the new IP address */
  61799. ipaddr = xnetif.ip_addr;
  61800. 8032c40: 4842 ldr r0, [pc, #264] ; (8032d4c <LwIP_DHCP_task+0x128>)
  61801. netmask = xnetif.netmask;
  61802. 8032c42: 6882 ldr r2, [r0, #8]
  61803. break;
  61804. case DHCP_WAIT_ADDRESS:
  61805. {
  61806. /* Read the new IP address */
  61807. ipaddr = xnetif.ip_addr;
  61808. 8032c44: 6843 ldr r3, [r0, #4]
  61809. netmask = xnetif.netmask;
  61810. 8032c46: 9202 str r2, [sp, #8]
  61811. gw = xnetif.gw;
  61812. 8032c48: 68c2 ldr r2, [r0, #12]
  61813. break;
  61814. case DHCP_WAIT_ADDRESS:
  61815. {
  61816. /* Read the new IP address */
  61817. ipaddr = xnetif.ip_addr;
  61818. 8032c4a: 9301 str r3, [sp, #4]
  61819. netmask = xnetif.netmask;
  61820. gw = xnetif.gw;
  61821. 8032c4c: 9203 str r2, [sp, #12]
  61822. if (ipaddr.addr != 0)
  61823. 8032c4e: 2b00 cmp r3, #0
  61824. 8032c50: d045 beq.n 8032cde <LwIP_DHCP_task+0xba>
  61825. {
  61826. DHCP_state = DHCP_ADDRESS_ASSIGNED;
  61827. dhcp_stop(&xnetif);
  61828. 8032c52: f7f7 ffe9 bl 802ac28 <dhcp_stop>
  61829. /* Сохранение полученных сетевый параметров */
  61830. /* Если настройки изменили, то сохраняем во временные настройки */
  61831. if (sSettings.sFlags.netsettingsChanged == true)
  61832. 8032c56: f895 32ce ldrb.w r3, [r5, #718] ; 0x2ce
  61833. {
  61834. sprintf(sSettings.sWebTempParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  61835. 8032c5a: a801 add r0, sp, #4
  61836. DHCP_state = DHCP_ADDRESS_ASSIGNED;
  61837. dhcp_stop(&xnetif);
  61838. /* Сохранение полученных сетевый параметров */
  61839. /* Если настройки изменили, то сохраняем во временные настройки */
  61840. if (sSettings.sFlags.netsettingsChanged == true)
  61841. 8032c5c: b103 cbz r3, 8032c60 <LwIP_DHCP_task+0x3c>
  61842. 8032c5e: e01b b.n 8032c98 <LwIP_DHCP_task+0x74>
  61843. sprintf(sSettings.sWebTempParams.mask, "%s", ipaddr_ntoa(&netmask));
  61844. sprintf(sSettings.sWebTempParams.gate, "%s", ipaddr_ntoa(&gw));
  61845. }
  61846. else
  61847. {
  61848. sprintf(sSettings.sWebParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  61849. 8032c60: f7fb fa7a bl 802e158 <ipaddr_ntoa>
  61850. 8032c64: 493a ldr r1, [pc, #232] ; (8032d50 <LwIP_DHCP_task+0x12c>)
  61851. 8032c66: 4602 mov r2, r0
  61852. 8032c68: 483a ldr r0, [pc, #232] ; (8032d54 <LwIP_DHCP_task+0x130>)
  61853. 8032c6a: f7f4 fab7 bl 80271dc <tfp_sprintf>
  61854. sprintf(sSettings.sWebParams.mask, "%s", ipaddr_ntoa(&netmask));
  61855. 8032c6e: a802 add r0, sp, #8
  61856. 8032c70: f7fb fa72 bl 802e158 <ipaddr_ntoa>
  61857. 8032c74: 4936 ldr r1, [pc, #216] ; (8032d50 <LwIP_DHCP_task+0x12c>)
  61858. 8032c76: 4602 mov r2, r0
  61859. 8032c78: 4837 ldr r0, [pc, #220] ; (8032d58 <LwIP_DHCP_task+0x134>)
  61860. 8032c7a: f7f4 faaf bl 80271dc <tfp_sprintf>
  61861. sprintf(sSettings.sWebParams.gate, "%s", ipaddr_ntoa(&gw));
  61862. 8032c7e: a803 add r0, sp, #12
  61863. 8032c80: f7fb fa6a bl 802e158 <ipaddr_ntoa>
  61864. 8032c84: 4932 ldr r1, [pc, #200] ; (8032d50 <LwIP_DHCP_task+0x12c>)
  61865. 8032c86: 4602 mov r2, r0
  61866. 8032c88: 4834 ldr r0, [pc, #208] ; (8032d5c <LwIP_DHCP_task+0x138>)
  61867. 8032c8a: f7f4 faa7 bl 80271dc <tfp_sprintf>
  61868. /* Обновляем временные настройки */
  61869. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  61870. 8032c8e: f895 302f ldrb.w r3, [r5, #47] ; 0x2f
  61871. sprintf(sSettings.sWebTempParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  61872. 8032c92: a801 add r0, sp, #4
  61873. sprintf(sSettings.sWebParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  61874. sprintf(sSettings.sWebParams.mask, "%s", ipaddr_ntoa(&netmask));
  61875. sprintf(sSettings.sWebParams.gate, "%s", ipaddr_ntoa(&gw));
  61876. /* Обновляем временные настройки */
  61877. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  61878. 8032c94: f885 305d strb.w r3, [r5, #93] ; 0x5d
  61879. sprintf(sSettings.sWebTempParams.ip, "%s", ipaddr_ntoa(&ipaddr));
  61880. 8032c98: f7fb fa5e bl 802e158 <ipaddr_ntoa>
  61881. 8032c9c: 492c ldr r1, [pc, #176] ; (8032d50 <LwIP_DHCP_task+0x12c>)
  61882. 8032c9e: 4602 mov r2, r0
  61883. 8032ca0: 482f ldr r0, [pc, #188] ; (8032d60 <LwIP_DHCP_task+0x13c>)
  61884. 8032ca2: f7f4 fa9b bl 80271dc <tfp_sprintf>
  61885. sprintf(sSettings.sWebTempParams.mask, "%s", ipaddr_ntoa(&netmask));
  61886. 8032ca6: a802 add r0, sp, #8
  61887. 8032ca8: f7fb fa56 bl 802e158 <ipaddr_ntoa>
  61888. 8032cac: 4928 ldr r1, [pc, #160] ; (8032d50 <LwIP_DHCP_task+0x12c>)
  61889. 8032cae: 4602 mov r2, r0
  61890. 8032cb0: 482c ldr r0, [pc, #176] ; (8032d64 <LwIP_DHCP_task+0x140>)
  61891. 8032cb2: f7f4 fa93 bl 80271dc <tfp_sprintf>
  61892. sprintf(sSettings.sWebTempParams.gate, "%s", ipaddr_ntoa(&gw));
  61893. 8032cb6: a803 add r0, sp, #12
  61894. 8032cb8: f7fb fa4e bl 802e158 <ipaddr_ntoa>
  61895. 8032cbc: 4924 ldr r1, [pc, #144] ; (8032d50 <LwIP_DHCP_task+0x12c>)
  61896. 8032cbe: 4602 mov r2, r0
  61897. 8032cc0: 4829 ldr r0, [pc, #164] ; (8032d68 <LwIP_DHCP_task+0x144>)
  61898. 8032cc2: f7f4 fa8b bl 80271dc <tfp_sprintf>
  61899. PRINT_USART("Gateway: ");
  61900. PRINT_USART(ipaddr_ntoa(&gw));
  61901. PRINT_USART("\n\r");
  61902. vTaskDelay(50);
  61903. 8032cc6: 2032 movs r0, #50 ; 0x32
  61904. 8032cc8: f7f5 fe44 bl 8028954 <vTaskDelay>
  61905. /* Установлен динамический IP, можно отправить трап о перезагрузке устройства */
  61906. SNMP_SendUserTrap(DEVICE_REBOOTED);
  61907. 8032ccc: 2004 movs r0, #4
  61908. 8032cce: f000 f9bb bl 8033048 <SNMP_SendUserTrap>
  61909. vTaskDelete(xHandleDHCP);
  61910. 8032cd2: 4b26 ldr r3, [pc, #152] ; (8032d6c <LwIP_DHCP_task+0x148>)
  61911. 8032cd4: 6818 ldr r0, [r3, #0]
  61912. 8032cd6: f7f5 fc7f bl 80285d8 <vTaskDelete>
  61913. netmask = xnetif.netmask;
  61914. gw = xnetif.gw;
  61915. if (ipaddr.addr != 0)
  61916. {
  61917. DHCP_state = DHCP_ADDRESS_ASSIGNED;
  61918. 8032cda: 2402 movs r4, #2
  61919. 8032cdc: e02f b.n 8032d3e <LwIP_DHCP_task+0x11a>
  61920. vTaskDelete(xHandleDHCP);
  61921. }
  61922. else
  61923. {
  61924. /* DHCP timeout */
  61925. if (xnetif.dhcp->tries > MAX_DHCP_TRIES)
  61926. 8032cde: 6a03 ldr r3, [r0, #32]
  61927. 8032ce0: 7b5b ldrb r3, [r3, #13]
  61928. 8032ce2: 2b03 cmp r3, #3
  61929. 8032ce4: d92b bls.n 8032d3e <LwIP_DHCP_task+0x11a>
  61930. {
  61931. DHCP_state = DHCP_TIMEOUT;
  61932. /* Stop DHCP */
  61933. dhcp_stop(&xnetif);
  61934. 8032ce6: f7f7 ff9f bl 802ac28 <dhcp_stop>
  61935. if (sSettings.sFlags.netsettingsChanged == true)
  61936. 8032cea: f895 32ce ldrb.w r3, [r5, #718] ; 0x2ce
  61937. 8032cee: b14b cbz r3, 8032d04 <LwIP_DHCP_task+0xe0>
  61938. {
  61939. ipaddr.addr = ipaddr_addr(sSettings.sWebTempParams.ip);
  61940. 8032cf0: 481b ldr r0, [pc, #108] ; (8032d60 <LwIP_DHCP_task+0x13c>)
  61941. 8032cf2: f7fb f9de bl 802e0b2 <ipaddr_addr>
  61942. 8032cf6: 9001 str r0, [sp, #4]
  61943. netmask.addr = ipaddr_addr(sSettings.sWebTempParams.mask);
  61944. 8032cf8: 481a ldr r0, [pc, #104] ; (8032d64 <LwIP_DHCP_task+0x140>)
  61945. 8032cfa: f7fb f9da bl 802e0b2 <ipaddr_addr>
  61946. 8032cfe: 9002 str r0, [sp, #8]
  61947. gw.addr = ipaddr_addr(sSettings.sWebTempParams.gate);
  61948. 8032d00: 4819 ldr r0, [pc, #100] ; (8032d68 <LwIP_DHCP_task+0x144>)
  61949. 8032d02: e008 b.n 8032d16 <LwIP_DHCP_task+0xf2>
  61950. }
  61951. else
  61952. {
  61953. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  61954. 8032d04: 4813 ldr r0, [pc, #76] ; (8032d54 <LwIP_DHCP_task+0x130>)
  61955. 8032d06: f7fb f9d4 bl 802e0b2 <ipaddr_addr>
  61956. 8032d0a: 9001 str r0, [sp, #4]
  61957. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  61958. 8032d0c: 4812 ldr r0, [pc, #72] ; (8032d58 <LwIP_DHCP_task+0x134>)
  61959. 8032d0e: f7fb f9d0 bl 802e0b2 <ipaddr_addr>
  61960. 8032d12: 9002 str r0, [sp, #8]
  61961. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  61962. 8032d14: 4811 ldr r0, [pc, #68] ; (8032d5c <LwIP_DHCP_task+0x138>)
  61963. 8032d16: f7fb f9cc bl 802e0b2 <ipaddr_addr>
  61964. }
  61965. /* Static address used */
  61966. netif_set_addr(&xnetif, &ipaddr , &netmask, &gw);
  61967. 8032d1a: a901 add r1, sp, #4
  61968. 8032d1c: aa02 add r2, sp, #8
  61969. 8032d1e: ab03 add r3, sp, #12
  61970. }
  61971. else
  61972. {
  61973. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  61974. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  61975. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  61976. 8032d20: 9003 str r0, [sp, #12]
  61977. }
  61978. /* Static address used */
  61979. netif_set_addr(&xnetif, &ipaddr , &netmask, &gw);
  61980. 8032d22: 480a ldr r0, [pc, #40] ; (8032d4c <LwIP_DHCP_task+0x128>)
  61981. 8032d24: f7f8 f9f0 bl 802b108 <netif_set_addr>
  61982. PRINT_USART("DHCP timeout\n\r");
  61983. PRINT_USART("\n\rStatic IP address\n\r");
  61984. PRINT_USART(ipaddr_ntoa(&ipaddr));
  61985. PRINT_USART("\n\r");
  61986. vTaskDelay(50);
  61987. 8032d28: 2032 movs r0, #50 ; 0x32
  61988. 8032d2a: f7f5 fe13 bl 8028954 <vTaskDelay>
  61989. /* Установлен статический IP, можно отправить трап о перезагрузке устройства */
  61990. SNMP_SendUserTrap(DEVICE_REBOOTED);
  61991. 8032d2e: 2004 movs r0, #4
  61992. 8032d30: f000 f98a bl 8033048 <SNMP_SendUserTrap>
  61993. vTaskDelete(xHandleDHCP);
  61994. 8032d34: 4b0d ldr r3, [pc, #52] ; (8032d6c <LwIP_DHCP_task+0x148>)
  61995. 8032d36: 6818 ldr r0, [r3, #0]
  61996. 8032d38: f7f5 fc4e bl 80285d8 <vTaskDelete>
  61997. else
  61998. {
  61999. /* DHCP timeout */
  62000. if (xnetif.dhcp->tries > MAX_DHCP_TRIES)
  62001. {
  62002. DHCP_state = DHCP_TIMEOUT;
  62003. 8032d3c: 2403 movs r4, #3
  62004. break;
  62005. default: break;
  62006. }
  62007. vTaskDelay(250);
  62008. 8032d3e: 20fa movs r0, #250 ; 0xfa
  62009. 8032d40: f7f5 fe08 bl 8028954 <vTaskDelay>
  62010. }
  62011. 8032d44: e772 b.n 8032c2c <LwIP_DHCP_task+0x8>
  62012. 8032d46: bf00 nop
  62013. 8032d48: 2000e874 .word 0x2000e874
  62014. 8032d4c: 20010f28 .word 0x20010f28
  62015. 8032d50: 08033e44 .word 0x08033e44
  62016. 8032d54: 2000e876 .word 0x2000e876
  62017. 8032d58: 2000e894 .word 0x2000e894
  62018. 8032d5c: 2000e885 .word 0x2000e885
  62019. 8032d60: 2000e8a4 .word 0x2000e8a4
  62020. 8032d64: 2000e8c2 .word 0x2000e8c2
  62021. 8032d68: 2000e8b3 .word 0x2000e8b3
  62022. 8032d6c: 2000e4a4 .word 0x2000e4a4
  62023. 08032d70 <LwIP_Init>:
  62024. TaskHandle_t xHandleWebReinit = NULL;
  62025. bool dhcp = false;
  62026. void LwIP_Init(void)
  62027. {
  62028. 8032d70: b530 push {r4, r5, lr}
  62029. struct ip_addr ipaddr;
  62030. struct ip_addr netmask;
  62031. struct ip_addr gw;
  62032. char str[20];
  62033. tcpip_init( NULL, NULL );
  62034. 8032d72: 2000 movs r0, #0
  62035. sSettings.sFlags.netsettingsChanged = false;
  62036. 8032d74: 4c36 ldr r4, [pc, #216] ; (8032e50 <LwIP_Init+0xe0>)
  62037. TaskHandle_t xHandleWebReinit = NULL;
  62038. bool dhcp = false;
  62039. void LwIP_Init(void)
  62040. {
  62041. 8032d76: b08d sub sp, #52 ; 0x34
  62042. struct ip_addr ipaddr;
  62043. struct ip_addr netmask;
  62044. struct ip_addr gw;
  62045. char str[20];
  62046. tcpip_init( NULL, NULL );
  62047. 8032d78: 4601 mov r1, r0
  62048. 8032d7a: f7f7 f909 bl 8029f90 <tcpip_init>
  62049. }
  62050. }
  62051. /* Настройки не менялись, используем обычне настройки из флеш памяти */
  62052. else
  62053. {
  62054. if (sSettings.sWebParams.dhcpEnable)
  62055. 8032d7e: f894 502f ldrb.w r5, [r4, #47] ; 0x2f
  62056. struct ip_addr netmask;
  62057. struct ip_addr gw;
  62058. char str[20];
  62059. tcpip_init( NULL, NULL );
  62060. sSettings.sFlags.netsettingsChanged = false;
  62061. 8032d82: 2300 movs r3, #0
  62062. 8032d84: f884 32ce strb.w r3, [r4, #718] ; 0x2ce
  62063. }
  62064. }
  62065. /* Настройки не менялись, используем обычне настройки из флеш памяти */
  62066. else
  62067. {
  62068. if (sSettings.sWebParams.dhcpEnable)
  62069. 8032d88: b125 cbz r5, 8032d94 <LwIP_Init+0x24>
  62070. {
  62071. ipaddr.addr = 0;
  62072. 8032d8a: 9304 str r3, [sp, #16]
  62073. netmask.addr = 0;
  62074. 8032d8c: 9305 str r3, [sp, #20]
  62075. gw.addr = 0;
  62076. 8032d8e: 9306 str r3, [sp, #24]
  62077. netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);
  62078. 8032d90: 9300 str r3, [sp, #0]
  62079. 8032d92: e028 b.n 8032de6 <LwIP_Init+0x76>
  62080. netif_set_default(&xnetif);
  62081. netif_set_up(&xnetif);
  62082. }
  62083. else
  62084. {
  62085. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  62086. 8032d94: 1ca0 adds r0, r4, #2
  62087. 8032d96: f7fb f98c bl 802e0b2 <ipaddr_addr>
  62088. 8032d9a: 9004 str r0, [sp, #16]
  62089. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  62090. 8032d9c: f104 0020 add.w r0, r4, #32
  62091. 8032da0: f7fb f987 bl 802e0b2 <ipaddr_addr>
  62092. 8032da4: 9005 str r0, [sp, #20]
  62093. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  62094. 8032da6: f104 0011 add.w r0, r4, #17
  62095. 8032daa: f7fb f982 bl 802e0b2 <ipaddr_addr>
  62096. /* Обновляем временные настройки */
  62097. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  62098. 8032dae: f894 302f ldrb.w r3, [r4, #47] ; 0x2f
  62099. }
  62100. else
  62101. {
  62102. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  62103. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  62104. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  62105. 8032db2: 9006 str r0, [sp, #24]
  62106. /* Обновляем временные настройки */
  62107. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  62108. strcpy(sSettings.sWebTempParams.ip, sSettings.sWebParams.ip);
  62109. 8032db4: 1ca1 adds r1, r4, #2
  62110. 8032db6: f104 0030 add.w r0, r4, #48 ; 0x30
  62111. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  62112. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  62113. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  62114. /* Обновляем временные настройки */
  62115. sSettings.sWebTempParams.dhcpEnable = sSettings.sWebParams.dhcpEnable;
  62116. 8032dba: f884 305d strb.w r3, [r4, #93] ; 0x5d
  62117. strcpy(sSettings.sWebTempParams.ip, sSettings.sWebParams.ip);
  62118. 8032dbe: f7ee fe75 bl 8021aac <strcpy>
  62119. strcpy(sSettings.sWebTempParams.mask, sSettings.sWebParams.mask);
  62120. 8032dc2: f104 0120 add.w r1, r4, #32
  62121. 8032dc6: f104 004e add.w r0, r4, #78 ; 0x4e
  62122. 8032dca: f7ee fe6f bl 8021aac <strcpy>
  62123. strcpy(sSettings.sWebTempParams.gate, sSettings.sWebParams.gate);
  62124. 8032dce: f104 0111 add.w r1, r4, #17
  62125. 8032dd2: f104 003f add.w r0, r4, #63 ; 0x3f
  62126. 8032dd6: f7ee fe69 bl 8021aac <strcpy>
  62127. sprintf(str, " %s\n\r", sSettings.sWebParams.ip);
  62128. 8032dda: a807 add r0, sp, #28
  62129. 8032ddc: 491d ldr r1, [pc, #116] ; (8032e54 <LwIP_Init+0xe4>)
  62130. 8032dde: 1ca2 adds r2, r4, #2
  62131. 8032de0: f7f4 f9fc bl 80271dc <tfp_sprintf>
  62132. PRINT_USART("\n\rStatic IP address \n\r");
  62133. PRINT_USART(str);
  62134. netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);
  62135. 8032de4: 9500 str r5, [sp, #0]
  62136. 8032de6: 4b1c ldr r3, [pc, #112] ; (8032e58 <LwIP_Init+0xe8>)
  62137. 8032de8: 481c ldr r0, [pc, #112] ; (8032e5c <LwIP_Init+0xec>)
  62138. 8032dea: 9301 str r3, [sp, #4]
  62139. 8032dec: 4b1c ldr r3, [pc, #112] ; (8032e60 <LwIP_Init+0xf0>)
  62140. 8032dee: a904 add r1, sp, #16
  62141. 8032df0: aa05 add r2, sp, #20
  62142. 8032df2: 9302 str r3, [sp, #8]
  62143. 8032df4: ab06 add r3, sp, #24
  62144. 8032df6: f7f8 f995 bl 802b124 <netif_add>
  62145. netif_set_default(&xnetif);
  62146. 8032dfa: 4818 ldr r0, [pc, #96] ; (8032e5c <LwIP_Init+0xec>)
  62147. 8032dfc: f7f8 f9ba bl 802b174 <netif_set_default>
  62148. netif_set_up(&xnetif);
  62149. 8032e00: 4816 ldr r0, [pc, #88] ; (8032e5c <LwIP_Init+0xec>)
  62150. 8032e02: f7f8 f9c7 bl 802b194 <netif_set_up>
  62151. }
  62152. if (sSettings.sWebParams.dhcpEnable) {
  62153. 8032e06: 4b12 ldr r3, [pc, #72] ; (8032e50 <LwIP_Init+0xe0>)
  62154. 8032e08: f893 302f ldrb.w r3, [r3, #47] ; 0x2f
  62155. 8032e0c: b17b cbz r3, 8032e2e <LwIP_Init+0xbe>
  62156. xTaskCreate(LwIP_DHCP_task, "DHCPClient", configMINIMAL_STACK_SIZE * 2, NULL,
  62157. 8032e0e: 2302 movs r3, #2
  62158. 8032e10: 9300 str r3, [sp, #0]
  62159. 8032e12: 4b14 ldr r3, [pc, #80] ; (8032e64 <LwIP_Init+0xf4>)
  62160. 8032e14: 4814 ldr r0, [pc, #80] ; (8032e68 <LwIP_Init+0xf8>)
  62161. 8032e16: 9301 str r3, [sp, #4]
  62162. 8032e18: 2300 movs r3, #0
  62163. 8032e1a: 9302 str r3, [sp, #8]
  62164. 8032e1c: 9303 str r3, [sp, #12]
  62165. 8032e1e: f44f 7280 mov.w r2, #256 ; 0x100
  62166. 8032e22: 4912 ldr r1, [pc, #72] ; (8032e6c <LwIP_Init+0xfc>)
  62167. 8032e24: f7f5 fb00 bl 8028428 <xTaskGenericCreate>
  62168. tskIDLE_PRIORITY + 2, &xHandleDHCP);
  62169. dhcp = true;
  62170. 8032e28: 4b11 ldr r3, [pc, #68] ; (8032e70 <LwIP_Init+0x100>)
  62171. 8032e2a: 2201 movs r2, #1
  62172. 8032e2c: 701a strb r2, [r3, #0]
  62173. }
  62174. }
  62175. /* Если настройки изменились, запускаем задачу по отсчету времени реакции пользователя*/
  62176. if (sSettings.sFlags.netsettingsChanged == true)
  62177. 8032e2e: 4b08 ldr r3, [pc, #32] ; (8032e50 <LwIP_Init+0xe0>)
  62178. 8032e30: f893 32ce ldrb.w r3, [r3, #718] ; 0x2ce
  62179. 8032e34: b153 cbz r3, 8032e4c <LwIP_Init+0xdc>
  62180. xTaskCreate(vTaskWebReinit, "webReinit", configMINIMAL_STACK_SIZE, NULL,
  62181. 8032e36: 4a0f ldr r2, [pc, #60] ; (8032e74 <LwIP_Init+0x104>)
  62182. 8032e38: 480f ldr r0, [pc, #60] ; (8032e78 <LwIP_Init+0x108>)
  62183. 8032e3a: 9201 str r2, [sp, #4]
  62184. 8032e3c: 2300 movs r3, #0
  62185. 8032e3e: 9300 str r3, [sp, #0]
  62186. 8032e40: 9302 str r3, [sp, #8]
  62187. 8032e42: 9303 str r3, [sp, #12]
  62188. 8032e44: 490d ldr r1, [pc, #52] ; (8032e7c <LwIP_Init+0x10c>)
  62189. 8032e46: 2280 movs r2, #128 ; 0x80
  62190. 8032e48: f7f5 faee bl 8028428 <xTaskGenericCreate>
  62191. tskIDLE_PRIORITY, &xHandleWebReinit);
  62192. }
  62193. 8032e4c: b00d add sp, #52 ; 0x34
  62194. 8032e4e: bd30 pop {r4, r5, pc}
  62195. 8032e50: 2000e874 .word 0x2000e874
  62196. 8032e54: 0803b53e .word 0x0803b53e
  62197. 8032e58: 08032915 .word 0x08032915
  62198. 8032e5c: 20010f28 .word 0x20010f28
  62199. 8032e60: 08029f51 .word 0x08029f51
  62200. 8032e64: 2000e4a4 .word 0x2000e4a4
  62201. 8032e68: 08032c25 .word 0x08032c25
  62202. 8032e6c: 0803b544 .word 0x0803b544
  62203. 8032e70: 2000e49c .word 0x2000e49c
  62204. 8032e74: 2000e4a0 .word 0x2000e4a0
  62205. 8032e78: 08032b7d .word 0x08032b7d
  62206. 8032e7c: 0803b54f .word 0x0803b54f
  62207. 08032e80 <GetStateWebReinit>:
  62208. /**
  62209. * @brief Возвращает true если сетевые параметры изменились
  62210. */
  62211. bool GetStateWebReinit(void)
  62212. {
  62213. 8032e80: b510 push {r4, lr}
  62214. /* Статус dhcp изменился? */
  62215. if (sSettings.sWebParams.dhcpEnable != sSettings.sWebTempParams.dhcpEnable)
  62216. 8032e82: 4c12 ldr r4, [pc, #72] ; (8032ecc <GetStateWebReinit+0x4c>)
  62217. 8032e84: f894 202f ldrb.w r2, [r4, #47] ; 0x2f
  62218. 8032e88: f894 305d ldrb.w r3, [r4, #93] ; 0x5d
  62219. 8032e8c: 429a cmp r2, r3
  62220. 8032e8e: d004 beq.n 8032e9a <GetStateWebReinit+0x1a>
  62221. {
  62222. /* Включили dhcp */
  62223. if (sSettings.sWebTempParams.dhcpEnable == 1)
  62224. {
  62225. /* Устанавилваем флаг */
  62226. SetWebReinitFlag(true);
  62227. 8032e90: 2001 movs r0, #1
  62228. 8032e92: f7f4 fb85 bl 80275a0 <SetWebReinitFlag>
  62229. return true;
  62230. 8032e96: 2001 movs r0, #1
  62231. 8032e98: bd10 pop {r4, pc}
  62232. return true;
  62233. }
  62234. }
  62235. /* Изменился IP? */
  62236. if (strstr(sSettings.sWebParams.ip, sSettings.sWebTempParams.ip) == 0)
  62237. 8032e9a: 1ca0 adds r0, r4, #2
  62238. 8032e9c: f104 0130 add.w r1, r4, #48 ; 0x30
  62239. 8032ea0: f7ef f8e2 bl 8022068 <strstr>
  62240. 8032ea4: 2800 cmp r0, #0
  62241. 8032ea6: d0f3 beq.n 8032e90 <GetStateWebReinit+0x10>
  62242. SetWebReinitFlag(true);
  62243. return true;
  62244. }
  62245. /* Изменился шлюз? */
  62246. if (strstr(sSettings.sWebParams.gate, sSettings.sWebTempParams.gate) == 0)
  62247. 8032ea8: f104 0011 add.w r0, r4, #17
  62248. 8032eac: f104 013f add.w r1, r4, #63 ; 0x3f
  62249. 8032eb0: f7ef f8da bl 8022068 <strstr>
  62250. 8032eb4: 2800 cmp r0, #0
  62251. 8032eb6: d0eb beq.n 8032e90 <GetStateWebReinit+0x10>
  62252. SetWebReinitFlag(true);
  62253. return true;
  62254. }
  62255. /* Изменилась маска? */
  62256. if (strstr(sSettings.sWebParams.mask, sSettings.sWebTempParams.mask) == 0)
  62257. 8032eb8: f104 0020 add.w r0, r4, #32
  62258. 8032ebc: f104 014e add.w r1, r4, #78 ; 0x4e
  62259. 8032ec0: f7ef f8d2 bl 8022068 <strstr>
  62260. 8032ec4: 2800 cmp r0, #0
  62261. 8032ec6: d0e3 beq.n 8032e90 <GetStateWebReinit+0x10>
  62262. /* Устанавилваем флаг */
  62263. SetWebReinitFlag(true);
  62264. return true;
  62265. }
  62266. return false;
  62267. 8032ec8: 2000 movs r0, #0
  62268. }
  62269. 8032eca: bd10 pop {r4, pc}
  62270. 8032ecc: 2000e874 .word 0x2000e874
  62271. 08032ed0 <signals_set_test>:
  62272. {
  62273. u8_t id, set_ok;
  62274. LWIP_UNUSED_ARG(value);
  62275. set_ok = 0;
  62276. id = od->id_inst_ptr[0];
  62277. 8032ed0: 6883 ldr r3, [r0, #8]
  62278. switch (id)
  62279. 8032ed2: 781b ldrb r3, [r3, #0]
  62280. 8032ed4: 2b02 cmp r3, #2
  62281. 8032ed6: d001 beq.n 8032edc <signals_set_test+0xc>
  62282. 8032ed8: 2b03 cmp r3, #3
  62283. 8032eda: d103 bne.n 8032ee4 <signals_set_test+0x14>
  62284. static u8_t signals_set_test (struct obj_def *od, u16_t len, void *value)
  62285. {
  62286. u8_t id, set_ok;
  62287. LWIP_UNUSED_ARG(value);
  62288. set_ok = 0;
  62289. 8032edc: 1f0b subs r3, r1, #4
  62290. 8032ede: 4258 negs r0, r3
  62291. 8032ee0: 4158 adcs r0, r3
  62292. 8032ee2: 4770 bx lr
  62293. 8032ee4: 2000 movs r0, #0
  62294. }
  62295. break;
  62296. };
  62297. return set_ok;
  62298. }
  62299. 8032ee6: 4770 bx lr
  62300. 08032ee8 <signals_get_value>:
  62301. \param len - длина переменной в байтах
  62302. \param value - указатель на значение переменной
  62303. \return нет
  62304. ------------------------------------------------------------------------------*/
  62305. static void signals_get_value (struct obj_def *od, u16_t len, void *value)
  62306. {
  62307. 8032ee8: 4613 mov r3, r2
  62308. u8_t id;
  62309. id = od->id_inst_ptr[0];
  62310. 8032eea: 6882 ldr r2, [r0, #8]
  62311. switch (id)
  62312. 8032eec: 7812 ldrb r2, [r2, #0]
  62313. 8032eee: 3a01 subs r2, #1
  62314. \param len - длина переменной в байтах
  62315. \param value - указатель на значение переменной
  62316. \return нет
  62317. ------------------------------------------------------------------------------*/
  62318. static void signals_get_value (struct obj_def *od, u16_t len, void *value)
  62319. {
  62320. 8032ef0: b510 push {r4, lr}
  62321. 8032ef2: 460c mov r4, r1
  62322. u8_t id;
  62323. id = od->id_inst_ptr[0];
  62324. switch (id)
  62325. 8032ef4: 2a0c cmp r2, #12
  62326. 8032ef6: d812 bhi.n 8032f1e <signals_get_value+0x36>
  62327. 8032ef8: e8df f002 tbb [pc, r2]
  62328. 8032efc: 0a07070a .word 0x0a07070a
  62329. 8032f00: 0a0a0a0a .word 0x0a0a0a0a
  62330. 8032f04: 0a0a0a0a .word 0x0a0a0a0a
  62331. 8032f08: 0a .byte 0x0a
  62332. 8032f09: 00 .byte 0x00
  62333. break;
  62334. case 2: /* RestoreSignal */
  62335. *((s32_t*)value) = 0;
  62336. break;
  62337. case 3: /* RebootSignal */
  62338. *((s32_t*)value) = 0;
  62339. 8032f0a: 2200 movs r2, #0
  62340. 8032f0c: 601a str r2, [r3, #0]
  62341. break;
  62342. 8032f0e: bd10 pop {r4, pc}
  62343. break;
  62344. case 12: /* BatCap */
  62345. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  62346. break;
  62347. case 13: /* ConnectMonitor */
  62348. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  62349. 8032f10: 4903 ldr r1, [pc, #12] ; (8032f20 <signals_get_value+0x38>)
  62350. 8032f12: 4618 mov r0, r3
  62351. 8032f14: 4622 mov r2, r4
  62352. break;
  62353. default :
  62354. break;
  62355. };
  62356. }
  62357. 8032f16: e8bd 4010 ldmia.w sp!, {r4, lr}
  62358. break;
  62359. case 12: /* BatCap */
  62360. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  62361. break;
  62362. case 13: /* ConnectMonitor */
  62363. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  62364. 8032f1a: f7fc bb77 b.w 802f60c <ocstrncpy>
  62365. 8032f1e: bd10 pop {r4, pc}
  62366. 8032f20: 20011074 .word 0x20011074
  62367. 08032f24 <signals_get_object_def>:
  62368. u8_t id;
  62369. /* return to object name, adding index depth (1) */
  62370. ident_len += 1;
  62371. ident -= 1;
  62372. if (ident_len == 2)
  62373. 8032f24: 2801 cmp r0, #1
  62374. \param ident - points to objectname.0 (object id trailer)
  62375. \param od - points to object definition. указатель на описание переменной
  62376. \return нет
  62377. ------------------------------------------------------------------------------*/
  62378. static void signals_get_object_def (u8_t ident_len, s32_t *ident, struct obj_def *od)
  62379. {
  62380. 8032f26: b538 push {r3, r4, r5, lr}
  62381. 8032f28: 4614 mov r4, r2
  62382. u8_t id;
  62383. /* return to object name, adding index depth (1) */
  62384. ident_len += 1;
  62385. ident -= 1;
  62386. if (ident_len == 2)
  62387. 8032f2a: d16b bne.n 8033004 <signals_get_object_def+0xe0>
  62388. {
  62389. od->id_inst_len = ident_len;
  62390. 8032f2c: 2302 movs r3, #2
  62391. 8032f2e: 7193 strb r3, [r2, #6]
  62392. {
  62393. u8_t id;
  62394. /* return to object name, adding index depth (1) */
  62395. ident_len += 1;
  62396. ident -= 1;
  62397. 8032f30: 1f0b subs r3, r1, #4
  62398. if (ident_len == 2)
  62399. {
  62400. od->id_inst_len = ident_len;
  62401. od->id_inst_ptr = ident;
  62402. 8032f32: 6093 str r3, [r2, #8]
  62403. id = ident[0];
  62404. switch (id)
  62405. 8032f34: f811 3c04 ldrb.w r3, [r1, #-4]
  62406. 8032f38: 3b01 subs r3, #1
  62407. 8032f3a: 2b0c cmp r3, #12
  62408. 8032f3c: d862 bhi.n 8033004 <signals_get_object_def+0xe0>
  62409. 8032f3e: e8df f003 tbb [pc, r3]
  62410. 8032f42: 0d07 .short 0x0d07
  62411. 8032f44: 2a241e12 .word 0x2a241e12
  62412. 8032f48: 423c3630 .word 0x423c3630
  62413. 8032f4c: 4e48 .short 0x4e48
  62414. 8032f4e: 54 .byte 0x54
  62415. 8032f4f: 00 .byte 0x00
  62416. {
  62417. case 1: /* FWVersion */
  62418. GetVersionStr(paramStr, &paramLength);
  62419. 8032f50: 4d2e ldr r5, [pc, #184] ; (803300c <signals_get_object_def+0xe8>)
  62420. 8032f52: 482f ldr r0, [pc, #188] ; (8033010 <signals_get_object_def+0xec>)
  62421. 8032f54: 4629 mov r1, r5
  62422. 8032f56: f7f4 f9d5 bl 8027304 <GetVersionStr>
  62423. 8032f5a: e04b b.n 8032ff4 <signals_get_object_def+0xd0>
  62424. od->access = MIB_OBJECT_READ_ONLY;
  62425. od->asn_type = SNMP_ASN1_OC_STR;
  62426. od->v_len = paramLength;
  62427. break;
  62428. case 2: /* RestoreSignal */
  62429. GetRestore(paramStr, &paramLength);
  62430. 8032f5c: 482c ldr r0, [pc, #176] ; (8033010 <signals_get_object_def+0xec>)
  62431. 8032f5e: 492b ldr r1, [pc, #172] ; (803300c <signals_get_object_def+0xe8>)
  62432. 8032f60: f7f4 fae2 bl 8027528 <GetRestore>
  62433. 8032f64: e003 b.n 8032f6e <signals_get_object_def+0x4a>
  62434. od->access = MIB_OBJECT_READ_WRITE;
  62435. od->asn_type = SNMP_ASN1_INTEG;
  62436. od->v_len = sizeof(s32_t);
  62437. break;
  62438. case 3: /* RebootSignal */
  62439. GetReboot(paramStr, &paramLength);
  62440. 8032f66: 482a ldr r0, [pc, #168] ; (8033010 <signals_get_object_def+0xec>)
  62441. 8032f68: 4928 ldr r1, [pc, #160] ; (803300c <signals_get_object_def+0xe8>)
  62442. 8032f6a: f7f4 faeb bl 8027544 <GetReboot>
  62443. od->instance = MIB_OBJECT_SCALAR;
  62444. 8032f6e: 2301 movs r3, #1
  62445. 8032f70: 7023 strb r3, [r4, #0]
  62446. od->access = MIB_OBJECT_READ_WRITE;
  62447. 8032f72: 2303 movs r3, #3
  62448. 8032f74: 7063 strb r3, [r4, #1]
  62449. od->asn_type = SNMP_ASN1_INTEG;
  62450. 8032f76: 2302 movs r3, #2
  62451. 8032f78: 70a3 strb r3, [r4, #2]
  62452. od->v_len = sizeof(s32_t);
  62453. 8032f7a: 2304 movs r3, #4
  62454. 8032f7c: e040 b.n 8033000 <signals_get_object_def+0xdc>
  62455. break;
  62456. case 4: /* IntTemp */
  62457. GetInternalTempStr(paramStr, &paramLength);
  62458. 8032f7e: 4d23 ldr r5, [pc, #140] ; (803300c <signals_get_object_def+0xe8>)
  62459. 8032f80: 4823 ldr r0, [pc, #140] ; (8033010 <signals_get_object_def+0xec>)
  62460. 8032f82: 4629 mov r1, r5
  62461. 8032f84: f7f4 f964 bl 8027250 <GetInternalTempStr>
  62462. 8032f88: e034 b.n 8032ff4 <signals_get_object_def+0xd0>
  62463. od->access = MIB_OBJECT_READ_ONLY;
  62464. od->asn_type = SNMP_ASN1_OC_STR;
  62465. od->v_len = paramLength;
  62466. break;
  62467. case 5: /* LineFailBit */
  62468. GetLineFailBitStr(paramStr, &paramLength);
  62469. 8032f8a: 4d20 ldr r5, [pc, #128] ; (803300c <signals_get_object_def+0xe8>)
  62470. 8032f8c: 4820 ldr r0, [pc, #128] ; (8033010 <signals_get_object_def+0xec>)
  62471. 8032f8e: 4629 mov r1, r5
  62472. 8032f90: f7f4 f930 bl 80271f4 <GetLineFailBitStr>
  62473. 8032f94: e02e b.n 8032ff4 <signals_get_object_def+0xd0>
  62474. od->access = MIB_OBJECT_READ_ONLY;
  62475. od->asn_type = SNMP_ASN1_OC_STR;
  62476. od->v_len = paramLength;
  62477. break;
  62478. case 6: /* LowBatBit */
  62479. GetLowBatteryBitStr(paramStr, &paramLength);
  62480. 8032f96: 4d1d ldr r5, [pc, #116] ; (803300c <signals_get_object_def+0xe8>)
  62481. 8032f98: 481d ldr r0, [pc, #116] ; (8033010 <signals_get_object_def+0xec>)
  62482. 8032f9a: 4629 mov r1, r5
  62483. 8032f9c: f7f4 f92d bl 80271fa <GetLowBatteryBitStr>
  62484. 8032fa0: e028 b.n 8032ff4 <signals_get_object_def+0xd0>
  62485. od->access = MIB_OBJECT_READ_ONLY;
  62486. od->asn_type = SNMP_ASN1_OC_STR;
  62487. od->v_len = paramLength;
  62488. break;
  62489. case 7: /* InFreq */
  62490. GetInputFreqStr(paramStr, &paramLength);
  62491. 8032fa2: 4d1a ldr r5, [pc, #104] ; (803300c <signals_get_object_def+0xe8>)
  62492. 8032fa4: 481a ldr r0, [pc, #104] ; (8033010 <signals_get_object_def+0xec>)
  62493. 8032fa6: 4629 mov r1, r5
  62494. 8032fa8: f7f4 f928 bl 80271fc <GetInputFreqStr>
  62495. 8032fac: e022 b.n 8032ff4 <signals_get_object_def+0xd0>
  62496. od->access = MIB_OBJECT_READ_ONLY;
  62497. od->asn_type = SNMP_ASN1_OC_STR;
  62498. od->v_len = paramLength;
  62499. break;
  62500. case 8: /* OutFreq */
  62501. GetOutputFreqStr(paramStr, &paramLength);
  62502. 8032fae: 4d17 ldr r5, [pc, #92] ; (803300c <signals_get_object_def+0xe8>)
  62503. 8032fb0: 4817 ldr r0, [pc, #92] ; (8033010 <signals_get_object_def+0xec>)
  62504. 8032fb2: 4629 mov r1, r5
  62505. 8032fb4: f7f4 f928 bl 8027208 <GetOutputFreqStr>
  62506. 8032fb8: e01c b.n 8032ff4 <signals_get_object_def+0xd0>
  62507. od->access = MIB_OBJECT_READ_ONLY;
  62508. od->asn_type = SNMP_ASN1_OC_STR;
  62509. od->v_len = paramLength;
  62510. break;
  62511. case 9: /* InVoltVAC */
  62512. GetInputVoltageStr(paramStr, &paramLength);
  62513. 8032fba: 4d14 ldr r5, [pc, #80] ; (803300c <signals_get_object_def+0xe8>)
  62514. 8032fbc: 4814 ldr r0, [pc, #80] ; (8033010 <signals_get_object_def+0xec>)
  62515. 8032fbe: 4629 mov r1, r5
  62516. 8032fc0: f7f4 f928 bl 8027214 <GetInputVoltageStr>
  62517. 8032fc4: e016 b.n 8032ff4 <signals_get_object_def+0xd0>
  62518. od->access = MIB_OBJECT_READ_ONLY;
  62519. od->asn_type = SNMP_ASN1_OC_STR;
  62520. od->v_len = paramLength;
  62521. break;
  62522. case 10: /* OutVoltVAC */
  62523. GetOutputVoltageStr(paramStr, &paramLength);
  62524. 8032fc6: 4d11 ldr r5, [pc, #68] ; (803300c <signals_get_object_def+0xe8>)
  62525. 8032fc8: 4811 ldr r0, [pc, #68] ; (8033010 <signals_get_object_def+0xec>)
  62526. 8032fca: 4629 mov r1, r5
  62527. 8032fcc: f7f4 f928 bl 8027220 <GetOutputVoltageStr>
  62528. 8032fd0: e010 b.n 8032ff4 <signals_get_object_def+0xd0>
  62529. od->access = MIB_OBJECT_READ_ONLY;
  62530. od->asn_type = SNMP_ASN1_OC_STR;
  62531. od->v_len = paramLength;
  62532. break;
  62533. case 11: /* Power */
  62534. GetPowerStr(paramStr, &paramLength);
  62535. 8032fd2: 4d0e ldr r5, [pc, #56] ; (803300c <signals_get_object_def+0xe8>)
  62536. 8032fd4: 480e ldr r0, [pc, #56] ; (8033010 <signals_get_object_def+0xec>)
  62537. 8032fd6: 4629 mov r1, r5
  62538. 8032fd8: f7f4 f928 bl 802722c <GetPowerStr>
  62539. 8032fdc: e00a b.n 8032ff4 <signals_get_object_def+0xd0>
  62540. od->access = MIB_OBJECT_READ_ONLY;
  62541. od->asn_type = SNMP_ASN1_OC_STR;
  62542. od->v_len = paramLength;
  62543. break;
  62544. case 12: /* BatCap */
  62545. GetBatCapacityStr(paramStr, &paramLength);
  62546. 8032fde: 4d0b ldr r5, [pc, #44] ; (803300c <signals_get_object_def+0xe8>)
  62547. 8032fe0: 480b ldr r0, [pc, #44] ; (8033010 <signals_get_object_def+0xec>)
  62548. 8032fe2: 4629 mov r1, r5
  62549. 8032fe4: f7f4 f928 bl 8027238 <GetBatCapacityStr>
  62550. 8032fe8: e004 b.n 8032ff4 <signals_get_object_def+0xd0>
  62551. od->access = MIB_OBJECT_READ_ONLY;
  62552. od->asn_type = SNMP_ASN1_OC_STR;
  62553. od->v_len = paramLength;
  62554. break;
  62555. case 13: /* ConnectMonitor */
  62556. GetConnectMonitorStr(paramStr, &paramLength);
  62557. 8032fea: 4d08 ldr r5, [pc, #32] ; (803300c <signals_get_object_def+0xe8>)
  62558. 8032fec: 4808 ldr r0, [pc, #32] ; (8033010 <signals_get_object_def+0xec>)
  62559. 8032fee: 4629 mov r1, r5
  62560. 8032ff0: f7f4 f93a bl 8027268 <GetConnectMonitorStr>
  62561. od->instance = MIB_OBJECT_SCALAR;
  62562. 8032ff4: 2301 movs r3, #1
  62563. 8032ff6: 7023 strb r3, [r4, #0]
  62564. od->access = MIB_OBJECT_READ_ONLY;
  62565. 8032ff8: 7063 strb r3, [r4, #1]
  62566. od->asn_type = SNMP_ASN1_OC_STR;
  62567. 8032ffa: 2304 movs r3, #4
  62568. 8032ffc: 70a3 strb r3, [r4, #2]
  62569. od->v_len = paramLength;
  62570. 8032ffe: 782b ldrb r3, [r5, #0]
  62571. 8033000: 80a3 strh r3, [r4, #4]
  62572. break;
  62573. 8033002: bd38 pop {r3, r4, r5, pc}
  62574. };
  62575. }
  62576. else
  62577. {
  62578. LWIP_DEBUGF(SNMP_MIB_DEBUG,("planar_get_object_def: no scalar\n"));
  62579. od->instance = MIB_OBJECT_NONE;
  62580. 8033004: 2300 movs r3, #0
  62581. 8033006: 7023 strb r3, [r4, #0]
  62582. 8033008: bd38 pop {r3, r4, r5, pc}
  62583. 803300a: bf00 nop
  62584. 803300c: 2000e4a8 .word 0x2000e4a8
  62585. 8033010: 20011074 .word 0x20011074
  62586. 08033014 <signals_set_value>:
  62587. \param len - длина переменной в байтах
  62588. \param value - указатель на значение переменной
  62589. \return нет
  62590. ------------------------------------------------------------------------------*/
  62591. static void signals_set_value (struct obj_def *od, u16_t len, void *value)
  62592. {
  62593. 8033014: b508 push {r3, lr}
  62594. u8_t id;
  62595. uint32_t val;
  62596. id = od->id_inst_ptr[0];
  62597. val = *((s32_t*)value);
  62598. 8033016: 6813 ldr r3, [r2, #0]
  62599. static void signals_set_value (struct obj_def *od, u16_t len, void *value)
  62600. {
  62601. u8_t id;
  62602. uint32_t val;
  62603. id = od->id_inst_ptr[0];
  62604. 8033018: 6882 ldr r2, [r0, #8]
  62605. val = *((s32_t*)value);
  62606. switch (id)
  62607. 803301a: 7812 ldrb r2, [r2, #0]
  62608. 803301c: 2a02 cmp r2, #2
  62609. 803301e: d002 beq.n 8033026 <signals_set_value+0x12>
  62610. 8033020: 2a03 cmp r2, #3
  62611. 8033022: d110 bne.n 8033046 <signals_set_value+0x32>
  62612. 8033024: e008 b.n 8033038 <signals_set_value+0x24>
  62613. {
  62614. case 2: /* RestoreSignal */
  62615. if (val == 1) {
  62616. 8033026: 2b01 cmp r3, #1
  62617. 8033028: d10d bne.n 8033046 <signals_set_value+0x32>
  62618. SNMP_SendUserTrap(DEVICE_RESTORED);
  62619. 803302a: 2003 movs r0, #3
  62620. 803302c: f000 f80c bl 8033048 <SNMP_SendUserTrap>
  62621. break;
  62622. default :
  62623. break;
  62624. };
  62625. }
  62626. 8033030: e8bd 4008 ldmia.w sp!, {r3, lr}
  62627. switch (id)
  62628. {
  62629. case 2: /* RestoreSignal */
  62630. if (val == 1) {
  62631. SNMP_SendUserTrap(DEVICE_RESTORED);
  62632. HTTP_ResetSettings();
  62633. 8033034: f7f6 bf22 b.w 8029e7c <HTTP_ResetSettings>
  62634. }
  62635. break;
  62636. case 3: /* RebootSignal */
  62637. if (val == 1)
  62638. 8033038: 2b01 cmp r3, #1
  62639. 803303a: d104 bne.n 8033046 <signals_set_value+0x32>
  62640. HTTP_StartResetTask(false);
  62641. 803303c: 2000 movs r0, #0
  62642. break;
  62643. default :
  62644. break;
  62645. };
  62646. }
  62647. 803303e: e8bd 4008 ldmia.w sp!, {r3, lr}
  62648. HTTP_ResetSettings();
  62649. }
  62650. break;
  62651. case 3: /* RebootSignal */
  62652. if (val == 1)
  62653. HTTP_StartResetTask(false);
  62654. 8033042: f7f6 bf2b b.w 8029e9c <HTTP_StartResetTask>
  62655. 8033046: bd08 pop {r3, pc}
  62656. 08033048 <SNMP_SendUserTrap>:
  62657. * FIFO буфера.
  62658. * Если в настройках трапа отправка отключена, то трап игнорируется.
  62659. * @retval
  62660. */
  62661. void SNMP_SendUserTrap(uint8_t trapName)
  62662. {
  62663. 8033048: b51f push {r0, r1, r2, r3, r4, lr}
  62664. uint16_t availableSpace;
  62665. uint8_t dummyTrap;
  62666. if (traps[trapName].trapEnable)
  62667. 803304a: 4b0d ldr r3, [pc, #52] ; (8033080 <SNMP_SendUserTrap+0x38>)
  62668. * FIFO буфера.
  62669. * Если в настройках трапа отправка отключена, то трап игнорируется.
  62670. * @retval
  62671. */
  62672. void SNMP_SendUserTrap(uint8_t trapName)
  62673. {
  62674. 803304c: f88d 0007 strb.w r0, [sp, #7]
  62675. uint16_t availableSpace;
  62676. uint8_t dummyTrap;
  62677. if (traps[trapName].trapEnable)
  62678. 8033050: eb03 00c0 add.w r0, r3, r0, lsl #3
  62679. 8033054: 78c3 ldrb r3, [r0, #3]
  62680. 8033056: b193 cbz r3, 803307e <SNMP_SendUserTrap+0x36>
  62681. {
  62682. availableSpace = uxQueueSpacesAvailable(SNMP_TrapQueue);
  62683. 8033058: 4c0a ldr r4, [pc, #40] ; (8033084 <SNMP_SendUserTrap+0x3c>)
  62684. 803305a: 6820 ldr r0, [r4, #0]
  62685. 803305c: f7f5 f99a bl 8028394 <uxQueueSpacesAvailable>
  62686. if (availableSpace == 0)
  62687. 8033060: b282 uxth r2, r0
  62688. 8033062: b92a cbnz r2, 8033070 <SNMP_SendUserTrap+0x28>
  62689. xQueueReceive(SNMP_TrapQueue, &dummyTrap, 0);
  62690. 8033064: 6820 ldr r0, [r4, #0]
  62691. 8033066: f10d 010f add.w r1, sp, #15
  62692. 803306a: 4613 mov r3, r2
  62693. 803306c: f7f5 f8fe bl 802826c <xQueueGenericReceive>
  62694. xQueueSend(SNMP_TrapQueue, &trapName, 0);
  62695. 8033070: 2200 movs r2, #0
  62696. 8033072: 6820 ldr r0, [r4, #0]
  62697. 8033074: f10d 0107 add.w r1, sp, #7
  62698. 8033078: 4613 mov r3, r2
  62699. 803307a: f7f4 ffc3 bl 8028004 <xQueueGenericSend>
  62700. }
  62701. }
  62702. 803307e: bd1f pop {r0, r1, r2, r3, r4, pc}
  62703. 8033080: 20011178 .word 0x20011178
  62704. 8033084: 20011174 .word 0x20011174
  62705. 08033088 <SNMP_SetObjDescr>:
  62706. * @brief Установить SNMP Descriptor
  62707. * @retval
  62708. */
  62709. // TODO
  62710. void SNMP_SetObjDescr(void)
  62711. {
  62712. 8033088: b538 push {r3, r4, r5, lr}
  62713. static uint8_t len;
  62714. strcpy(sSettings.sSnmp.sysDescr, sSettings.sSnmp.sysName);
  62715. 803308a: 4c15 ldr r4, [pc, #84] ; (80330e0 <SNMP_SetObjDescr+0x58>)
  62716. strcat(sSettings.sSnmp.sysDescr, " ");
  62717. 803308c: 4d15 ldr r5, [pc, #84] ; (80330e4 <SNMP_SetObjDescr+0x5c>)
  62718. // TODO
  62719. void SNMP_SetObjDescr(void)
  62720. {
  62721. static uint8_t len;
  62722. strcpy(sSettings.sSnmp.sysDescr, sSettings.sSnmp.sysName);
  62723. 803308e: f104 01fa add.w r1, r4, #250 ; 0xfa
  62724. 8033092: 4620 mov r0, r4
  62725. 8033094: f7ee fd0a bl 8021aac <strcpy>
  62726. strcat(sSettings.sSnmp.sysDescr, " ");
  62727. 8033098: 4629 mov r1, r5
  62728. 803309a: 4620 mov r0, r4
  62729. 803309c: f7ee fbf2 bl 8021884 <strcat>
  62730. strcat(sSettings.sSnmp.sysDescr, VERSION);
  62731. 80330a0: 4620 mov r0, r4
  62732. 80330a2: 4911 ldr r1, [pc, #68] ; (80330e8 <SNMP_SetObjDescr+0x60>)
  62733. 80330a4: f7ee fbee bl 8021884 <strcat>
  62734. strcat(sSettings.sSnmp.sysDescr, " ");
  62735. 80330a8: 4629 mov r1, r5
  62736. 80330aa: 4620 mov r0, r4
  62737. 80330ac: f7ee fbea bl 8021884 <strcat>
  62738. strcat(sSettings.sSnmp.sysDescr, sSettings.sSnmp.sysContact);
  62739. 80330b0: f104 01c8 add.w r1, r4, #200 ; 0xc8
  62740. 80330b4: 4620 mov r0, r4
  62741. 80330b6: f7ee fbe5 bl 8021884 <strcat>
  62742. strcat(sSettings.sSnmp.sysDescr, " ");
  62743. 80330ba: 4629 mov r1, r5
  62744. 80330bc: 4620 mov r0, r4
  62745. 80330be: f7ee fbe1 bl 8021884 <strcat>
  62746. strcat(sSettings.sSnmp.sysDescr, sSettings.sInfo.serialNumber);
  62747. 80330c2: f504 71f9 add.w r1, r4, #498 ; 0x1f2
  62748. 80330c6: 4620 mov r0, r4
  62749. 80330c8: f7ee fbdc bl 8021884 <strcat>
  62750. len = strlen(sSettings.sSnmp.sysDescr);
  62751. 80330cc: 4620 mov r0, r4
  62752. 80330ce: f7ee fd4b bl 8021b68 <strlen>
  62753. 80330d2: 4906 ldr r1, [pc, #24] ; (80330ec <SNMP_SetObjDescr+0x64>)
  62754. 80330d4: 7008 strb r0, [r1, #0]
  62755. snmp_set_sysdesr((u8_t*)sSettings.sSnmp.sysDescr, &len);
  62756. 80330d6: 4620 mov r0, r4
  62757. }
  62758. 80330d8: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
  62759. strcat(sSettings.sSnmp.sysDescr, sSettings.sSnmp.sysContact);
  62760. strcat(sSettings.sSnmp.sysDescr, " ");
  62761. strcat(sSettings.sSnmp.sysDescr, sSettings.sInfo.serialNumber);
  62762. len = strlen(sSettings.sSnmp.sysDescr);
  62763. snmp_set_sysdesr((u8_t*)sSettings.sSnmp.sysDescr, &len);
  62764. 80330dc: f7fc bba0 b.w 802f820 <snmp_set_sysdesr>
  62765. 80330e0: 2000e8d2 .word 0x2000e8d2
  62766. 80330e4: 08033ec0 .word 0x08033ec0
  62767. 80330e8: 08033e40 .word 0x08033e40
  62768. 80330ec: 2000e4a9 .word 0x2000e4a9
  62769. 080330f0 <SNMP_SetSysContact>:
  62770. /**
  62771. * @brief Установить SNMP SysContact
  62772. * @retval
  62773. */
  62774. void SNMP_SetSysContact(char *con)
  62775. {
  62776. 80330f0: b510 push {r4, lr}
  62777. 80330f2: 4604 mov r4, r0
  62778. static uint8_t len;
  62779. len = strlen(con);
  62780. 80330f4: f7ee fd38 bl 8021b68 <strlen>
  62781. 80330f8: 4903 ldr r1, [pc, #12] ; (8033108 <SNMP_SetSysContact+0x18>)
  62782. 80330fa: 7008 strb r0, [r1, #0]
  62783. snmp_set_syscontact((u8_t*)con, &len);
  62784. 80330fc: 4620 mov r0, r4
  62785. }
  62786. 80330fe: e8bd 4010 ldmia.w sp!, {r4, lr}
  62787. void SNMP_SetSysContact(char *con)
  62788. {
  62789. static uint8_t len;
  62790. len = strlen(con);
  62791. snmp_set_syscontact((u8_t*)con, &len);
  62792. 8033102: f7fc bbdf b.w 802f8c4 <snmp_set_syscontact>
  62793. 8033106: bf00 nop
  62794. 8033108: 2000e4aa .word 0x2000e4aa
  62795. 0803310c <SNMP_SetSysLocation>:
  62796. /**
  62797. * @brief Установить SNMP SysLocation
  62798. * @retval
  62799. */
  62800. void SNMP_SetSysLocation(char *loc)
  62801. {
  62802. 803310c: b510 push {r4, lr}
  62803. 803310e: 4604 mov r4, r0
  62804. static uint8_t len;
  62805. len = strlen(loc);
  62806. 8033110: f7ee fd2a bl 8021b68 <strlen>
  62807. 8033114: 4903 ldr r1, [pc, #12] ; (8033124 <SNMP_SetSysLocation+0x18>)
  62808. 8033116: 7008 strb r0, [r1, #0]
  62809. snmp_set_syslocation((u8_t*)loc, &len);
  62810. 8033118: 4620 mov r0, r4
  62811. }
  62812. 803311a: e8bd 4010 ldmia.w sp!, {r4, lr}
  62813. void SNMP_SetSysLocation(char *loc)
  62814. {
  62815. static uint8_t len;
  62816. len = strlen(loc);
  62817. snmp_set_syslocation((u8_t*)loc, &len);
  62818. 803311e: f7fc bbdb b.w 802f8d8 <snmp_set_syslocation>
  62819. 8033122: bf00 nop
  62820. 8033124: 2000e4b0 .word 0x2000e4b0
  62821. 08033128 <SNMP_SetManagerIP>:
  62822. /**
  62823. * @brief Установить SNMP SysManagerIP
  62824. * @retval
  62825. */
  62826. void SNMP_SetManagerIP(char *ip)
  62827. {
  62828. 8033128: b510 push {r4, lr}
  62829. static ip_addr_t trap_addr;
  62830. ipaddr_aton(ip, &trap_addr);
  62831. 803312a: 4c05 ldr r4, [pc, #20] ; (8033140 <SNMP_SetManagerIP+0x18>)
  62832. 803312c: 4621 mov r1, r4
  62833. 803312e: f7fa ff42 bl 802dfb6 <ipaddr_aton>
  62834. snmp_trap_dst_ip_set(0, &trap_addr);
  62835. 8033132: 2000 movs r0, #0
  62836. 8033134: 4621 mov r1, r4
  62837. }
  62838. 8033136: e8bd 4010 ldmia.w sp!, {r4, lr}
  62839. void SNMP_SetManagerIP(char *ip)
  62840. {
  62841. static ip_addr_t trap_addr;
  62842. ipaddr_aton(ip, &trap_addr);
  62843. snmp_trap_dst_ip_set(0, &trap_addr);
  62844. 803313a: f7fe bcd9 b.w 8031af0 <snmp_trap_dst_ip_set>
  62845. 803313e: bf00 nop
  62846. 8033140: 2000e4ac .word 0x2000e4ac
  62847. 08033144 <ETH_BSP_Config>:
  62848. * @brief ETH_BSP_Config
  62849. * @param None
  62850. * @retval None
  62851. */
  62852. void ETH_BSP_Config(void)
  62853. {
  62854. 8033144: b570 push {r4, r5, r6, lr}
  62855. {
  62856. volatile uint32_t i;
  62857. GPIO_InitTypeDef GPIO_InitStructure;
  62858. /* Enable GPIOs clocks */
  62859. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB
  62860. 8033146: 2007 movs r0, #7
  62861. * @brief ETH_BSP_Config
  62862. * @param None
  62863. * @retval None
  62864. */
  62865. void ETH_BSP_Config(void)
  62866. {
  62867. 8033148: b0b4 sub sp, #208 ; 0xd0
  62868. {
  62869. volatile uint32_t i;
  62870. GPIO_InitTypeDef GPIO_InitStructure;
  62871. /* Enable GPIOs clocks */
  62872. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB
  62873. 803314a: 2101 movs r1, #1
  62874. 803314c: f7f2 f9ec bl 8025528 <RCC_AHB1PeriphClockCmd>
  62875. | RCC_AHB1Periph_GPIOC, ENABLE);
  62876. /* Enable SYSCFG clock */
  62877. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  62878. 8033150: 2101 movs r1, #1
  62879. 8033152: f44f 4080 mov.w r0, #16384 ; 0x4000
  62880. 8033156: f7f2 f9ff bl 8025558 <RCC_APB2PeriphClockCmd>
  62881. /* MII/RMII Media interface selection --------------------------------------*/
  62882. SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
  62883. 803315a: 2001 movs r0, #1
  62884. 803315c: f7f2 fbde bl 802591c <SYSCFG_ETH_MediaInterfaceConfig>
  62885. ETH_RST_PIN -------> PE2 - замена на PE13
  62886. */
  62887. /* Configure PA1,PA2 and PA7 */
  62888. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  62889. 8033160: 2386 movs r3, #134 ; 0x86
  62890. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  62891. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  62892. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  62893. 8033162: 2400 movs r4, #0
  62894. */
  62895. /* Configure PA1,PA2 and PA7 */
  62896. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  62897. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  62898. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  62899. 8033164: 2502 movs r5, #2
  62900. ETH_RST_PIN -------> PE2 - замена на PE13
  62901. */
  62902. /* Configure PA1,PA2 and PA7 */
  62903. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  62904. 8033166: 9303 str r3, [sp, #12]
  62905. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  62906. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  62907. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  62908. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  62909. GPIO_Init(GPIOA, &GPIO_InitStructure);
  62910. 8033168: 4864 ldr r0, [pc, #400] ; (80332fc <ETH_BSP_Config+0x1b8>)
  62911. */
  62912. /* Configure PA1,PA2 and PA7 */
  62913. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  62914. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  62915. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  62916. 803316a: f88d 5010 strb.w r5, [sp, #16]
  62917. */
  62918. /* Configure PA1,PA2 and PA7 */
  62919. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  62920. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  62921. 803316e: 2303 movs r3, #3
  62922. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  62923. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  62924. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  62925. GPIO_Init(GPIOA, &GPIO_InitStructure);
  62926. 8033170: a903 add r1, sp, #12
  62927. */
  62928. /* Configure PA1,PA2 and PA7 */
  62929. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
  62930. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  62931. 8033172: f88d 3011 strb.w r3, [sp, #17]
  62932. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  62933. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  62934. 8033176: f88d 4012 strb.w r4, [sp, #18]
  62935. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  62936. 803317a: f88d 4013 strb.w r4, [sp, #19]
  62937. GPIO_Init(GPIOA, &GPIO_InitStructure);
  62938. 803317e: f7f2 f8f3 bl 8025368 <GPIO_Init>
  62939. GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
  62940. 8033182: 2101 movs r1, #1
  62941. 8033184: 220b movs r2, #11
  62942. 8033186: 485d ldr r0, [pc, #372] ; (80332fc <ETH_BSP_Config+0x1b8>)
  62943. 8033188: f7f2 f937 bl 80253fa <GPIO_PinAFConfig>
  62944. GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
  62945. 803318c: 220b movs r2, #11
  62946. 803318e: 485b ldr r0, [pc, #364] ; (80332fc <ETH_BSP_Config+0x1b8>)
  62947. 8033190: 4629 mov r1, r5
  62948. 8033192: f7f2 f932 bl 80253fa <GPIO_PinAFConfig>
  62949. GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);
  62950. 8033196: 220b movs r2, #11
  62951. 8033198: 2107 movs r1, #7
  62952. 803319a: 4858 ldr r0, [pc, #352] ; (80332fc <ETH_BSP_Config+0x1b8>)
  62953. 803319c: f7f2 f92d bl 80253fa <GPIO_PinAFConfig>
  62954. /* Configure PB10,PB11,PB12 and PB13 */
  62955. GPIO_InitStructure.GPIO_Pin = /* GPIO_Pin_10 | */ GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
  62956. 80331a0: f44f 5360 mov.w r3, #14336 ; 0x3800
  62957. GPIO_Init(GPIOB, &GPIO_InitStructure);
  62958. 80331a4: 4856 ldr r0, [pc, #344] ; (8033300 <ETH_BSP_Config+0x1bc>)
  62959. GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
  62960. GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
  62961. GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);
  62962. /* Configure PB10,PB11,PB12 and PB13 */
  62963. GPIO_InitStructure.GPIO_Pin = /* GPIO_Pin_10 | */ GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
  62964. 80331a6: 9303 str r3, [sp, #12]
  62965. GPIO_Init(GPIOB, &GPIO_InitStructure);
  62966. 80331a8: a903 add r1, sp, #12
  62967. 80331aa: f7f2 f8dd bl 8025368 <GPIO_Init>
  62968. //GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_ETH);
  62969. GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH);
  62970. 80331ae: 210b movs r1, #11
  62971. 80331b0: 460a mov r2, r1
  62972. 80331b2: 4853 ldr r0, [pc, #332] ; (8033300 <ETH_BSP_Config+0x1bc>)
  62973. 80331b4: f7f2 f921 bl 80253fa <GPIO_PinAFConfig>
  62974. GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH);
  62975. 80331b8: 210c movs r1, #12
  62976. 80331ba: 220b movs r2, #11
  62977. 80331bc: 4850 ldr r0, [pc, #320] ; (8033300 <ETH_BSP_Config+0x1bc>)
  62978. 80331be: f7f2 f91c bl 80253fa <GPIO_PinAFConfig>
  62979. GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH);
  62980. 80331c2: 220b movs r2, #11
  62981. 80331c4: 210d movs r1, #13
  62982. 80331c6: 484e ldr r0, [pc, #312] ; (8033300 <ETH_BSP_Config+0x1bc>)
  62983. 80331c8: f7f2 f917 bl 80253fa <GPIO_PinAFConfig>
  62984. /* Configure PC1, PC4 and PC5 */
  62985. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
  62986. 80331cc: 2332 movs r3, #50 ; 0x32
  62987. GPIO_Init(GPIOC, &GPIO_InitStructure);
  62988. 80331ce: 484d ldr r0, [pc, #308] ; (8033304 <ETH_BSP_Config+0x1c0>)
  62989. GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH);
  62990. GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH);
  62991. GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH);
  62992. /* Configure PC1, PC4 and PC5 */
  62993. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
  62994. 80331d0: 9303 str r3, [sp, #12]
  62995. GPIO_Init(GPIOC, &GPIO_InitStructure);
  62996. 80331d2: a903 add r1, sp, #12
  62997. 80331d4: f7f2 f8c8 bl 8025368 <GPIO_Init>
  62998. GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
  62999. 80331d8: 484a ldr r0, [pc, #296] ; (8033304 <ETH_BSP_Config+0x1c0>)
  63000. 80331da: 2101 movs r1, #1
  63001. 80331dc: 220b movs r2, #11
  63002. 80331de: f7f2 f90c bl 80253fa <GPIO_PinAFConfig>
  63003. GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
  63004. 80331e2: 4848 ldr r0, [pc, #288] ; (8033304 <ETH_BSP_Config+0x1c0>)
  63005. 80331e4: 2104 movs r1, #4
  63006. 80331e6: 220b movs r2, #11
  63007. 80331e8: f7f2 f907 bl 80253fa <GPIO_PinAFConfig>
  63008. GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);
  63009. 80331ec: 220b movs r2, #11
  63010. 80331ee: 4845 ldr r0, [pc, #276] ; (8033304 <ETH_BSP_Config+0x1c0>)
  63011. 80331f0: 2105 movs r1, #5
  63012. 80331f2: f7f2 f902 bl 80253fa <GPIO_PinAFConfig>
  63013. /* Configure the PHY RST pin */
  63014. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  63015. 80331f6: f44f 5600 mov.w r6, #8192 ; 0x2000
  63016. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  63017. 80331fa: 2301 movs r3, #1
  63018. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  63019. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  63020. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  63021. GPIO_Init(GPIOE, &GPIO_InitStructure);
  63022. 80331fc: 4842 ldr r0, [pc, #264] ; (8033308 <ETH_BSP_Config+0x1c4>)
  63023. GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
  63024. GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);
  63025. /* Configure the PHY RST pin */
  63026. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  63027. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  63028. 80331fe: f88d 3010 strb.w r3, [sp, #16]
  63029. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  63030. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  63031. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  63032. GPIO_Init(GPIOE, &GPIO_InitStructure);
  63033. 8033202: a903 add r1, sp, #12
  63034. /* Configure the PHY RST pin */
  63035. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  63036. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  63037. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  63038. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  63039. 8033204: f88d 3013 strb.w r3, [sp, #19]
  63040. GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
  63041. GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
  63042. GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);
  63043. /* Configure the PHY RST pin */
  63044. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  63045. 8033208: 9603 str r6, [sp, #12]
  63046. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  63047. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  63048. 803320a: f88d 4012 strb.w r4, [sp, #18]
  63049. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  63050. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  63051. 803320e: f88d 5011 strb.w r5, [sp, #17]
  63052. GPIO_Init(GPIOE, &GPIO_InitStructure);
  63053. 8033212: f7f2 f8a9 bl 8025368 <GPIO_Init>
  63054. GPIO_ResetBits(GPIOE, GPIO_Pin_13);
  63055. 8033216: 483c ldr r0, [pc, #240] ; (8033308 <ETH_BSP_Config+0x1c4>)
  63056. 8033218: 4631 mov r1, r6
  63057. 803321a: f7f2 f8ec bl 80253f6 <GPIO_ResetBits>
  63058. for (i = 0; i < 20000; i++);
  63059. 803321e: 9401 str r4, [sp, #4]
  63060. 8033220: f644 631f movw r3, #19999 ; 0x4e1f
  63061. 8033224: e002 b.n 803322c <ETH_BSP_Config+0xe8>
  63062. 8033226: 9a01 ldr r2, [sp, #4]
  63063. 8033228: 3201 adds r2, #1
  63064. 803322a: 9201 str r2, [sp, #4]
  63065. 803322c: 9a01 ldr r2, [sp, #4]
  63066. 803322e: 429a cmp r2, r3
  63067. 8033230: d9f9 bls.n 8033226 <ETH_BSP_Config+0xe2>
  63068. GPIO_SetBits(GPIOE, GPIO_Pin_13);
  63069. 8033232: 4835 ldr r0, [pc, #212] ; (8033308 <ETH_BSP_Config+0x1c4>)
  63070. 8033234: f44f 5100 mov.w r1, #8192 ; 0x2000
  63071. 8033238: f7f2 f8db bl 80253f2 <GPIO_SetBits>
  63072. for (i = 0; i < 20000; i++);
  63073. 803323c: 2300 movs r3, #0
  63074. 803323e: 9301 str r3, [sp, #4]
  63075. 8033240: f644 631f movw r3, #19999 ; 0x4e1f
  63076. 8033244: e002 b.n 803324c <ETH_BSP_Config+0x108>
  63077. 8033246: 9a01 ldr r2, [sp, #4]
  63078. 8033248: 3201 adds r2, #1
  63079. 803324a: 9201 str r2, [sp, #4]
  63080. 803324c: 9a01 ldr r2, [sp, #4]
  63081. 803324e: 429a cmp r2, r3
  63082. 8033250: d9f9 bls.n 8033246 <ETH_BSP_Config+0x102>
  63083. static void ETH_MACDMA_Config(void)
  63084. {
  63085. ETH_InitTypeDef ETH_InitStructure;
  63086. /* Enable ETHERNET clock */
  63087. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx |
  63088. 8033252: f04f 6060 mov.w r0, #234881024 ; 0xe000000
  63089. 8033256: 2101 movs r1, #1
  63090. 8033258: f7f2 f966 bl 8025528 <RCC_AHB1PeriphClockCmd>
  63091. RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);
  63092. /* Reset ETHERNET on AHB Bus */
  63093. ETH_DeInit();
  63094. 803325c: f000 f868 bl 8033330 <ETH_DeInit>
  63095. /* Software reset */
  63096. ETH_SoftwareReset();
  63097. 8033260: f000 f9fe bl 8033660 <ETH_SoftwareReset>
  63098. /* Wait for software reset */
  63099. while (ETH_GetSoftwareResetStatus() == SET);
  63100. 8033264: f000 fa04 bl 8033670 <ETH_GetSoftwareResetStatus>
  63101. 8033268: 2801 cmp r0, #1
  63102. 803326a: d0fb beq.n 8033264 <ETH_BSP_Config+0x120>
  63103. /* ETHERNET Configuration --------------------------------------------------*/
  63104. /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
  63105. ETH_StructInit(&ETH_InitStructure);
  63106. 803326c: a805 add r0, sp, #20
  63107. 803326e: f000 f86c bl 803334a <ETH_StructInit>
  63108. //ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
  63109. // ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
  63110. // ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
  63111. ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  63112. ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;
  63113. 8033272: f44f 7300 mov.w r3, #512 ; 0x200
  63114. 8033276: 930f str r3, [sp, #60] ; 0x3c
  63115. /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
  63116. the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
  63117. if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
  63118. ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
  63119. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  63120. 8033278: f04f 7300 mov.w r3, #33554432 ; 0x2000000
  63121. 803327c: 9326 str r3, [sp, #152] ; 0x98
  63122. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  63123. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  63124. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  63125. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  63126. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  63127. 803327e: 932e str r3, [sp, #184] ; 0xb8
  63128. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  63129. 8033280: f44f 3380 mov.w r3, #65536 ; 0x10000
  63130. 8033284: 932f str r3, [sp, #188] ; 0xbc
  63131. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  63132. 8033286: f44f 0380 mov.w r3, #4194304 ; 0x400000
  63133. /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
  63134. ETH_StructInit(&ETH_InitStructure);
  63135. /* Fill ETH_InitStructure parametrs */
  63136. /*------------------------ MAC -----------------------------------*/
  63137. ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  63138. 803328a: 2501 movs r5, #1
  63139. /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
  63140. the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
  63141. if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
  63142. ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
  63143. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  63144. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  63145. 803328c: f44f 1200 mov.w r2, #2097152 ; 0x200000
  63146. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  63147. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  63148. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  63149. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  63150. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  63151. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  63152. 8033290: 9330 str r3, [sp, #192] ; 0xc0
  63153. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  63154. 8033292: f44f 5300 mov.w r3, #8192 ; 0x2000
  63155. ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  63156. //ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
  63157. // ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
  63158. // ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
  63159. ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  63160. 8033296: 2400 movs r4, #0
  63161. /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
  63162. the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
  63163. if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
  63164. ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
  63165. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  63166. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  63167. 8033298: 9228 str r2, [sp, #160] ; 0xa0
  63168. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  63169. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  63170. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  63171. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  63172. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  63173. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  63174. 803329a: 9331 str r3, [sp, #196] ; 0xc4
  63175. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  63176. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  63177. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  63178. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  63179. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  63180. 803329c: 2204 movs r2, #4
  63181. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  63182. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  63183. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  63184. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  63185. ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
  63186. 803329e: f44f 4380 mov.w r3, #16384 ; 0x4000
  63187. /* Configure Ethernet */
  63188. EthInitStatus = ETH_Init(&ETH_InitStructure, LAN8720_PHY_ADDRESS);
  63189. 80332a2: 4629 mov r1, r5
  63190. 80332a4: a805 add r0, sp, #20
  63191. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  63192. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  63193. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  63194. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  63195. ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
  63196. 80332a6: 922d str r2, [sp, #180] ; 0xb4
  63197. ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  63198. ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
  63199. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  63200. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  63201. ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
  63202. 80332a8: 9333 str r3, [sp, #204] ; 0xcc
  63203. /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
  63204. ETH_StructInit(&ETH_InitStructure);
  63205. /* Fill ETH_InitStructure parametrs */
  63206. /*------------------------ MAC -----------------------------------*/
  63207. ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  63208. 80332aa: 9505 str r5, [sp, #20]
  63209. //ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
  63210. // ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
  63211. // ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
  63212. ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  63213. 80332ac: 940c str r4, [sp, #48] ; 0x30
  63214. ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;
  63215. ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;
  63216. 80332ae: 9410 str r4, [sp, #64] ; 0x40
  63217. ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;
  63218. 80332b0: 9413 str r4, [sp, #76] ; 0x4c
  63219. ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;
  63220. 80332b2: 9416 str r4, [sp, #88] ; 0x58
  63221. ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
  63222. 80332b4: 9418 str r4, [sp, #96] ; 0x60
  63223. ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
  63224. 80332b6: 9419 str r4, [sp, #100] ; 0x64
  63225. ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
  63226. 80332b8: 941a str r4, [sp, #104] ; 0x68
  63227. /*------------------------ DMA -----------------------------------*/
  63228. /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
  63229. the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
  63230. if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
  63231. ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
  63232. 80332ba: 9425 str r4, [sp, #148] ; 0x94
  63233. ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  63234. ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  63235. ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  63236. 80332bc: 942a str r4, [sp, #168] ; 0xa8
  63237. ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  63238. 80332be: 942b str r4, [sp, #172] ; 0xac
  63239. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  63240. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  63241. ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
  63242. /* Configure Ethernet */
  63243. EthInitStatus = ETH_Init(&ETH_InitStructure, LAN8720_PHY_ADDRESS);
  63244. 80332c0: f000 fa80 bl 80337c4 <ETH_Init>
  63245. 80332c4: 4e11 ldr r6, [pc, #68] ; (803330c <ETH_BSP_Config+0x1c8>)
  63246. /* Enable the Ethernet Rx Interrupt */
  63247. ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE);
  63248. 80332c6: 4629 mov r1, r5
  63249. ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  63250. ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  63251. ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
  63252. /* Configure Ethernet */
  63253. EthInitStatus = ETH_Init(&ETH_InitStructure, LAN8720_PHY_ADDRESS);
  63254. 80332c8: 6030 str r0, [r6, #0]
  63255. /* Enable the Ethernet Rx Interrupt */
  63256. ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE);
  63257. 80332ca: 4811 ldr r0, [pc, #68] ; (8033310 <ETH_BSP_Config+0x1cc>)
  63258. 80332cc: f000 f9e2 bl 8033694 <ETH_DMAITConfig>
  63259. void ETH_NVIC_Config(void)
  63260. {
  63261. NVIC_InitTypeDef NVIC_InitStructure;
  63262. /* 2 bit for pre-emption priority, 2 bits for subpriority */
  63263. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  63264. 80332d0: f44f 7040 mov.w r0, #768 ; 0x300
  63265. 80332d4: f7f1 fec8 bl 8025068 <NVIC_PriorityGroupConfig>
  63266. /* Enable the Ethernet global Interrupt */
  63267. NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
  63268. 80332d8: 233d movs r3, #61 ; 0x3d
  63269. 80332da: f88d 3008 strb.w r3, [sp, #8]
  63270. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
  63271. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  63272. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  63273. NVIC_Init(&NVIC_InitStructure);
  63274. 80332de: a802 add r0, sp, #8
  63275. /* 2 bit for pre-emption priority, 2 bits for subpriority */
  63276. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  63277. /* Enable the Ethernet global Interrupt */
  63278. NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
  63279. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
  63280. 80332e0: 2305 movs r3, #5
  63281. 80332e2: f88d 3009 strb.w r3, [sp, #9]
  63282. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  63283. 80332e6: f88d 400a strb.w r4, [sp, #10]
  63284. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  63285. 80332ea: f88d 500b strb.w r5, [sp, #11]
  63286. NVIC_Init(&NVIC_InitStructure);
  63287. 80332ee: f7f1 fec5 bl 802507c <NVIC_Init>
  63288. ETH_MACDMA_Config();
  63289. /* Config NVIC for Ethernet */
  63290. ETH_NVIC_Config();
  63291. if (EthInitStatus == 0) {
  63292. 80332f2: 6833 ldr r3, [r6, #0]
  63293. 80332f4: b903 cbnz r3, 80332f8 <ETH_BSP_Config+0x1b4>
  63294. 80332f6: e7fe b.n 80332f6 <ETH_BSP_Config+0x1b2>
  63295. // LCD_DisplayStringLine(Line5, (uint8_t*)" Ethernet Init ");
  63296. // LCD_DisplayStringLine(Line6, (uint8_t*)" failed ");
  63297. // STM_EVAL_LEDOn(LED5);
  63298. while(1);
  63299. }
  63300. }
  63301. 80332f8: b034 add sp, #208 ; 0xd0
  63302. 80332fa: bd70 pop {r4, r5, r6, pc}
  63303. 80332fc: 40020000 .word 0x40020000
  63304. 8033300: 40020400 .word 0x40020400
  63305. 8033304: 40020800 .word 0x40020800
  63306. 8033308: 40021000 .word 0x40021000
  63307. 803330c: 2000e4b4 .word 0x2000e4b4
  63308. 8033310: 00010040 .word 0x00010040
  63309. 08033314 <ETH_Delay>:
  63310. * @brief Inserts a delay time.
  63311. * @param nCount: specifies the delay time length.
  63312. * @retval None
  63313. */
  63314. static void ETH_Delay(__IO uint32_t nCount)
  63315. {
  63316. 8033314: b084 sub sp, #16
  63317. __IO uint32_t index = 0;
  63318. 8033316: 2300 movs r3, #0
  63319. * @brief Inserts a delay time.
  63320. * @param nCount: specifies the delay time length.
  63321. * @retval None
  63322. */
  63323. static void ETH_Delay(__IO uint32_t nCount)
  63324. {
  63325. 8033318: 9001 str r0, [sp, #4]
  63326. __IO uint32_t index = 0;
  63327. 803331a: 9303 str r3, [sp, #12]
  63328. for(index = nCount; index != 0; index--)
  63329. 803331c: 9b01 ldr r3, [sp, #4]
  63330. 803331e: e001 b.n 8033324 <ETH_Delay+0x10>
  63331. 8033320: 9b03 ldr r3, [sp, #12]
  63332. 8033322: 3b01 subs r3, #1
  63333. 8033324: 9303 str r3, [sp, #12]
  63334. 8033326: 9b03 ldr r3, [sp, #12]
  63335. 8033328: 2b00 cmp r3, #0
  63336. 803332a: d1f9 bne.n 8033320 <ETH_Delay+0xc>
  63337. {
  63338. }
  63339. }
  63340. 803332c: b004 add sp, #16
  63341. 803332e: 4770 bx lr
  63342. 08033330 <ETH_DeInit>:
  63343. * @brief Deinitializes the ETHERNET peripheral registers to their default reset values.
  63344. * @param None
  63345. * @retval None
  63346. */
  63347. void ETH_DeInit(void)
  63348. {
  63349. 8033330: b508 push {r3, lr}
  63350. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, ENABLE);
  63351. 8033332: 2101 movs r1, #1
  63352. 8033334: f04f 7000 mov.w r0, #33554432 ; 0x2000000
  63353. 8033338: f7f2 f91a bl 8025570 <RCC_AHB1PeriphResetCmd>
  63354. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, DISABLE);
  63355. 803333c: f04f 7000 mov.w r0, #33554432 ; 0x2000000
  63356. 8033340: 2100 movs r1, #0
  63357. }
  63358. 8033342: e8bd 4008 ldmia.w sp!, {r3, lr}
  63359. * @retval None
  63360. */
  63361. void ETH_DeInit(void)
  63362. {
  63363. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, ENABLE);
  63364. RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, DISABLE);
  63365. 8033346: f7f2 b913 b.w 8025570 <RCC_AHB1PeriphResetCmd>
  63366. 0803334a <ETH_StructInit>:
  63367. /* Ethernet interframe gap set to 96 bits */
  63368. ETH_InitStruct->ETH_InterFrameGap = ETH_InterFrameGap_96Bit;
  63369. /* Carrier Sense Enabled in Half-Duplex mode */
  63370. ETH_InitStruct->ETH_CarrierSense = ETH_CarrierSense_Enable;
  63371. /* PHY speed configured to 100Mbit/s */
  63372. ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
  63373. 803334a: f44f 4280 mov.w r2, #16384 ; 0x4000
  63374. 803334e: 6142 str r2, [r0, #20]
  63375. /* Receive own Frames in Half-Duplex mode enabled */
  63376. ETH_InitStruct->ETH_ReceiveOwn = ETH_ReceiveOwn_Enable;
  63377. /* MAC MII loopback disabled */
  63378. ETH_InitStruct->ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  63379. /* Full-Duplex mode selected */
  63380. ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
  63381. 8033350: f44f 6200 mov.w r2, #2048 ; 0x800
  63382. 8033354: 6202 str r2, [r0, #32]
  63383. /* Receive all frames disabled */
  63384. ETH_InitStruct->ETH_ReceiveAll = ETH_ReceiveAll_Disable;
  63385. /* Source address filtering (on the optional MAC addresses) disabled */
  63386. ETH_InitStruct->ETH_SourceAddrFilter = ETH_SourceAddrFilter_Disable;
  63387. /* Do not forward control frames that do not pass the address filtering */
  63388. ETH_InitStruct->ETH_PassControlFrames = ETH_PassControlFrames_BlockAll;
  63389. 8033356: 2240 movs r2, #64 ; 0x40
  63390. 8033358: 6402 str r2, [r0, #64] ; 0x40
  63391. /* Disable reception of Broadcast frames */
  63392. ETH_InitStruct->ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable;
  63393. 803335a: 2220 movs r2, #32
  63394. 803335c: 6442 str r2, [r0, #68] ; 0x44
  63395. /* Initialize hash table high and low regs */
  63396. ETH_InitStruct->ETH_HashTableHigh = 0x0;
  63397. ETH_InitStruct->ETH_HashTableLow = 0x0;
  63398. /* Flow control config (flow control disabled)*/
  63399. ETH_InitStruct->ETH_PauseTime = 0x0;
  63400. ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable;
  63401. 803335e: 2280 movs r2, #128 ; 0x80
  63402. {
  63403. /* ETH_InitStruct members default value */
  63404. /*------------------------ MAC Configuration ---------------------------*/
  63405. /* PHY Auto-negotiation enabled */
  63406. ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  63407. 8033360: 2301 movs r3, #1
  63408. /* Initialize hash table high and low regs */
  63409. ETH_InitStruct->ETH_HashTableHigh = 0x0;
  63410. ETH_InitStruct->ETH_HashTableLow = 0x0;
  63411. /* Flow control config (flow control disabled)*/
  63412. ETH_InitStruct->ETH_PauseTime = 0x0;
  63413. ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable;
  63414. 8033362: 6642 str r2, [r0, #100] ; 0x64
  63415. ETH_InitStruct->ETH_VLANTagIdentifier = 0x0;
  63416. /*---------------------- DMA Configuration -------------------------------*/
  63417. /* Drops frames with with TCP/IP checksum errors */
  63418. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  63419. 8033364: f04f 6280 mov.w r2, #67108864 ; 0x4000000
  63420. {
  63421. /* ETH_InitStruct members default value */
  63422. /*------------------------ MAC Configuration ---------------------------*/
  63423. /* PHY Auto-negotiation enabled */
  63424. ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  63425. 8033368: 6003 str r3, [r0, #0]
  63426. ETH_InitStruct->ETH_VLANTagIdentifier = 0x0;
  63427. /*---------------------- DMA Configuration -------------------------------*/
  63428. /* Drops frames with with TCP/IP checksum errors */
  63429. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  63430. 803336a: f8c0 2080 str.w r2, [r0, #128] ; 0x80
  63431. /*------------------------ MAC Configuration ---------------------------*/
  63432. /* PHY Auto-negotiation enabled */
  63433. ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  63434. /* MAC watchdog enabled: cuts-off long frame */
  63435. ETH_InitStruct->ETH_Watchdog = ETH_Watchdog_Enable;
  63436. 803336e: 2300 movs r3, #0
  63437. /*---------------------- DMA Configuration -------------------------------*/
  63438. /* Drops frames with with TCP/IP checksum errors */
  63439. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  63440. /* Store and forward mode enabled for receive */
  63441. ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  63442. 8033370: f04f 7200 mov.w r2, #33554432 ; 0x2000000
  63443. /*------------------------ MAC Configuration ---------------------------*/
  63444. /* PHY Auto-negotiation enabled */
  63445. ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  63446. /* MAC watchdog enabled: cuts-off long frame */
  63447. ETH_InitStruct->ETH_Watchdog = ETH_Watchdog_Enable;
  63448. 8033374: 6043 str r3, [r0, #4]
  63449. /* MAC Jabber enabled in Half-duplex mode */
  63450. ETH_InitStruct->ETH_Jabber = ETH_Jabber_Enable;
  63451. 8033376: 6083 str r3, [r0, #8]
  63452. /* Ethernet interframe gap set to 96 bits */
  63453. ETH_InitStruct->ETH_InterFrameGap = ETH_InterFrameGap_96Bit;
  63454. 8033378: 60c3 str r3, [r0, #12]
  63455. /* Carrier Sense Enabled in Half-Duplex mode */
  63456. ETH_InitStruct->ETH_CarrierSense = ETH_CarrierSense_Enable;
  63457. 803337a: 6103 str r3, [r0, #16]
  63458. /* PHY speed configured to 100Mbit/s */
  63459. ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
  63460. /* Receive own Frames in Half-Duplex mode enabled */
  63461. ETH_InitStruct->ETH_ReceiveOwn = ETH_ReceiveOwn_Enable;
  63462. 803337c: 6183 str r3, [r0, #24]
  63463. /* MAC MII loopback disabled */
  63464. ETH_InitStruct->ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  63465. 803337e: 61c3 str r3, [r0, #28]
  63466. /* Full-Duplex mode selected */
  63467. ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
  63468. /* IPv4 and TCP/UDP/ICMP frame Checksum Offload disabled */
  63469. ETH_InitStruct->ETH_ChecksumOffload = ETH_ChecksumOffload_Disable;
  63470. 8033380: 6243 str r3, [r0, #36] ; 0x24
  63471. /* Retry Transmission enabled for half-duplex mode */
  63472. ETH_InitStruct->ETH_RetryTransmission = ETH_RetryTransmission_Enable;
  63473. 8033382: 6283 str r3, [r0, #40] ; 0x28
  63474. /* Automatic PAD/CRC strip disabled*/
  63475. ETH_InitStruct->ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;
  63476. 8033384: 62c3 str r3, [r0, #44] ; 0x2c
  63477. /* half-duplex mode retransmission Backoff time_limit = 10 slot times*/
  63478. ETH_InitStruct->ETH_BackOffLimit = ETH_BackOffLimit_10;
  63479. 8033386: 6303 str r3, [r0, #48] ; 0x30
  63480. /* half-duplex mode Deferral check disabled */
  63481. ETH_InitStruct->ETH_DeferralCheck = ETH_DeferralCheck_Disable;
  63482. 8033388: 6343 str r3, [r0, #52] ; 0x34
  63483. /* Receive all frames disabled */
  63484. ETH_InitStruct->ETH_ReceiveAll = ETH_ReceiveAll_Disable;
  63485. 803338a: 6383 str r3, [r0, #56] ; 0x38
  63486. /* Source address filtering (on the optional MAC addresses) disabled */
  63487. ETH_InitStruct->ETH_SourceAddrFilter = ETH_SourceAddrFilter_Disable;
  63488. 803338c: 63c3 str r3, [r0, #60] ; 0x3c
  63489. /* Do not forward control frames that do not pass the address filtering */
  63490. ETH_InitStruct->ETH_PassControlFrames = ETH_PassControlFrames_BlockAll;
  63491. /* Disable reception of Broadcast frames */
  63492. ETH_InitStruct->ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable;
  63493. /* Normal Destination address filtering (not reverse addressing) */
  63494. ETH_InitStruct->ETH_DestinationAddrFilter = ETH_DestinationAddrFilter_Normal;
  63495. 803338e: 6483 str r3, [r0, #72] ; 0x48
  63496. /* Promiscuous address filtering mode disabled */
  63497. ETH_InitStruct->ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
  63498. 8033390: 64c3 str r3, [r0, #76] ; 0x4c
  63499. /* Perfect address filtering for multicast addresses */
  63500. ETH_InitStruct->ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
  63501. 8033392: 6503 str r3, [r0, #80] ; 0x50
  63502. /* Perfect address filtering for unicast addresses */
  63503. ETH_InitStruct->ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
  63504. 8033394: 6543 str r3, [r0, #84] ; 0x54
  63505. /* Initialize hash table high and low regs */
  63506. ETH_InitStruct->ETH_HashTableHigh = 0x0;
  63507. 8033396: 6583 str r3, [r0, #88] ; 0x58
  63508. ETH_InitStruct->ETH_HashTableLow = 0x0;
  63509. 8033398: 65c3 str r3, [r0, #92] ; 0x5c
  63510. /* Flow control config (flow control disabled)*/
  63511. ETH_InitStruct->ETH_PauseTime = 0x0;
  63512. 803339a: 6603 str r3, [r0, #96] ; 0x60
  63513. ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable;
  63514. ETH_InitStruct->ETH_PauseLowThreshold = ETH_PauseLowThreshold_Minus4;
  63515. 803339c: 6683 str r3, [r0, #104] ; 0x68
  63516. ETH_InitStruct->ETH_UnicastPauseFrameDetect = ETH_UnicastPauseFrameDetect_Disable;
  63517. 803339e: 66c3 str r3, [r0, #108] ; 0x6c
  63518. ETH_InitStruct->ETH_ReceiveFlowControl = ETH_ReceiveFlowControl_Disable;
  63519. 80333a0: 6703 str r3, [r0, #112] ; 0x70
  63520. ETH_InitStruct->ETH_TransmitFlowControl = ETH_TransmitFlowControl_Disable;
  63521. 80333a2: 6743 str r3, [r0, #116] ; 0x74
  63522. /* VLANtag config (VLAN field not checked) */
  63523. ETH_InitStruct->ETH_VLANTagComparison = ETH_VLANTagComparison_16Bit;
  63524. 80333a4: 6783 str r3, [r0, #120] ; 0x78
  63525. ETH_InitStruct->ETH_VLANTagIdentifier = 0x0;
  63526. 80333a6: 67c3 str r3, [r0, #124] ; 0x7c
  63527. /*---------------------- DMA Configuration -------------------------------*/
  63528. /* Drops frames with with TCP/IP checksum errors */
  63529. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  63530. /* Store and forward mode enabled for receive */
  63531. ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  63532. 80333a8: f8c0 2084 str.w r2, [r0, #132] ; 0x84
  63533. ETH_InitStruct->ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes;
  63534. /* Disable Operate on second frame (transmit a second frame to FIFO without
  63535. waiting status of previous frame*/
  63536. ETH_InitStruct->ETH_SecondFrameOperate = ETH_SecondFrameOperate_Disable;
  63537. /* DMA works on 32-bit aligned start source and destinations addresses */
  63538. ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  63539. 80333ac: f8c0 20a4 str.w r2, [r0, #164] ; 0xa4
  63540. /* Enabled Fixed Burst Mode (mix of INC4, INC8, INC16 and SINGLE DMA transactions */
  63541. ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Enable;
  63542. 80333b0: f44f 3280 mov.w r2, #65536 ; 0x10000
  63543. 80333b4: f8c0 20a8 str.w r2, [r0, #168] ; 0xa8
  63544. /* DMA transfer max burst length = 32 beats = 32 x 32bits */
  63545. ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  63546. 80333b8: f44f 0280 mov.w r2, #4194304 ; 0x400000
  63547. /* Store and forward mode enabled for receive */
  63548. ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  63549. /* Flush received frame that created FIFO overflow */
  63550. ETH_InitStruct->ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Enable;
  63551. /* Store and forward mode enabled for transmit */
  63552. ETH_InitStruct->ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  63553. 80333bc: f44f 1100 mov.w r1, #2097152 ; 0x200000
  63554. /* DMA works on 32-bit aligned start source and destinations addresses */
  63555. ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  63556. /* Enabled Fixed Burst Mode (mix of INC4, INC8, INC16 and SINGLE DMA transactions */
  63557. ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Enable;
  63558. /* DMA transfer max burst length = 32 beats = 32 x 32bits */
  63559. ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  63560. 80333c0: f8c0 20ac str.w r2, [r0, #172] ; 0xac
  63561. ETH_InitStruct->ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  63562. 80333c4: f44f 5200 mov.w r2, #8192 ; 0x2000
  63563. /* Drops frames with with TCP/IP checksum errors */
  63564. ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
  63565. /* Store and forward mode enabled for receive */
  63566. ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
  63567. /* Flush received frame that created FIFO overflow */
  63568. ETH_InitStruct->ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Enable;
  63569. 80333c8: f8c0 3088 str.w r3, [r0, #136] ; 0x88
  63570. /* Store and forward mode enabled for transmit */
  63571. ETH_InitStruct->ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
  63572. 80333cc: f8c0 108c str.w r1, [r0, #140] ; 0x8c
  63573. /* Threshold TXFIFO level set to 64 bytes (used when threshold mode is enabled) */
  63574. ETH_InitStruct->ETH_TransmitThresholdControl = ETH_TransmitThresholdControl_64Bytes;
  63575. 80333d0: f8c0 3090 str.w r3, [r0, #144] ; 0x90
  63576. /* Disable forwarding frames with errors (short frames, CRC,...)*/
  63577. ETH_InitStruct->ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
  63578. 80333d4: f8c0 3094 str.w r3, [r0, #148] ; 0x94
  63579. /* Disable undersized good frames */
  63580. ETH_InitStruct->ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
  63581. 80333d8: f8c0 3098 str.w r3, [r0, #152] ; 0x98
  63582. /* Threshold RXFIFO level set to 64 bytes (used when Cut-through mode is enabled) */
  63583. ETH_InitStruct->ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes;
  63584. 80333dc: f8c0 309c str.w r3, [r0, #156] ; 0x9c
  63585. /* Disable Operate on second frame (transmit a second frame to FIFO without
  63586. waiting status of previous frame*/
  63587. ETH_InitStruct->ETH_SecondFrameOperate = ETH_SecondFrameOperate_Disable;
  63588. 80333e0: f8c0 30a0 str.w r3, [r0, #160] ; 0xa0
  63589. ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
  63590. /* Enabled Fixed Burst Mode (mix of INC4, INC8, INC16 and SINGLE DMA transactions */
  63591. ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Enable;
  63592. /* DMA transfer max burst length = 32 beats = 32 x 32bits */
  63593. ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
  63594. ETH_InitStruct->ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
  63595. 80333e4: f8c0 20b0 str.w r2, [r0, #176] ; 0xb0
  63596. /* DMA Ring mode skip length = 0 */
  63597. ETH_InitStruct->ETH_DescriptorSkipLength = 0x0;
  63598. 80333e8: f8c0 30b4 str.w r3, [r0, #180] ; 0xb4
  63599. /* Equal priority (round-robin) between transmit and receive DMA engines */
  63600. ETH_InitStruct->ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_1_1;
  63601. 80333ec: f8c0 30b8 str.w r3, [r0, #184] ; 0xb8
  63602. 80333f0: 4770 bx lr
  63603. 80333f2: 0000 movs r0, r0
  63604. 080333f4 <ETH_MACTransmissionCmd>:
  63605. * @param NewState: new state of the MAC transmission.
  63606. * This parameter can be: ENABLE or DISABLE.
  63607. * @retval None
  63608. */
  63609. void ETH_MACTransmissionCmd(FunctionalState NewState)
  63610. {
  63611. 80333f4: 4b04 ldr r3, [pc, #16] ; (8033408 <ETH_MACTransmissionCmd+0x14>)
  63612. assert_param(IS_FUNCTIONAL_STATE(NewState));
  63613. if (NewState != DISABLE)
  63614. {
  63615. /* Enable the MAC transmission */
  63616. ETH->MACCR |= ETH_MACCR_TE;
  63617. 80333f6: 681a ldr r2, [r3, #0]
  63618. void ETH_MACTransmissionCmd(FunctionalState NewState)
  63619. {
  63620. /* Check the parameters */
  63621. assert_param(IS_FUNCTIONAL_STATE(NewState));
  63622. if (NewState != DISABLE)
  63623. 80333f8: b110 cbz r0, 8033400 <ETH_MACTransmissionCmd+0xc>
  63624. {
  63625. /* Enable the MAC transmission */
  63626. ETH->MACCR |= ETH_MACCR_TE;
  63627. 80333fa: f042 0208 orr.w r2, r2, #8
  63628. 80333fe: e001 b.n 8033404 <ETH_MACTransmissionCmd+0x10>
  63629. }
  63630. else
  63631. {
  63632. /* Disable the MAC transmission */
  63633. ETH->MACCR &= ~ETH_MACCR_TE;
  63634. 8033400: f022 0208 bic.w r2, r2, #8
  63635. 8033404: 601a str r2, [r3, #0]
  63636. 8033406: 4770 bx lr
  63637. 8033408: 40028000 .word 0x40028000
  63638. 0803340c <ETH_MACReceptionCmd>:
  63639. * @param NewState: new state of the MAC reception.
  63640. * This parameter can be: ENABLE or DISABLE.
  63641. * @retval None
  63642. */
  63643. void ETH_MACReceptionCmd(FunctionalState NewState)
  63644. {
  63645. 803340c: 4b04 ldr r3, [pc, #16] ; (8033420 <ETH_MACReceptionCmd+0x14>)
  63646. assert_param(IS_FUNCTIONAL_STATE(NewState));
  63647. if (NewState != DISABLE)
  63648. {
  63649. /* Enable the MAC reception */
  63650. ETH->MACCR |= ETH_MACCR_RE;
  63651. 803340e: 681a ldr r2, [r3, #0]
  63652. void ETH_MACReceptionCmd(FunctionalState NewState)
  63653. {
  63654. /* Check the parameters */
  63655. assert_param(IS_FUNCTIONAL_STATE(NewState));
  63656. if (NewState != DISABLE)
  63657. 8033410: b110 cbz r0, 8033418 <ETH_MACReceptionCmd+0xc>
  63658. {
  63659. /* Enable the MAC reception */
  63660. ETH->MACCR |= ETH_MACCR_RE;
  63661. 8033412: f042 0204 orr.w r2, r2, #4
  63662. 8033416: e001 b.n 803341c <ETH_MACReceptionCmd+0x10>
  63663. }
  63664. else
  63665. {
  63666. /* Disable the MAC reception */
  63667. ETH->MACCR &= ~ETH_MACCR_RE;
  63668. 8033418: f022 0204 bic.w r2, r2, #4
  63669. 803341c: 601a str r2, [r3, #0]
  63670. 803341e: 4770 bx lr
  63671. 8033420: 40028000 .word 0x40028000
  63672. 08033424 <ETH_MACAddressConfig>:
  63673. uint32_t tmpreg;
  63674. /* Check the parameters */
  63675. assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr));
  63676. /* Calculate the selected MAC address high register */
  63677. tmpreg = ((uint32_t)Addr[5] << 8) | (uint32_t)Addr[4];
  63678. 8033424: 790b ldrb r3, [r1, #4]
  63679. 8033426: 794a ldrb r2, [r1, #5]
  63680. 8033428: ea43 2202 orr.w r2, r3, r2, lsl #8
  63681. /* Load the selected MAC address high register */
  63682. (*(__IO uint32_t *) (ETH_MAC_ADDR_HBASE + MacAddr)) = tmpreg;
  63683. 803342c: 4b07 ldr r3, [pc, #28] ; (803344c <ETH_MACAddressConfig+0x28>)
  63684. 803342e: 50c2 str r2, [r0, r3]
  63685. /* Calculate the selected MAC address low register */
  63686. tmpreg = ((uint32_t)Addr[3] << 24) | ((uint32_t)Addr[2] << 16) | ((uint32_t)Addr[1] << 8) | Addr[0];
  63687. 8033430: 788a ldrb r2, [r1, #2]
  63688. 8033432: 78cb ldrb r3, [r1, #3]
  63689. 8033434: 0412 lsls r2, r2, #16
  63690. 8033436: ea42 6203 orr.w r2, r2, r3, lsl #24
  63691. 803343a: 780b ldrb r3, [r1, #0]
  63692. 803343c: 431a orrs r2, r3
  63693. 803343e: 784b ldrb r3, [r1, #1]
  63694. 8033440: ea42 2203 orr.w r2, r2, r3, lsl #8
  63695. /* Load the selected MAC address low register */
  63696. (*(__IO uint32_t *) (ETH_MAC_ADDR_LBASE + MacAddr)) = tmpreg;
  63697. 8033444: 4b02 ldr r3, [pc, #8] ; (8033450 <ETH_MACAddressConfig+0x2c>)
  63698. 8033446: 50c2 str r2, [r0, r3]
  63699. 8033448: 4770 bx lr
  63700. 803344a: bf00 nop
  63701. 803344c: 40028040 .word 0x40028040
  63702. 8033450: 40028044 .word 0x40028044
  63703. 08033454 <ETH_Get_Received_Frame_interrupt>:
  63704. * the receive frame (should be used with interrupt mode only)
  63705. * @param None
  63706. * @retval Structure of type FrameTypeDef
  63707. */
  63708. FrameTypeDef ETH_Get_Received_Frame_interrupt(void)
  63709. {
  63710. 8033454: b537 push {r0, r1, r2, r4, r5, lr}
  63711. FrameTypeDef frame={0,0,0};
  63712. __IO uint32_t descriptor_scan_counter = 0;
  63713. 8033456: 2300 movs r3, #0
  63714. 8033458: 9301 str r3, [sp, #4]
  63715. /* check if first segment in frame */
  63716. if(((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)&&
  63717. ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET))
  63718. {
  63719. DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet;
  63720. 803345a: 4b24 ldr r3, [pc, #144] ; (80334ec <ETH_Get_Received_Frame_interrupt+0x98>)
  63721. 803345c: 681a ldr r2, [r3, #0]
  63722. 803345e: 4b24 ldr r3, [pc, #144] ; (80334f0 <ETH_Get_Received_Frame_interrupt+0x9c>)
  63723. DMA_RX_FRAME_infos->Seg_Count = 1;
  63724. 8033460: 2401 movs r4, #1
  63725. 8033462: 681b ldr r3, [r3, #0]
  63726. {
  63727. FrameTypeDef frame={0,0,0};
  63728. __IO uint32_t descriptor_scan_counter = 0;
  63729. /* scan descriptors owned by CPU */
  63730. while (((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET)&&
  63731. 8033464: e033 b.n 80334ce <ETH_Get_Received_Frame_interrupt+0x7a>
  63732. (descriptor_scan_counter<ETH_RXBUFNB))
  63733. {
  63734. /* Just by security */
  63735. descriptor_scan_counter++;
  63736. 8033466: 9901 ldr r1, [sp, #4]
  63737. 8033468: 3101 adds r1, #1
  63738. 803346a: 9101 str r1, [sp, #4]
  63739. /* check if first segment in frame */
  63740. if(((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)&&
  63741. 803346c: 6819 ldr r1, [r3, #0]
  63742. 803346e: 0589 lsls r1, r1, #22
  63743. 8033470: d505 bpl.n 803347e <ETH_Get_Received_Frame_interrupt+0x2a>
  63744. ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET))
  63745. 8033472: 6819 ldr r1, [r3, #0]
  63746. /* Just by security */
  63747. descriptor_scan_counter++;
  63748. /* check if first segment in frame */
  63749. if(((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)&&
  63750. 8033474: 05c9 lsls r1, r1, #23
  63751. 8033476: d402 bmi.n 803347e <ETH_Get_Received_Frame_interrupt+0x2a>
  63752. ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET))
  63753. {
  63754. DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet;
  63755. 8033478: 6013 str r3, [r2, #0]
  63756. DMA_RX_FRAME_infos->Seg_Count = 1;
  63757. 803347a: 6094 str r4, [r2, #8]
  63758. 803347c: e009 b.n 8033492 <ETH_Get_Received_Frame_interrupt+0x3e>
  63759. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  63760. }
  63761. /* check if intermediate segment */
  63762. else if (((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET)&&
  63763. 803347e: 6819 ldr r1, [r3, #0]
  63764. 8033480: 05c9 lsls r1, r1, #23
  63765. 8033482: d408 bmi.n 8033496 <ETH_Get_Received_Frame_interrupt+0x42>
  63766. ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) == (uint32_t)RESET))
  63767. 8033484: 6819 ldr r1, [r3, #0]
  63768. DMA_RX_FRAME_infos->Seg_Count = 1;
  63769. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  63770. }
  63771. /* check if intermediate segment */
  63772. else if (((DMARxDescToGet->Status & ETH_DMARxDesc_LS) == (uint32_t)RESET)&&
  63773. 8033486: 0589 lsls r1, r1, #22
  63774. 8033488: d500 bpl.n 803348c <ETH_Get_Received_Frame_interrupt+0x38>
  63775. 803348a: e004 b.n 8033496 <ETH_Get_Received_Frame_interrupt+0x42>
  63776. ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) == (uint32_t)RESET))
  63777. {
  63778. (DMA_RX_FRAME_infos->Seg_Count) ++;
  63779. 803348c: 6891 ldr r1, [r2, #8]
  63780. 803348e: 3101 adds r1, #1
  63781. 8033490: 6091 str r1, [r2, #8]
  63782. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  63783. 8033492: 68db ldr r3, [r3, #12]
  63784. 8033494: e01b b.n 80334ce <ETH_Get_Received_Frame_interrupt+0x7a>
  63785. 8033496: 4a16 ldr r2, [pc, #88] ; (80334f0 <ETH_Get_Received_Frame_interrupt+0x9c>)
  63786. 8033498: 6013 str r3, [r2, #0]
  63787. /* should be last segment */
  63788. else
  63789. {
  63790. /* last segment */
  63791. DMA_RX_FRAME_infos->LS_Rx_Desc = DMARxDescToGet;
  63792. 803349a: 4a14 ldr r2, [pc, #80] ; (80334ec <ETH_Get_Received_Frame_interrupt+0x98>)
  63793. 803349c: 6812 ldr r2, [r2, #0]
  63794. 803349e: 6053 str r3, [r2, #4]
  63795. (DMA_RX_FRAME_infos->Seg_Count)++;
  63796. 80334a0: 6891 ldr r1, [r2, #8]
  63797. 80334a2: 3101 adds r1, #1
  63798. 80334a4: 6091 str r1, [r2, #8]
  63799. /* first segment is last segment */
  63800. if ((DMA_RX_FRAME_infos->Seg_Count)==1)
  63801. 80334a6: 6891 ldr r1, [r2, #8]
  63802. 80334a8: 2901 cmp r1, #1
  63803. DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet;
  63804. 80334aa: bf08 it eq
  63805. 80334ac: 6013 streq r3, [r2, #0]
  63806. /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
  63807. frame.length = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4;
  63808. 80334ae: 6819 ldr r1, [r3, #0]
  63809. /* Get the address of the buffer start address */
  63810. /* Check if more than one segment in the frame */
  63811. if (DMA_RX_FRAME_infos->Seg_Count >1)
  63812. 80334b0: 6894 ldr r4, [r2, #8]
  63813. /* first segment is last segment */
  63814. if ((DMA_RX_FRAME_infos->Seg_Count)==1)
  63815. DMA_RX_FRAME_infos->FS_Rx_Desc = DMARxDescToGet;
  63816. /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
  63817. frame.length = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4;
  63818. 80334b2: f3c1 410d ubfx r1, r1, #16, #14
  63819. 80334b6: 3904 subs r1, #4
  63820. /* Get the address of the buffer start address */
  63821. /* Check if more than one segment in the frame */
  63822. if (DMA_RX_FRAME_infos->Seg_Count >1)
  63823. 80334b8: 2c01 cmp r4, #1
  63824. {
  63825. frame.buffer =(DMA_RX_FRAME_infos->FS_Rx_Desc)->Buffer1Addr;
  63826. 80334ba: bf8a itet hi
  63827. 80334bc: 6812 ldrhi r2, [r2, #0]
  63828. }
  63829. else
  63830. {
  63831. frame.buffer = DMARxDescToGet->Buffer1Addr;
  63832. 80334be: 689a ldrls r2, [r3, #8]
  63833. /* Get the address of the buffer start address */
  63834. /* Check if more than one segment in the frame */
  63835. if (DMA_RX_FRAME_infos->Seg_Count >1)
  63836. {
  63837. frame.buffer =(DMA_RX_FRAME_infos->FS_Rx_Desc)->Buffer1Addr;
  63838. 80334c0: 6892 ldrhi r2, [r2, #8]
  63839. }
  63840. frame.descriptor = DMARxDescToGet;
  63841. /* Update the ETHERNET DMA global Rx descriptor with next Rx descriptor */
  63842. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  63843. 80334c2: 4c0b ldr r4, [pc, #44] ; (80334f0 <ETH_Get_Received_Frame_interrupt+0x9c>)
  63844. 80334c4: 68dd ldr r5, [r3, #12]
  63845. /* Return Frame */
  63846. return (frame);
  63847. 80334c6: e880 0006 stmia.w r0, {r1, r2}
  63848. }
  63849. frame.descriptor = DMARxDescToGet;
  63850. /* Update the ETHERNET DMA global Rx descriptor with next Rx descriptor */
  63851. DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
  63852. 80334ca: 6025 str r5, [r4, #0]
  63853. 80334cc: e007 b.n 80334de <ETH_Get_Received_Frame_interrupt+0x8a>
  63854. {
  63855. FrameTypeDef frame={0,0,0};
  63856. __IO uint32_t descriptor_scan_counter = 0;
  63857. /* scan descriptors owned by CPU */
  63858. while (((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET)&&
  63859. 80334ce: 6819 ldr r1, [r3, #0]
  63860. 80334d0: 2900 cmp r1, #0
  63861. 80334d2: da06 bge.n 80334e2 <ETH_Get_Received_Frame_interrupt+0x8e>
  63862. 80334d4: 4a06 ldr r2, [pc, #24] ; (80334f0 <ETH_Get_Received_Frame_interrupt+0x9c>)
  63863. 80334d6: 6013 str r3, [r2, #0]
  63864. /* Return Frame */
  63865. return (frame);
  63866. }
  63867. }
  63868. return (frame);
  63869. 80334d8: 2300 movs r3, #0
  63870. 80334da: 6003 str r3, [r0, #0]
  63871. 80334dc: 6043 str r3, [r0, #4]
  63872. 80334de: 6083 str r3, [r0, #8]
  63873. 80334e0: e003 b.n 80334ea <ETH_Get_Received_Frame_interrupt+0x96>
  63874. FrameTypeDef frame={0,0,0};
  63875. __IO uint32_t descriptor_scan_counter = 0;
  63876. /* scan descriptors owned by CPU */
  63877. while (((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET)&&
  63878. (descriptor_scan_counter<ETH_RXBUFNB))
  63879. 80334e2: 9901 ldr r1, [sp, #4]
  63880. {
  63881. FrameTypeDef frame={0,0,0};
  63882. __IO uint32_t descriptor_scan_counter = 0;
  63883. /* scan descriptors owned by CPU */
  63884. while (((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET)&&
  63885. 80334e4: 2904 cmp r1, #4
  63886. 80334e6: d9be bls.n 8033466 <ETH_Get_Received_Frame_interrupt+0x12>
  63887. 80334e8: e7f4 b.n 80334d4 <ETH_Get_Received_Frame_interrupt+0x80>
  63888. /* Return Frame */
  63889. return (frame);
  63890. }
  63891. }
  63892. return (frame);
  63893. }
  63894. 80334ea: bd3e pop {r1, r2, r3, r4, r5, pc}
  63895. 80334ec: 2001306c .word 0x2001306c
  63896. 80334f0: 200111fc .word 0x200111fc
  63897. 080334f4 <ETH_Prepare_Transmit_Descriptors>:
  63898. {
  63899. uint32_t buf_count =0, size=0,i=0;
  63900. __IO ETH_DMADESCTypeDef *DMATxNextDesc;
  63901. /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
  63902. if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (u32)RESET)
  63903. 80334f4: 4b29 ldr r3, [pc, #164] ; (803359c <ETH_Prepare_Transmit_Descriptors+0xa8>)
  63904. 80334f6: 681b ldr r3, [r3, #0]
  63905. 80334f8: 681a ldr r2, [r3, #0]
  63906. 80334fa: 2a00 cmp r2, #0
  63907. * @brief Prepares DMA Tx descriptors to transmit an ethernet frame
  63908. * @param FrameLength : length of the frame to send
  63909. * @retval error status
  63910. */
  63911. uint32_t ETH_Prepare_Transmit_Descriptors(u16 FrameLength)
  63912. {
  63913. 80334fc: b5f0 push {r4, r5, r6, r7, lr}
  63914. uint32_t buf_count =0, size=0,i=0;
  63915. __IO ETH_DMADESCTypeDef *DMATxNextDesc;
  63916. /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
  63917. if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (u32)RESET)
  63918. 80334fe: db48 blt.n 8033592 <ETH_Prepare_Transmit_Descriptors+0x9e>
  63919. return ETH_ERROR;
  63920. }
  63921. DMATxNextDesc = DMATxDescToSet;
  63922. if (FrameLength > ETH_TX_BUF_SIZE)
  63923. 8033500: f240 52f4 movw r2, #1524 ; 0x5f4
  63924. 8033504: 4290 cmp r0, r2
  63925. 8033506: d917 bls.n 8033538 <ETH_Prepare_Transmit_Descriptors+0x44>
  63926. {
  63927. buf_count = FrameLength/ETH_TX_BUF_SIZE;
  63928. 8033508: fbb0 f4f2 udiv r4, r0, r2
  63929. if (FrameLength%ETH_TX_BUF_SIZE) buf_count++;
  63930. 803350c: fb02 0214 mls r2, r2, r4, r0
  63931. 8033510: b292 uxth r2, r2
  63932. DMATxNextDesc = DMATxDescToSet;
  63933. if (FrameLength > ETH_TX_BUF_SIZE)
  63934. {
  63935. buf_count = FrameLength/ETH_TX_BUF_SIZE;
  63936. 8033512: b2a1 uxth r1, r4
  63937. if (FrameLength%ETH_TX_BUF_SIZE) buf_count++;
  63938. 8033514: b10a cbz r2, 803351a <ETH_Prepare_Transmit_Descriptors+0x26>
  63939. 8033516: 3101 adds r1, #1
  63940. 8033518: e001 b.n 803351e <ETH_Prepare_Transmit_Descriptors+0x2a>
  63941. }
  63942. else buf_count =1;
  63943. if (buf_count ==1)
  63944. 803351a: 2901 cmp r1, #1
  63945. 803351c: d00c beq.n 8033538 <ETH_Prepare_Transmit_Descriptors+0x44>
  63946. if (i== (buf_count-1))
  63947. {
  63948. /* Setting the last segment bit */
  63949. DMATxNextDesc->Status |= ETH_DMATxDesc_LS;
  63950. size = FrameLength - (buf_count-1)*ETH_TX_BUF_SIZE;
  63951. 803351e: 4d20 ldr r5, [pc, #128] ; (80335a0 <ETH_Prepare_Transmit_Descriptors+0xac>)
  63952. 8033520: f200 50f4 addw r0, r0, #1524 ; 0x5f4
  63953. 8033524: fb05 0501 mla r5, r5, r1, r0
  63954. DMATxNextDesc->ControlBufferSize = (size & ETH_DMATxDesc_TBS1);
  63955. 8033528: 04ed lsls r5, r5, #19
  63956. 803352a: 0ced lsrs r5, r5, #19
  63957. 803352c: 461a mov r2, r3
  63958. 803352e: 2000 movs r0, #0
  63959. /* Setting the first segment bit */
  63960. DMATxDescToSet->Status |= ETH_DMATxDesc_FS;
  63961. }
  63962. /* Program size */
  63963. DMATxNextDesc->ControlBufferSize = (ETH_TX_BUF_SIZE & ETH_DMATxDesc_TBS1);
  63964. 8033530: f240 56f4 movw r6, #1524 ; 0x5f4
  63965. if (i== (buf_count-1))
  63966. 8033534: 1e4f subs r7, r1, #1
  63967. 8033536: e00c b.n 8033552 <ETH_Prepare_Transmit_Descriptors+0x5e>
  63968. else buf_count =1;
  63969. if (buf_count ==1)
  63970. {
  63971. /*set LAST and FIRST segment */
  63972. DMATxDescToSet->Status |=ETH_DMATxDesc_FS|ETH_DMATxDesc_LS;
  63973. 8033538: 681a ldr r2, [r3, #0]
  63974. /* Set frame size */
  63975. DMATxDescToSet->ControlBufferSize = (FrameLength& ETH_DMATxDesc_TBS1);
  63976. 803353a: 04c0 lsls r0, r0, #19
  63977. else buf_count =1;
  63978. if (buf_count ==1)
  63979. {
  63980. /*set LAST and FIRST segment */
  63981. DMATxDescToSet->Status |=ETH_DMATxDesc_FS|ETH_DMATxDesc_LS;
  63982. 803353c: f042 5240 orr.w r2, r2, #805306368 ; 0x30000000
  63983. /* Set frame size */
  63984. DMATxDescToSet->ControlBufferSize = (FrameLength& ETH_DMATxDesc_TBS1);
  63985. 8033540: 0cc0 lsrs r0, r0, #19
  63986. else buf_count =1;
  63987. if (buf_count ==1)
  63988. {
  63989. /*set LAST and FIRST segment */
  63990. DMATxDescToSet->Status |=ETH_DMATxDesc_FS|ETH_DMATxDesc_LS;
  63991. 8033542: 601a str r2, [r3, #0]
  63992. /* Set frame size */
  63993. DMATxDescToSet->ControlBufferSize = (FrameLength& ETH_DMATxDesc_TBS1);
  63994. 8033544: 6058 str r0, [r3, #4]
  63995. /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
  63996. DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
  63997. 8033546: 681a ldr r2, [r3, #0]
  63998. 8033548: f042 4200 orr.w r2, r2, #2147483648 ; 0x80000000
  63999. 803354c: 601a str r2, [r3, #0]
  64000. DMATxDescToSet= (ETH_DMADESCTypeDef *)(DMATxDescToSet->Buffer2NextDescAddr);
  64001. 803354e: 68da ldr r2, [r3, #12]
  64002. 8033550: e014 b.n 803357c <ETH_Prepare_Transmit_Descriptors+0x88>
  64003. }
  64004. else
  64005. {
  64006. for (i=0; i< buf_count; i++)
  64007. {
  64008. if (i==0)
  64009. 8033552: b918 cbnz r0, 803355c <ETH_Prepare_Transmit_Descriptors+0x68>
  64010. {
  64011. /* Setting the first segment bit */
  64012. DMATxDescToSet->Status |= ETH_DMATxDesc_FS;
  64013. 8033554: 681c ldr r4, [r3, #0]
  64014. 8033556: f044 5480 orr.w r4, r4, #268435456 ; 0x10000000
  64015. 803355a: 601c str r4, [r3, #0]
  64016. }
  64017. /* Program size */
  64018. DMATxNextDesc->ControlBufferSize = (ETH_TX_BUF_SIZE & ETH_DMATxDesc_TBS1);
  64019. if (i== (buf_count-1))
  64020. 803355c: 42b8 cmp r0, r7
  64021. /* Setting the first segment bit */
  64022. DMATxDescToSet->Status |= ETH_DMATxDesc_FS;
  64023. }
  64024. /* Program size */
  64025. DMATxNextDesc->ControlBufferSize = (ETH_TX_BUF_SIZE & ETH_DMATxDesc_TBS1);
  64026. 803355e: 6056 str r6, [r2, #4]
  64027. if (i== (buf_count-1))
  64028. 8033560: d104 bne.n 803356c <ETH_Prepare_Transmit_Descriptors+0x78>
  64029. {
  64030. /* Setting the last segment bit */
  64031. DMATxNextDesc->Status |= ETH_DMATxDesc_LS;
  64032. 8033562: 6814 ldr r4, [r2, #0]
  64033. 8033564: f044 5400 orr.w r4, r4, #536870912 ; 0x20000000
  64034. 8033568: 6014 str r4, [r2, #0]
  64035. size = FrameLength - (buf_count-1)*ETH_TX_BUF_SIZE;
  64036. DMATxNextDesc->ControlBufferSize = (size & ETH_DMATxDesc_TBS1);
  64037. 803356a: 6055 str r5, [r2, #4]
  64038. }
  64039. /*give back descriptor to DMA */
  64040. DMATxNextDesc->Status |= ETH_DMATxDesc_OWN;
  64041. 803356c: 6814 ldr r4, [r2, #0]
  64042. DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
  64043. DMATxDescToSet= (ETH_DMADESCTypeDef *)(DMATxDescToSet->Buffer2NextDescAddr);
  64044. }
  64045. else
  64046. {
  64047. for (i=0; i< buf_count; i++)
  64048. 803356e: 3001 adds r0, #1
  64049. size = FrameLength - (buf_count-1)*ETH_TX_BUF_SIZE;
  64050. DMATxNextDesc->ControlBufferSize = (size & ETH_DMATxDesc_TBS1);
  64051. }
  64052. /*give back descriptor to DMA */
  64053. DMATxNextDesc->Status |= ETH_DMATxDesc_OWN;
  64054. 8033570: f044 4400 orr.w r4, r4, #2147483648 ; 0x80000000
  64055. 8033574: 6014 str r4, [r2, #0]
  64056. DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
  64057. DMATxDescToSet= (ETH_DMADESCTypeDef *)(DMATxDescToSet->Buffer2NextDescAddr);
  64058. }
  64059. else
  64060. {
  64061. for (i=0; i< buf_count; i++)
  64062. 8033576: 4288 cmp r0, r1
  64063. }
  64064. /*give back descriptor to DMA */
  64065. DMATxNextDesc->Status |= ETH_DMATxDesc_OWN;
  64066. DMATxNextDesc = (ETH_DMADESCTypeDef *)(DMATxNextDesc->Buffer2NextDescAddr);
  64067. 8033578: 68d2 ldr r2, [r2, #12]
  64068. DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
  64069. DMATxDescToSet= (ETH_DMADESCTypeDef *)(DMATxDescToSet->Buffer2NextDescAddr);
  64070. }
  64071. else
  64072. {
  64073. for (i=0; i< buf_count; i++)
  64074. 803357a: d3ea bcc.n 8033552 <ETH_Prepare_Transmit_Descriptors+0x5e>
  64075. DMATxNextDesc->Status |= ETH_DMATxDesc_OWN;
  64076. DMATxNextDesc = (ETH_DMADESCTypeDef *)(DMATxNextDesc->Buffer2NextDescAddr);
  64077. /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
  64078. }
  64079. DMATxDescToSet = DMATxNextDesc ;
  64080. 803357c: 4b07 ldr r3, [pc, #28] ; (803359c <ETH_Prepare_Transmit_Descriptors+0xa8>)
  64081. 803357e: 601a str r2, [r3, #0]
  64082. }
  64083. /* When Tx Buffer unavailable flag is set: clear it and resume transmission */
  64084. if ((ETH->DMASR & ETH_DMASR_TBUS) != (u32)RESET)
  64085. 8033580: 4b08 ldr r3, [pc, #32] ; (80335a4 <ETH_Prepare_Transmit_Descriptors+0xb0>)
  64086. 8033582: 695a ldr r2, [r3, #20]
  64087. 8033584: 0750 lsls r0, r2, #29
  64088. 8033586: d506 bpl.n 8033596 <ETH_Prepare_Transmit_Descriptors+0xa2>
  64089. {
  64090. /* Clear TBUS ETHERNET DMA flag */
  64091. ETH->DMASR = ETH_DMASR_TBUS;
  64092. 8033588: 2204 movs r2, #4
  64093. 803358a: 615a str r2, [r3, #20]
  64094. /* Resume DMA transmission*/
  64095. ETH->DMATPDR = 0;
  64096. 803358c: 2200 movs r2, #0
  64097. 803358e: 605a str r2, [r3, #4]
  64098. 8033590: e001 b.n 8033596 <ETH_Prepare_Transmit_Descriptors+0xa2>
  64099. /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
  64100. if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (u32)RESET)
  64101. {
  64102. /* Return ERROR: OWN bit set */
  64103. return ETH_ERROR;
  64104. 8033592: 2000 movs r0, #0
  64105. 8033594: bdf0 pop {r4, r5, r6, r7, pc}
  64106. /* Resume DMA transmission*/
  64107. ETH->DMATPDR = 0;
  64108. }
  64109. /* Return SUCCESS */
  64110. return ETH_SUCCESS;
  64111. 8033596: 2001 movs r0, #1
  64112. }
  64113. 8033598: bdf0 pop {r4, r5, r6, r7, pc}
  64114. 803359a: bf00 nop
  64115. 803359c: 20011200 .word 0x20011200
  64116. 80335a0: fffffa0c .word 0xfffffa0c
  64117. 80335a4: 40029000 .word 0x40029000
  64118. 080335a8 <ETH_DMARxDescChainInit>:
  64119. {
  64120. uint32_t i = 0;
  64121. ETH_DMADESCTypeDef *DMARxDesc;
  64122. /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
  64123. DMARxDescToGet = DMARxDescTab;
  64124. 80335a8: 4b11 ldr r3, [pc, #68] ; (80335f0 <ETH_DMARxDescChainInit+0x48>)
  64125. * @param RxBuff: Pointer on the first RxBuffer list
  64126. * @param RxBuffCount: Number of the used Rx desc in the list
  64127. * @retval None
  64128. */
  64129. void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount)
  64130. {
  64131. 80335aa: b5f0 push {r4, r5, r6, r7, lr}
  64132. uint32_t i = 0;
  64133. ETH_DMADESCTypeDef *DMARxDesc;
  64134. /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
  64135. DMARxDescToGet = DMARxDescTab;
  64136. 80335ac: 6018 str r0, [r3, #0]
  64137. /* Fill each DMARxDesc descriptor with the right values */
  64138. for(i=0; i < RxBuffCount; i++)
  64139. 80335ae: 2400 movs r4, #0
  64140. * @param DMARxDescTab: Pointer on the first Rx desc list
  64141. * @param RxBuff: Pointer on the first RxBuffer list
  64142. * @param RxBuffCount: Number of the used Rx desc in the list
  64143. * @retval None
  64144. */
  64145. void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount)
  64146. 80335b0: f100 0320 add.w r3, r0, #32
  64147. for(i=0; i < RxBuffCount; i++)
  64148. {
  64149. /* Get the pointer on the ith member of the Rx Desc list */
  64150. DMARxDesc = DMARxDescTab+i;
  64151. /* Set Own bit of the Rx descriptor Status */
  64152. DMARxDesc->Status = ETH_DMARxDesc_OWN;
  64153. 80335b4: f04f 4500 mov.w r5, #2147483648 ; 0x80000000
  64154. /* Set Buffer1 size and Second Address Chained bit */
  64155. DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_RX_BUF_SIZE;
  64156. 80335b8: f244 56f4 movw r6, #17908 ; 0x45f4
  64157. /* Set Buffer1 address pointer */
  64158. DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_RX_BUF_SIZE]);
  64159. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  64160. if(i < (RxBuffCount-1))
  64161. 80335bc: 1e57 subs r7, r2, #1
  64162. ETH_DMADESCTypeDef *DMARxDesc;
  64163. /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
  64164. DMARxDescToGet = DMARxDescTab;
  64165. /* Fill each DMARxDesc descriptor with the right values */
  64166. for(i=0; i < RxBuffCount; i++)
  64167. 80335be: e00f b.n 80335e0 <ETH_DMARxDescChainInit+0x38>
  64168. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  64169. if(i < (RxBuffCount-1))
  64170. {
  64171. /* Set next descriptor address register with next descriptor base address */
  64172. DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1);
  64173. 80335c0: 42bc cmp r4, r7
  64174. 80335c2: bf2c ite cs
  64175. 80335c4: 4684 movcs ip, r0
  64176. 80335c6: 469c movcc ip, r3
  64177. DMARxDesc->Status = ETH_DMARxDesc_OWN;
  64178. /* Set Buffer1 size and Second Address Chained bit */
  64179. DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_RX_BUF_SIZE;
  64180. /* Set Buffer1 address pointer */
  64181. DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_RX_BUF_SIZE]);
  64182. 80335c8: f843 1c18 str.w r1, [r3, #-24]
  64183. for(i=0; i < RxBuffCount; i++)
  64184. {
  64185. /* Get the pointer on the ith member of the Rx Desc list */
  64186. DMARxDesc = DMARxDescTab+i;
  64187. /* Set Own bit of the Rx descriptor Status */
  64188. DMARxDesc->Status = ETH_DMARxDesc_OWN;
  64189. 80335cc: f843 5c20 str.w r5, [r3, #-32]
  64190. /* Set Buffer1 size and Second Address Chained bit */
  64191. DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_RX_BUF_SIZE;
  64192. 80335d0: f843 6c1c str.w r6, [r3, #-28]
  64193. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  64194. if(i < (RxBuffCount-1))
  64195. {
  64196. /* Set next descriptor address register with next descriptor base address */
  64197. DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1);
  64198. 80335d4: f843 cc14 str.w ip, [r3, #-20]
  64199. ETH_DMADESCTypeDef *DMARxDesc;
  64200. /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
  64201. DMARxDescToGet = DMARxDescTab;
  64202. /* Fill each DMARxDesc descriptor with the right values */
  64203. for(i=0; i < RxBuffCount; i++)
  64204. 80335d8: 3401 adds r4, #1
  64205. 80335da: 3320 adds r3, #32
  64206. 80335dc: f201 51f4 addw r1, r1, #1524 ; 0x5f4
  64207. 80335e0: 4294 cmp r4, r2
  64208. 80335e2: d1ed bne.n 80335c0 <ETH_DMARxDescChainInit+0x18>
  64209. DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab);
  64210. }
  64211. }
  64212. /* Set Receive Descriptor List Address Register */
  64213. ETH->DMARDLAR = (uint32_t) DMARxDescTab;
  64214. 80335e4: 4b03 ldr r3, [pc, #12] ; (80335f4 <ETH_DMARxDescChainInit+0x4c>)
  64215. DMA_RX_FRAME_infos = &RX_Frame_Descriptor;
  64216. 80335e6: 4a04 ldr r2, [pc, #16] ; (80335f8 <ETH_DMARxDescChainInit+0x50>)
  64217. DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab);
  64218. }
  64219. }
  64220. /* Set Receive Descriptor List Address Register */
  64221. ETH->DMARDLAR = (uint32_t) DMARxDescTab;
  64222. 80335e8: 60d8 str r0, [r3, #12]
  64223. DMA_RX_FRAME_infos = &RX_Frame_Descriptor;
  64224. 80335ea: 4b04 ldr r3, [pc, #16] ; (80335fc <ETH_DMARxDescChainInit+0x54>)
  64225. 80335ec: 601a str r2, [r3, #0]
  64226. 80335ee: bdf0 pop {r4, r5, r6, r7, pc}
  64227. 80335f0: 200111fc .word 0x200111fc
  64228. 80335f4: 40029000 .word 0x40029000
  64229. 80335f8: 200111f0 .word 0x200111f0
  64230. 80335fc: 2001306c .word 0x2001306c
  64231. 08033600 <ETH_DMATxDescChainInit>:
  64232. {
  64233. uint32_t i = 0;
  64234. ETH_DMADESCTypeDef *DMATxDesc;
  64235. /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
  64236. DMATxDescToSet = DMATxDescTab;
  64237. 8033600: 4b0e ldr r3, [pc, #56] ; (803363c <ETH_DMATxDescChainInit+0x3c>)
  64238. * @param TxBuff: Pointer on the first TxBuffer list
  64239. * @param TxBuffCount: Number of the used Tx desc in the list
  64240. * @retval None
  64241. */
  64242. void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount)
  64243. {
  64244. 8033602: b5f0 push {r4, r5, r6, r7, lr}
  64245. uint32_t i = 0;
  64246. ETH_DMADESCTypeDef *DMATxDesc;
  64247. /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
  64248. DMATxDescToSet = DMATxDescTab;
  64249. 8033604: 6018 str r0, [r3, #0]
  64250. /* Fill each DMATxDesc descriptor with the right values */
  64251. for(i=0; i < TxBuffCount; i++)
  64252. 8033606: 2400 movs r4, #0
  64253. * @param DMATxDescTab: Pointer on the first Tx desc list
  64254. * @param TxBuff: Pointer on the first TxBuffer list
  64255. * @param TxBuffCount: Number of the used Tx desc in the list
  64256. * @retval None
  64257. */
  64258. void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount)
  64259. 8033608: f100 0320 add.w r3, r0, #32
  64260. for(i=0; i < TxBuffCount; i++)
  64261. {
  64262. /* Get the pointer on the ith member of the Tx Desc list */
  64263. DMATxDesc = DMATxDescTab + i;
  64264. /* Set Second Address Chained bit */
  64265. DMATxDesc->Status = ETH_DMATxDesc_TCH;
  64266. 803360c: f44f 1580 mov.w r5, #1048576 ; 0x100000
  64267. /* Set Buffer1 address pointer */
  64268. DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i*ETH_TX_BUF_SIZE]);
  64269. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  64270. if(i < (TxBuffCount-1))
  64271. 8033610: 1e56 subs r6, r2, #1
  64272. ETH_DMADESCTypeDef *DMATxDesc;
  64273. /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
  64274. DMATxDescToSet = DMATxDescTab;
  64275. /* Fill each DMATxDesc descriptor with the right values */
  64276. for(i=0; i < TxBuffCount; i++)
  64277. 8033612: e00d b.n 8033630 <ETH_DMATxDescChainInit+0x30>
  64278. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  64279. if(i < (TxBuffCount-1))
  64280. {
  64281. /* Set next descriptor address register with next descriptor base address */
  64282. DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1);
  64283. 8033614: 42b4 cmp r4, r6
  64284. 8033616: bf2c ite cs
  64285. 8033618: 4607 movcs r7, r0
  64286. 803361a: 461f movcc r7, r3
  64287. DMATxDesc = DMATxDescTab + i;
  64288. /* Set Second Address Chained bit */
  64289. DMATxDesc->Status = ETH_DMATxDesc_TCH;
  64290. /* Set Buffer1 address pointer */
  64291. DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i*ETH_TX_BUF_SIZE]);
  64292. 803361c: f843 1c18 str.w r1, [r3, #-24]
  64293. for(i=0; i < TxBuffCount; i++)
  64294. {
  64295. /* Get the pointer on the ith member of the Tx Desc list */
  64296. DMATxDesc = DMATxDescTab + i;
  64297. /* Set Second Address Chained bit */
  64298. DMATxDesc->Status = ETH_DMATxDesc_TCH;
  64299. 8033620: f843 5c20 str.w r5, [r3, #-32]
  64300. /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  64301. if(i < (TxBuffCount-1))
  64302. {
  64303. /* Set next descriptor address register with next descriptor base address */
  64304. DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1);
  64305. 8033624: f843 7c14 str.w r7, [r3, #-20]
  64306. ETH_DMADESCTypeDef *DMATxDesc;
  64307. /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
  64308. DMATxDescToSet = DMATxDescTab;
  64309. /* Fill each DMATxDesc descriptor with the right values */
  64310. for(i=0; i < TxBuffCount; i++)
  64311. 8033628: 3401 adds r4, #1
  64312. 803362a: 3320 adds r3, #32
  64313. 803362c: f201 51f4 addw r1, r1, #1524 ; 0x5f4
  64314. 8033630: 4294 cmp r4, r2
  64315. 8033632: d1ef bne.n 8033614 <ETH_DMATxDescChainInit+0x14>
  64316. DMATxDesc->Buffer2NextDescAddr = (uint32_t) DMATxDescTab;
  64317. }
  64318. }
  64319. /* Set Transmit Desciptor List Address Register */
  64320. ETH->DMATDLAR = (uint32_t) DMATxDescTab;
  64321. 8033634: 4b02 ldr r3, [pc, #8] ; (8033640 <ETH_DMATxDescChainInit+0x40>)
  64322. 8033636: 6118 str r0, [r3, #16]
  64323. 8033638: bdf0 pop {r4, r5, r6, r7, pc}
  64324. 803363a: bf00 nop
  64325. 803363c: 20011200 .word 0x20011200
  64326. 8033640: 40029000 .word 0x40029000
  64327. 08033644 <ETH_DMATxDescChecksumInsertionConfig>:
  64328. {
  64329. /* Check the parameters */
  64330. assert_param(IS_ETH_DMA_TXDESC_CHECKSUM(DMATxDesc_Checksum));
  64331. /* Set the selected DMA Tx desc checksum insertion control */
  64332. DMATxDesc->Status |= DMATxDesc_Checksum;
  64333. 8033644: 6803 ldr r3, [r0, #0]
  64334. 8033646: 4319 orrs r1, r3
  64335. 8033648: 6001 str r1, [r0, #0]
  64336. 803364a: 4770 bx lr
  64337. 0803364c <ETH_DMARxDescReceiveITConfig>:
  64338. * @param NewState: new state of the specified DMA Rx Desc interrupt.
  64339. * This parameter can be: ENABLE or DISABLE.
  64340. * @retval None
  64341. */
  64342. void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState)
  64343. {
  64344. 803364c: 6843 ldr r3, [r0, #4]
  64345. /* Check the parameters */
  64346. assert_param(IS_FUNCTIONAL_STATE(NewState));
  64347. if (NewState != DISABLE)
  64348. 803364e: b111 cbz r1, 8033656 <ETH_DMARxDescReceiveITConfig+0xa>
  64349. {
  64350. /* Enable the DMA Rx Desc receive interrupt */
  64351. DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_DIC);
  64352. 8033650: f023 4300 bic.w r3, r3, #2147483648 ; 0x80000000
  64353. 8033654: e001 b.n 803365a <ETH_DMARxDescReceiveITConfig+0xe>
  64354. }
  64355. else
  64356. {
  64357. /* Disable the DMA Rx Desc receive interrupt */
  64358. DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_DIC;
  64359. 8033656: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000
  64360. 803365a: 6043 str r3, [r0, #4]
  64361. 803365c: 4770 bx lr
  64362. 803365e: 0000 movs r0, r0
  64363. 08033660 <ETH_SoftwareReset>:
  64364. */
  64365. void ETH_SoftwareReset(void)
  64366. {
  64367. /* Set the SWR bit: resets all MAC subsystem internal registers and logic */
  64368. /* After reset all the registers holds their respective reset values */
  64369. ETH->DMABMR |= ETH_DMABMR_SR;
  64370. 8033660: 4b02 ldr r3, [pc, #8] ; (803366c <ETH_SoftwareReset+0xc>)
  64371. 8033662: 681a ldr r2, [r3, #0]
  64372. 8033664: f042 0201 orr.w r2, r2, #1
  64373. 8033668: 601a str r2, [r3, #0]
  64374. 803366a: 4770 bx lr
  64375. 803366c: 40029000 .word 0x40029000
  64376. 08033670 <ETH_GetSoftwareResetStatus>:
  64377. * @retval The new state of DMA Bus Mode register SR bit (SET or RESET).
  64378. */
  64379. FlagStatus ETH_GetSoftwareResetStatus(void)
  64380. {
  64381. FlagStatus bitstatus = RESET;
  64382. if((ETH->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET)
  64383. 8033670: 4b02 ldr r3, [pc, #8] ; (803367c <ETH_GetSoftwareResetStatus+0xc>)
  64384. 8033672: 6818 ldr r0, [r3, #0]
  64385. else
  64386. {
  64387. bitstatus = RESET;
  64388. }
  64389. return bitstatus;
  64390. }
  64391. 8033674: f000 0001 and.w r0, r0, #1
  64392. 8033678: 4770 bx lr
  64393. 803367a: bf00 nop
  64394. 803367c: 40029000 .word 0x40029000
  64395. 08033680 <ETH_GetDMAFlagStatus>:
  64396. FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG)
  64397. {
  64398. FlagStatus bitstatus = RESET;
  64399. /* Check the parameters */
  64400. assert_param(IS_ETH_DMA_GET_IT(ETH_DMA_FLAG));
  64401. if ((ETH->DMASR & ETH_DMA_FLAG) != (uint32_t)RESET)
  64402. 8033680: 4b03 ldr r3, [pc, #12] ; (8033690 <ETH_GetDMAFlagStatus+0x10>)
  64403. 8033682: 695b ldr r3, [r3, #20]
  64404. 8033684: 4218 tst r0, r3
  64405. else
  64406. {
  64407. bitstatus = RESET;
  64408. }
  64409. return bitstatus;
  64410. }
  64411. 8033686: bf0c ite eq
  64412. 8033688: 2000 moveq r0, #0
  64413. 803368a: 2001 movne r0, #1
  64414. 803368c: 4770 bx lr
  64415. 803368e: bf00 nop
  64416. 8033690: 40029000 .word 0x40029000
  64417. 08033694 <ETH_DMAITConfig>:
  64418. * @param NewState: new state of the specified ETHERNET DMA interrupts.
  64419. * This parameter can be: ENABLE or DISABLE.
  64420. * @retval None
  64421. */
  64422. void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState)
  64423. {
  64424. 8033694: 4b04 ldr r3, [pc, #16] ; (80336a8 <ETH_DMAITConfig+0x14>)
  64425. assert_param(IS_FUNCTIONAL_STATE(NewState));
  64426. if (NewState != DISABLE)
  64427. {
  64428. /* Enable the selected ETHERNET DMA interrupts */
  64429. ETH->DMAIER |= ETH_DMA_IT;
  64430. 8033696: 69da ldr r2, [r3, #28]
  64431. {
  64432. /* Check the parameters */
  64433. assert_param(IS_ETH_DMA_IT(ETH_DMA_IT));
  64434. assert_param(IS_FUNCTIONAL_STATE(NewState));
  64435. if (NewState != DISABLE)
  64436. 8033698: b109 cbz r1, 803369e <ETH_DMAITConfig+0xa>
  64437. {
  64438. /* Enable the selected ETHERNET DMA interrupts */
  64439. ETH->DMAIER |= ETH_DMA_IT;
  64440. 803369a: 4310 orrs r0, r2
  64441. 803369c: e001 b.n 80336a2 <ETH_DMAITConfig+0xe>
  64442. }
  64443. else
  64444. {
  64445. /* Disable the selected ETHERNET DMA interrupts */
  64446. ETH->DMAIER &=(~(uint32_t)ETH_DMA_IT);
  64447. 803369e: ea22 0000 bic.w r0, r2, r0
  64448. 80336a2: 61d8 str r0, [r3, #28]
  64449. 80336a4: 4770 bx lr
  64450. 80336a6: bf00 nop
  64451. 80336a8: 40029000 .word 0x40029000
  64452. 080336ac <ETH_DMAClearITPendingBit>:
  64453. {
  64454. /* Check the parameters */
  64455. assert_param(IS_ETH_DMA_IT(ETH_DMA_IT));
  64456. /* Clear the selected ETHERNET DMA IT */
  64457. ETH->DMASR = (uint32_t) ETH_DMA_IT;
  64458. 80336ac: 4b01 ldr r3, [pc, #4] ; (80336b4 <ETH_DMAClearITPendingBit+0x8>)
  64459. 80336ae: 6158 str r0, [r3, #20]
  64460. 80336b0: 4770 bx lr
  64461. 80336b2: bf00 nop
  64462. 80336b4: 40029000 .word 0x40029000
  64463. 080336b8 <ETH_FlushTransmitFIFO>:
  64464. * @retval None
  64465. */
  64466. void ETH_FlushTransmitFIFO(void)
  64467. {
  64468. /* Set the Flush Transmit FIFO bit */
  64469. ETH->DMAOMR |= ETH_DMAOMR_FTF;
  64470. 80336b8: 4b02 ldr r3, [pc, #8] ; (80336c4 <ETH_FlushTransmitFIFO+0xc>)
  64471. 80336ba: 699a ldr r2, [r3, #24]
  64472. 80336bc: f442 1280 orr.w r2, r2, #1048576 ; 0x100000
  64473. 80336c0: 619a str r2, [r3, #24]
  64474. 80336c2: 4770 bx lr
  64475. 80336c4: 40029000 .word 0x40029000
  64476. 080336c8 <ETH_DMATransmissionCmd>:
  64477. * @param NewState: new state of the DMA transmission.
  64478. * This parameter can be: ENABLE or DISABLE.
  64479. * @retval None
  64480. */
  64481. void ETH_DMATransmissionCmd(FunctionalState NewState)
  64482. {
  64483. 80336c8: 4b04 ldr r3, [pc, #16] ; (80336dc <ETH_DMATransmissionCmd+0x14>)
  64484. assert_param(IS_FUNCTIONAL_STATE(NewState));
  64485. if (NewState != DISABLE)
  64486. {
  64487. /* Enable the DMA transmission */
  64488. ETH->DMAOMR |= ETH_DMAOMR_ST;
  64489. 80336ca: 699a ldr r2, [r3, #24]
  64490. void ETH_DMATransmissionCmd(FunctionalState NewState)
  64491. {
  64492. /* Check the parameters */
  64493. assert_param(IS_FUNCTIONAL_STATE(NewState));
  64494. if (NewState != DISABLE)
  64495. 80336cc: b110 cbz r0, 80336d4 <ETH_DMATransmissionCmd+0xc>
  64496. {
  64497. /* Enable the DMA transmission */
  64498. ETH->DMAOMR |= ETH_DMAOMR_ST;
  64499. 80336ce: f442 5200 orr.w r2, r2, #8192 ; 0x2000
  64500. 80336d2: e001 b.n 80336d8 <ETH_DMATransmissionCmd+0x10>
  64501. }
  64502. else
  64503. {
  64504. /* Disable the DMA transmission */
  64505. ETH->DMAOMR &= ~ETH_DMAOMR_ST;
  64506. 80336d4: f422 5200 bic.w r2, r2, #8192 ; 0x2000
  64507. 80336d8: 619a str r2, [r3, #24]
  64508. 80336da: 4770 bx lr
  64509. 80336dc: 40029000 .word 0x40029000
  64510. 080336e0 <ETH_DMAReceptionCmd>:
  64511. * @param NewState: new state of the DMA reception.
  64512. * This parameter can be: ENABLE or DISABLE.
  64513. * @retval None
  64514. */
  64515. void ETH_DMAReceptionCmd(FunctionalState NewState)
  64516. {
  64517. 80336e0: 4b04 ldr r3, [pc, #16] ; (80336f4 <ETH_DMAReceptionCmd+0x14>)
  64518. assert_param(IS_FUNCTIONAL_STATE(NewState));
  64519. if (NewState != DISABLE)
  64520. {
  64521. /* Enable the DMA reception */
  64522. ETH->DMAOMR |= ETH_DMAOMR_SR;
  64523. 80336e2: 699a ldr r2, [r3, #24]
  64524. void ETH_DMAReceptionCmd(FunctionalState NewState)
  64525. {
  64526. /* Check the parameters */
  64527. assert_param(IS_FUNCTIONAL_STATE(NewState));
  64528. if (NewState != DISABLE)
  64529. 80336e4: b110 cbz r0, 80336ec <ETH_DMAReceptionCmd+0xc>
  64530. {
  64531. /* Enable the DMA reception */
  64532. ETH->DMAOMR |= ETH_DMAOMR_SR;
  64533. 80336e6: f042 0202 orr.w r2, r2, #2
  64534. 80336ea: e001 b.n 80336f0 <ETH_DMAReceptionCmd+0x10>
  64535. }
  64536. else
  64537. {
  64538. /* Disable the DMA reception */
  64539. ETH->DMAOMR &= ~ETH_DMAOMR_SR;
  64540. 80336ec: f022 0202 bic.w r2, r2, #2
  64541. 80336f0: 619a str r2, [r3, #24]
  64542. 80336f2: 4770 bx lr
  64543. 80336f4: 40029000 .word 0x40029000
  64544. 080336f8 <ETH_Start>:
  64545. * @brief Enables ENET MAC and DMA reception/transmission
  64546. * @param None
  64547. * @retval None
  64548. */
  64549. void ETH_Start(void)
  64550. {
  64551. 80336f8: b508 push {r3, lr}
  64552. /* Enable transmit state machine of the MAC for transmission on the MII */
  64553. ETH_MACTransmissionCmd(ENABLE);
  64554. 80336fa: 2001 movs r0, #1
  64555. 80336fc: f7ff fe7a bl 80333f4 <ETH_MACTransmissionCmd>
  64556. /* Flush Transmit FIFO */
  64557. ETH_FlushTransmitFIFO();
  64558. 8033700: f7ff ffda bl 80336b8 <ETH_FlushTransmitFIFO>
  64559. /* Enable receive state machine of the MAC for reception from the MII */
  64560. ETH_MACReceptionCmd(ENABLE);
  64561. 8033704: 2001 movs r0, #1
  64562. 8033706: f7ff fe81 bl 803340c <ETH_MACReceptionCmd>
  64563. /* Start DMA transmission */
  64564. ETH_DMATransmissionCmd(ENABLE);
  64565. 803370a: 2001 movs r0, #1
  64566. 803370c: f7ff ffdc bl 80336c8 <ETH_DMATransmissionCmd>
  64567. /* Start DMA reception */
  64568. ETH_DMAReceptionCmd(ENABLE);
  64569. 8033710: 2001 movs r0, #1
  64570. }
  64571. 8033712: e8bd 4008 ldmia.w sp!, {r3, lr}
  64572. ETH_MACReceptionCmd(ENABLE);
  64573. /* Start DMA transmission */
  64574. ETH_DMATransmissionCmd(ENABLE);
  64575. /* Start DMA reception */
  64576. ETH_DMAReceptionCmd(ENABLE);
  64577. 8033716: f7ff bfe3 b.w 80336e0 <ETH_DMAReceptionCmd>
  64578. 803371a: 0000 movs r0, r0
  64579. 0803371c <ETH_ReadPHYRegister>:
  64580. * @arg More PHY register could be read depending on the used PHY
  64581. * @retval ETH_ERROR: in case of timeout
  64582. * MAC MIIDR register value: Data read from the selected PHY register (correct read )
  64583. */
  64584. uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg)
  64585. {
  64586. 803371c: b082 sub sp, #8
  64587. uint32_t tmpreg = 0;
  64588. __IO uint32_t timeout = 0;
  64589. 803371e: 2300 movs r3, #0
  64590. 8033720: 9301 str r3, [sp, #4]
  64591. /* Check the parameters */
  64592. assert_param(IS_ETH_PHY_ADDRESS(PHYAddress));
  64593. assert_param(IS_ETH_PHY_REG(PHYReg));
  64594. /* Get the ETHERNET MACMIIAR value */
  64595. tmpreg = ETH->MACMIIAR;
  64596. 8033722: 4b11 ldr r3, [pc, #68] ; (8033768 <ETH_ReadPHYRegister+0x4c>)
  64597. 8033724: 691a ldr r2, [r3, #16]
  64598. /* Keep only the CSR Clock Range CR[2:0] bits value */
  64599. tmpreg &= ~MACMIIAR_CR_MASK;
  64600. /* Prepare the MII address register value */
  64601. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  64602. 8033726: 06c0 lsls r0, r0, #27
  64603. assert_param(IS_ETH_PHY_REG(PHYReg));
  64604. /* Get the ETHERNET MACMIIAR value */
  64605. tmpreg = ETH->MACMIIAR;
  64606. /* Keep only the CSR Clock Range CR[2:0] bits value */
  64607. tmpreg &= ~MACMIIAR_CR_MASK;
  64608. 8033728: f002 021c and.w r2, r2, #28
  64609. /* Prepare the MII address register value */
  64610. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  64611. tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */
  64612. 803372c: 0189 lsls r1, r1, #6
  64613. /* Get the ETHERNET MACMIIAR value */
  64614. tmpreg = ETH->MACMIIAR;
  64615. /* Keep only the CSR Clock Range CR[2:0] bits value */
  64616. tmpreg &= ~MACMIIAR_CR_MASK;
  64617. /* Prepare the MII address register value */
  64618. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  64619. 803372e: ea42 4210 orr.w r2, r2, r0, lsr #16
  64620. tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */
  64621. 8033732: f401 61f8 and.w r1, r1, #1984 ; 0x7c0
  64622. tmpreg &= ~ETH_MACMIIAR_MW; /* Set the read mode */
  64623. 8033736: 430a orrs r2, r1
  64624. tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */
  64625. 8033738: f042 0201 orr.w r2, r2, #1
  64626. /* Write the result value into the MII Address register */
  64627. ETH->MACMIIAR = tmpreg;
  64628. 803373c: 611a str r2, [r3, #16]
  64629. /* Check for the Busy flag */
  64630. do
  64631. {
  64632. timeout++;
  64633. tmpreg = ETH->MACMIIAR;
  64634. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));
  64635. 803373e: 4a0b ldr r2, [pc, #44] ; (803376c <ETH_ReadPHYRegister+0x50>)
  64636. /* Write the result value into the MII Address register */
  64637. ETH->MACMIIAR = tmpreg;
  64638. /* Check for the Busy flag */
  64639. do
  64640. {
  64641. timeout++;
  64642. 8033740: 9901 ldr r1, [sp, #4]
  64643. 8033742: 3101 adds r1, #1
  64644. 8033744: 9101 str r1, [sp, #4]
  64645. tmpreg = ETH->MACMIIAR;
  64646. 8033746: 6919 ldr r1, [r3, #16]
  64647. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));
  64648. 8033748: 07c9 lsls r1, r1, #31
  64649. 803374a: d502 bpl.n 8033752 <ETH_ReadPHYRegister+0x36>
  64650. 803374c: 9901 ldr r1, [sp, #4]
  64651. 803374e: 4291 cmp r1, r2
  64652. 8033750: d9f6 bls.n 8033740 <ETH_ReadPHYRegister+0x24>
  64653. /* Return ERROR in case of timeout */
  64654. if(timeout == PHY_READ_TO)
  64655. 8033752: 4b07 ldr r3, [pc, #28] ; (8033770 <ETH_ReadPHYRegister+0x54>)
  64656. 8033754: 9a01 ldr r2, [sp, #4]
  64657. 8033756: 429a cmp r2, r3
  64658. {
  64659. return (uint16_t)ETH_ERROR;
  64660. }
  64661. /* Return data register value */
  64662. return (uint16_t)(ETH->MACMIIDR);
  64663. 8033758: bf1d ittte ne
  64664. 803375a: 4b03 ldrne r3, [pc, #12] ; (8033768 <ETH_ReadPHYRegister+0x4c>)
  64665. 803375c: 6958 ldrne r0, [r3, #20]
  64666. 803375e: b280 uxthne r0, r0
  64667. tmpreg = ETH->MACMIIAR;
  64668. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));
  64669. /* Return ERROR in case of timeout */
  64670. if(timeout == PHY_READ_TO)
  64671. {
  64672. return (uint16_t)ETH_ERROR;
  64673. 8033760: 2000 moveq r0, #0
  64674. }
  64675. /* Return data register value */
  64676. return (uint16_t)(ETH->MACMIIDR);
  64677. }
  64678. 8033762: b002 add sp, #8
  64679. 8033764: 4770 bx lr
  64680. 8033766: bf00 nop
  64681. 8033768: 40028000 .word 0x40028000
  64682. 803376c: 0004fffe .word 0x0004fffe
  64683. 8033770: 0004ffff .word 0x0004ffff
  64684. 08033774 <ETH_WritePHYRegister>:
  64685. * @param PHYValue: the value to write
  64686. * @retval ETH_ERROR: in case of timeout
  64687. * ETH_SUCCESS: for correct write
  64688. */
  64689. uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue)
  64690. {
  64691. 8033774: b513 push {r0, r1, r4, lr}
  64692. uint32_t tmpreg = 0;
  64693. __IO uint32_t timeout = 0;
  64694. 8033776: 2300 movs r3, #0
  64695. 8033778: 9301 str r3, [sp, #4]
  64696. /* Check the parameters */
  64697. assert_param(IS_ETH_PHY_ADDRESS(PHYAddress));
  64698. assert_param(IS_ETH_PHY_REG(PHYReg));
  64699. /* Get the ETHERNET MACMIIAR value */
  64700. tmpreg = ETH->MACMIIAR;
  64701. 803377a: 4b0f ldr r3, [pc, #60] ; (80337b8 <ETH_WritePHYRegister+0x44>)
  64702. 803377c: 691c ldr r4, [r3, #16]
  64703. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  64704. tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */
  64705. tmpreg |= ETH_MACMIIAR_MW; /* Set the write mode */
  64706. tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */
  64707. /* Give the value to the MII data register */
  64708. ETH->MACMIIDR = PHYValue;
  64709. 803377e: 615a str r2, [r3, #20]
  64710. assert_param(IS_ETH_PHY_REG(PHYReg));
  64711. /* Get the ETHERNET MACMIIAR value */
  64712. tmpreg = ETH->MACMIIAR;
  64713. /* Keep only the CSR Clock Range CR[2:0] bits value */
  64714. tmpreg &= ~MACMIIAR_CR_MASK;
  64715. 8033780: f004 041c and.w r4, r4, #28
  64716. /* Prepare the MII register address value */
  64717. tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
  64718. 8033784: f044 0403 orr.w r4, r4, #3
  64719. 8033788: 06c0 lsls r0, r0, #27
  64720. tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */
  64721. 803378a: 0189 lsls r1, r1, #6
  64722. 803378c: ea44 4410 orr.w r4, r4, r0, lsr #16
  64723. 8033790: f401 61f8 and.w r1, r1, #1984 ; 0x7c0
  64724. tmpreg |= ETH_MACMIIAR_MW; /* Set the write mode */
  64725. tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */
  64726. 8033794: 430c orrs r4, r1
  64727. /* Check for the Busy flag */
  64728. do
  64729. {
  64730. timeout++;
  64731. tmpreg = ETH->MACMIIAR;
  64732. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_WRITE_TO));
  64733. 8033796: 4a09 ldr r2, [pc, #36] ; (80337bc <ETH_WritePHYRegister+0x48>)
  64734. tmpreg |= ETH_MACMIIAR_MW; /* Set the write mode */
  64735. tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */
  64736. /* Give the value to the MII data register */
  64737. ETH->MACMIIDR = PHYValue;
  64738. /* Write the result value into the MII Address register */
  64739. ETH->MACMIIAR = tmpreg;
  64740. 8033798: 611c str r4, [r3, #16]
  64741. /* Check for the Busy flag */
  64742. do
  64743. {
  64744. timeout++;
  64745. 803379a: 9901 ldr r1, [sp, #4]
  64746. 803379c: 3101 adds r1, #1
  64747. 803379e: 9101 str r1, [sp, #4]
  64748. tmpreg = ETH->MACMIIAR;
  64749. 80337a0: 6919 ldr r1, [r3, #16]
  64750. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_WRITE_TO));
  64751. 80337a2: 07c8 lsls r0, r1, #31
  64752. 80337a4: d502 bpl.n 80337ac <ETH_WritePHYRegister+0x38>
  64753. 80337a6: 9901 ldr r1, [sp, #4]
  64754. 80337a8: 4291 cmp r1, r2
  64755. 80337aa: d9f6 bls.n 803379a <ETH_WritePHYRegister+0x26>
  64756. /* Return ERROR in case of timeout */
  64757. if(timeout == PHY_WRITE_TO)
  64758. 80337ac: 9801 ldr r0, [sp, #4]
  64759. return ETH_ERROR;
  64760. }
  64761. /* Return SUCCESS */
  64762. return ETH_SUCCESS;
  64763. }
  64764. 80337ae: 4b04 ldr r3, [pc, #16] ; (80337c0 <ETH_WritePHYRegister+0x4c>)
  64765. 80337b0: 1ac0 subs r0, r0, r3
  64766. 80337b2: bf18 it ne
  64767. 80337b4: 2001 movne r0, #1
  64768. 80337b6: bd1c pop {r2, r3, r4, pc}
  64769. 80337b8: 40028000 .word 0x40028000
  64770. 80337bc: 0004fffe .word 0x0004fffe
  64771. 80337c0: 0004ffff .word 0x0004ffff
  64772. 080337c4 <ETH_Init>:
  64773. * @param PHYAddress: external PHY address
  64774. * @retval ETH_ERROR: Ethernet initialization failed
  64775. * ETH_SUCCESS: Ethernet successfully initialized
  64776. */
  64777. uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress)
  64778. {
  64779. 80337c4: b5f0 push {r4, r5, r6, r7, lr}
  64780. 80337c6: b087 sub sp, #28
  64781. uint32_t RegValue = 0, tmpreg = 0;
  64782. __IO uint32_t i = 0;
  64783. 80337c8: 2300 movs r3, #0
  64784. assert_param(IS_ETH_DMA_DESC_SKIP_LENGTH(ETH_InitStruct->ETH_DescriptorSkipLength));
  64785. assert_param(IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(ETH_InitStruct->ETH_DMAArbitration));
  64786. /*-------------------------------- MAC Config ------------------------------*/
  64787. /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/
  64788. /* Get the ETHERNET MACMIIAR value */
  64789. tmpreg = ETH->MACMIIAR;
  64790. 80337ca: 4f90 ldr r7, [pc, #576] ; (8033a0c <ETH_Init+0x248>)
  64791. * ETH_SUCCESS: Ethernet successfully initialized
  64792. */
  64793. uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress)
  64794. {
  64795. uint32_t RegValue = 0, tmpreg = 0;
  64796. __IO uint32_t i = 0;
  64797. 80337cc: 9300 str r3, [sp, #0]
  64798. * @param PHYAddress: external PHY address
  64799. * @retval ETH_ERROR: Ethernet initialization failed
  64800. * ETH_SUCCESS: Ethernet successfully initialized
  64801. */
  64802. uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress)
  64803. {
  64804. 80337ce: 4604 mov r4, r0
  64805. uint32_t RegValue = 0, tmpreg = 0;
  64806. __IO uint32_t i = 0;
  64807. RCC_ClocksTypeDef rcc_clocks;
  64808. uint32_t hclk = 60000000;
  64809. __IO uint32_t timeout = 0;
  64810. 80337d0: 9301 str r3, [sp, #4]
  64811. /* Get the ETHERNET MACMIIAR value */
  64812. tmpreg = ETH->MACMIIAR;
  64813. /* Clear CSR Clock Range CR[2:0] bits */
  64814. tmpreg &= MACMIIAR_CR_MASK;
  64815. /* Get hclk frequency value */
  64816. RCC_GetClocksFreq(&rcc_clocks);
  64817. 80337d2: a802 add r0, sp, #8
  64818. * @param PHYAddress: external PHY address
  64819. * @retval ETH_ERROR: Ethernet initialization failed
  64820. * ETH_SUCCESS: Ethernet successfully initialized
  64821. */
  64822. uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress)
  64823. {
  64824. 80337d4: 460e mov r6, r1
  64825. assert_param(IS_ETH_DMA_DESC_SKIP_LENGTH(ETH_InitStruct->ETH_DescriptorSkipLength));
  64826. assert_param(IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(ETH_InitStruct->ETH_DMAArbitration));
  64827. /*-------------------------------- MAC Config ------------------------------*/
  64828. /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/
  64829. /* Get the ETHERNET MACMIIAR value */
  64830. tmpreg = ETH->MACMIIAR;
  64831. 80337d6: 693d ldr r5, [r7, #16]
  64832. /* Clear CSR Clock Range CR[2:0] bits */
  64833. tmpreg &= MACMIIAR_CR_MASK;
  64834. /* Get hclk frequency value */
  64835. RCC_GetClocksFreq(&rcc_clocks);
  64836. 80337d8: f7f1 fe42 bl 8025460 <RCC_GetClocksFreq>
  64837. hclk = rcc_clocks.HCLK_Frequency;
  64838. 80337dc: 9b03 ldr r3, [sp, #12]
  64839. /* Set CR bits depending on hclk value */
  64840. if((hclk >= 20000000)&&(hclk < 35000000))
  64841. 80337de: 4a8c ldr r2, [pc, #560] ; (8033a10 <ETH_Init+0x24c>)
  64842. 80337e0: 498c ldr r1, [pc, #560] ; (8033a14 <ETH_Init+0x250>)
  64843. 80337e2: 189a adds r2, r3, r2
  64844. 80337e4: 428a cmp r2, r1
  64845. /*-------------------------------- MAC Config ------------------------------*/
  64846. /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/
  64847. /* Get the ETHERNET MACMIIAR value */
  64848. tmpreg = ETH->MACMIIAR;
  64849. /* Clear CSR Clock Range CR[2:0] bits */
  64850. tmpreg &= MACMIIAR_CR_MASK;
  64851. 80337e6: f025 051c bic.w r5, r5, #28
  64852. /* Get hclk frequency value */
  64853. RCC_GetClocksFreq(&rcc_clocks);
  64854. hclk = rcc_clocks.HCLK_Frequency;
  64855. /* Set CR bits depending on hclk value */
  64856. if((hclk >= 20000000)&&(hclk < 35000000))
  64857. 80337ea: d802 bhi.n 80337f2 <ETH_Init+0x2e>
  64858. {
  64859. /* CSR Clock Range between 20-35 MHz */
  64860. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div16;
  64861. 80337ec: f045 0508 orr.w r5, r5, #8
  64862. 80337f0: e015 b.n 803381e <ETH_Init+0x5a>
  64863. }
  64864. else if((hclk >= 35000000)&&(hclk < 60000000))
  64865. 80337f2: 4a89 ldr r2, [pc, #548] ; (8033a18 <ETH_Init+0x254>)
  64866. 80337f4: 4989 ldr r1, [pc, #548] ; (8033a1c <ETH_Init+0x258>)
  64867. 80337f6: 189a adds r2, r3, r2
  64868. 80337f8: 428a cmp r2, r1
  64869. 80337fa: d802 bhi.n 8033802 <ETH_Init+0x3e>
  64870. {
  64871. /* CSR Clock Range between 35-60 MHz */
  64872. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div26;
  64873. 80337fc: f045 050c orr.w r5, r5, #12
  64874. 8033800: e00d b.n 803381e <ETH_Init+0x5a>
  64875. }
  64876. else if((hclk >= 60000000)&&(hclk < 100000000))
  64877. 8033802: 4a87 ldr r2, [pc, #540] ; (8033a20 <ETH_Init+0x25c>)
  64878. 8033804: 4987 ldr r1, [pc, #540] ; (8033a24 <ETH_Init+0x260>)
  64879. 8033806: 189a adds r2, r3, r2
  64880. 8033808: 428a cmp r2, r1
  64881. 803380a: d908 bls.n 803381e <ETH_Init+0x5a>
  64882. {
  64883. /* CSR Clock Range between 60-100 MHz */
  64884. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div42;
  64885. }
  64886. else if((hclk >= 100000000)&&(hclk < 150000000))
  64887. 803380c: 4a86 ldr r2, [pc, #536] ; (8033a28 <ETH_Init+0x264>)
  64888. 803380e: 189a adds r2, r3, r2
  64889. 8033810: 4b86 ldr r3, [pc, #536] ; (8033a2c <ETH_Init+0x268>)
  64890. 8033812: 429a cmp r2, r3
  64891. {
  64892. /* CSR Clock Range between 100-150 MHz */
  64893. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div62;
  64894. 8033814: bf94 ite ls
  64895. 8033816: f045 0504 orrls.w r5, r5, #4
  64896. }
  64897. else /* ((hclk >= 150000000)&&(hclk <= 168000000)) */
  64898. {
  64899. /* CSR Clock Range between 150-168 MHz */
  64900. tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div102;
  64901. 803381a: f045 0510 orrhi.w r5, r5, #16
  64902. }
  64903. /* Write to ETHERNET MAC MIIAR: Configure the ETHERNET CSR Clock Range */
  64904. ETH->MACMIIAR = (uint32_t)tmpreg;
  64905. 803381e: 613d str r5, [r7, #16]
  64906. /*-------------------- PHY initialization and configuration ----------------*/
  64907. /* Put the PHY in reset mode */
  64908. if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_Reset)))
  64909. 8033820: 4630 mov r0, r6
  64910. 8033822: 2100 movs r1, #0
  64911. 8033824: f44f 4200 mov.w r2, #32768 ; 0x8000
  64912. 8033828: f7ff ffa4 bl 8033774 <ETH_WritePHYRegister>
  64913. 803382c: b908 cbnz r0, 8033832 <ETH_Init+0x6e>
  64914. {
  64915. /* Return ERROR in case of write timeout */
  64916. return ETH_ERROR;
  64917. 803382e: 2000 movs r0, #0
  64918. 8033830: e0e9 b.n 8033a06 <ETH_Init+0x242>
  64919. }
  64920. /* Delay to assure PHY reset */
  64921. _eth_delay_(PHY_RESET_DELAY);
  64922. 8033832: 487f ldr r0, [pc, #508] ; (8033a30 <ETH_Init+0x26c>)
  64923. 8033834: f7ff fd6e bl 8033314 <ETH_Delay>
  64924. if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
  64925. 8033838: 6821 ldr r1, [r4, #0]
  64926. 803383a: 2900 cmp r1, #0
  64927. 803383c: d050 beq.n 80338e0 <ETH_Init+0x11c>
  64928. {
  64929. /* We wait for linked status... */
  64930. do
  64931. {
  64932. timeout++;
  64933. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
  64934. 803383e: 4d7d ldr r5, [pc, #500] ; (8033a34 <ETH_Init+0x270>)
  64935. if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
  64936. {
  64937. /* We wait for linked status... */
  64938. do
  64939. {
  64940. timeout++;
  64941. 8033840: 9b01 ldr r3, [sp, #4]
  64942. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
  64943. 8033842: 4630 mov r0, r6
  64944. if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
  64945. {
  64946. /* We wait for linked status... */
  64947. do
  64948. {
  64949. timeout++;
  64950. 8033844: 3301 adds r3, #1
  64951. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
  64952. 8033846: 2101 movs r1, #1
  64953. if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
  64954. {
  64955. /* We wait for linked status... */
  64956. do
  64957. {
  64958. timeout++;
  64959. 8033848: 9301 str r3, [sp, #4]
  64960. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
  64961. 803384a: f7ff ff67 bl 803371c <ETH_ReadPHYRegister>
  64962. 803384e: f000 0004 and.w r0, r0, #4
  64963. 8033852: b280 uxth r0, r0
  64964. 8033854: b910 cbnz r0, 803385c <ETH_Init+0x98>
  64965. 8033856: 9b01 ldr r3, [sp, #4]
  64966. 8033858: 42ab cmp r3, r5
  64967. 803385a: d9f1 bls.n 8033840 <ETH_Init+0x7c>
  64968. /* Return ERROR in case of timeout */
  64969. if(timeout == PHY_READ_TO)
  64970. 803385c: 9a01 ldr r2, [sp, #4]
  64971. 803385e: 4b76 ldr r3, [pc, #472] ; (8033a38 <ETH_Init+0x274>)
  64972. 8033860: 429a cmp r2, r3
  64973. 8033862: d0e4 beq.n 803382e <ETH_Init+0x6a>
  64974. {
  64975. return ETH_ERROR;
  64976. }
  64977. /* Reset Timeout counter */
  64978. timeout = 0;
  64979. 8033864: 2100 movs r1, #0
  64980. /* Enable Auto-Negotiation */
  64981. if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_AutoNegotiation)))
  64982. 8033866: 4630 mov r0, r6
  64983. 8033868: f44f 5280 mov.w r2, #4096 ; 0x1000
  64984. {
  64985. return ETH_ERROR;
  64986. }
  64987. /* Reset Timeout counter */
  64988. timeout = 0;
  64989. 803386c: 9101 str r1, [sp, #4]
  64990. /* Enable Auto-Negotiation */
  64991. if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_AutoNegotiation)))
  64992. 803386e: f7ff ff81 bl 8033774 <ETH_WritePHYRegister>
  64993. 8033872: 2800 cmp r0, #0
  64994. 8033874: d0db beq.n 803382e <ETH_Init+0x6a>
  64995. /* Wait until the auto-negotiation will be completed */
  64996. do
  64997. {
  64998. timeout++;
  64999. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));
  65000. 8033876: 4d6f ldr r5, [pc, #444] ; (8033a34 <ETH_Init+0x270>)
  65001. }
  65002. /* Wait until the auto-negotiation will be completed */
  65003. do
  65004. {
  65005. timeout++;
  65006. 8033878: 9b01 ldr r3, [sp, #4]
  65007. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));
  65008. 803387a: 4630 mov r0, r6
  65009. }
  65010. /* Wait until the auto-negotiation will be completed */
  65011. do
  65012. {
  65013. timeout++;
  65014. 803387c: 3301 adds r3, #1
  65015. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));
  65016. 803387e: 2101 movs r1, #1
  65017. }
  65018. /* Wait until the auto-negotiation will be completed */
  65019. do
  65020. {
  65021. timeout++;
  65022. 8033880: 9301 str r3, [sp, #4]
  65023. } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));
  65024. 8033882: f7ff ff4b bl 803371c <ETH_ReadPHYRegister>
  65025. 8033886: f000 0020 and.w r0, r0, #32
  65026. 803388a: b280 uxth r0, r0
  65027. 803388c: b910 cbnz r0, 8033894 <ETH_Init+0xd0>
  65028. 803388e: 9b01 ldr r3, [sp, #4]
  65029. 8033890: 42ab cmp r3, r5
  65030. 8033892: d9f1 bls.n 8033878 <ETH_Init+0xb4>
  65031. /* Return ERROR in case of timeout */
  65032. if(timeout == PHY_READ_TO)
  65033. 8033894: 9a01 ldr r2, [sp, #4]
  65034. 8033896: 4b68 ldr r3, [pc, #416] ; (8033a38 <ETH_Init+0x274>)
  65035. 8033898: 429a cmp r2, r3
  65036. 803389a: d0c8 beq.n 803382e <ETH_Init+0x6a>
  65037. {
  65038. return ETH_ERROR;
  65039. }
  65040. /* Reset Timeout counter */
  65041. timeout = 0;
  65042. 803389c: 2500 movs r5, #0
  65043. /* Read the result of the auto-negotiation */
  65044. RegValue = ETH_ReadPHYRegister(PHYAddress, PHY_SR);
  65045. 803389e: 211f movs r1, #31
  65046. 80338a0: 4630 mov r0, r6
  65047. {
  65048. return ETH_ERROR;
  65049. }
  65050. /* Reset Timeout counter */
  65051. timeout = 0;
  65052. 80338a2: 9501 str r5, [sp, #4]
  65053. /* Read the result of the auto-negotiation */
  65054. RegValue = ETH_ReadPHYRegister(PHYAddress, PHY_SR);
  65055. 80338a4: f7ff ff3a bl 803371c <ETH_ReadPHYRegister>
  65056. switch (RegValue & PHY_DUPLEX_SPEED_STATUS_MASK)
  65057. 80338a8: f000 001c and.w r0, r0, #28
  65058. 80338ac: 2808 cmp r0, #8
  65059. 80338ae: d00b beq.n 80338c8 <ETH_Init+0x104>
  65060. 80338b0: d802 bhi.n 80338b8 <ETH_Init+0xf4>
  65061. 80338b2: 2804 cmp r0, #4
  65062. 80338b4: d123 bne.n 80338fe <ETH_Init+0x13a>
  65063. 80338b6: e010 b.n 80338da <ETH_Init+0x116>
  65064. 80338b8: 280e cmp r0, #14
  65065. 80338ba: d00a beq.n 80338d2 <ETH_Init+0x10e>
  65066. 80338bc: 2812 cmp r0, #18
  65067. 80338be: d11e bne.n 80338fe <ETH_Init+0x13a>
  65068. {
  65069. case PHY_100BTX_FULL:
  65070. ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
  65071. 80338c0: f44f 6300 mov.w r3, #2048 ; 0x800
  65072. 80338c4: 6223 str r3, [r4, #32]
  65073. 80338c6: e000 b.n 80338ca <ETH_Init+0x106>
  65074. ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
  65075. break;
  65076. case PHY_100BTX_HALF:
  65077. ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
  65078. 80338c8: 6225 str r5, [r4, #32]
  65079. ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
  65080. 80338ca: f44f 4380 mov.w r3, #16384 ; 0x4000
  65081. 80338ce: 6163 str r3, [r4, #20]
  65082. break;
  65083. 80338d0: e015 b.n 80338fe <ETH_Init+0x13a>
  65084. case PHY_10M_FULL:
  65085. ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
  65086. 80338d2: f44f 6300 mov.w r3, #2048 ; 0x800
  65087. 80338d6: 6223 str r3, [r4, #32]
  65088. 80338d8: e000 b.n 80338dc <ETH_Init+0x118>
  65089. ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
  65090. break;
  65091. case PHY_10M_HALF:
  65092. ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
  65093. 80338da: 6225 str r5, [r4, #32]
  65094. ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
  65095. 80338dc: 6165 str r5, [r4, #20]
  65096. break;
  65097. 80338de: e00e b.n 80338fe <ETH_Init+0x13a>
  65098. break;
  65099. }
  65100. }
  65101. else
  65102. {
  65103. if(!ETH_WritePHYRegister(PHYAddress, PHY_BCR, ((uint16_t)(ETH_InitStruct->ETH_Mode >> 3) |
  65104. 80338e0: 6a22 ldr r2, [r4, #32]
  65105. (uint16_t)(ETH_InitStruct->ETH_Speed >> 1))))
  65106. 80338e2: 6963 ldr r3, [r4, #20]
  65107. break;
  65108. }
  65109. }
  65110. else
  65111. {
  65112. if(!ETH_WritePHYRegister(PHYAddress, PHY_BCR, ((uint16_t)(ETH_InitStruct->ETH_Mode >> 3) |
  65113. 80338e4: 08d2 lsrs r2, r2, #3
  65114. 80338e6: ea42 0253 orr.w r2, r2, r3, lsr #1
  65115. 80338ea: 4630 mov r0, r6
  65116. 80338ec: b292 uxth r2, r2
  65117. 80338ee: f7ff ff41 bl 8033774 <ETH_WritePHYRegister>
  65118. 80338f2: 2800 cmp r0, #0
  65119. 80338f4: d09b beq.n 803382e <ETH_Init+0x6a>
  65120. {
  65121. /* Return ERROR in case of write timeout */
  65122. return ETH_ERROR;
  65123. }
  65124. /* Delay to assure PHY configuration */
  65125. _eth_delay_(PHY_CONFIG_DELAY);
  65126. 80338f6: f06f 407f mvn.w r0, #4278190080 ; 0xff000000
  65127. 80338fa: f7ff fd0b bl 8033314 <ETH_Delay>
  65128. }
  65129. /*------------------------ ETHERNET MACCR Configuration --------------------*/
  65130. /* Get the ETHERNET MACCR value */
  65131. tmpreg = ETH->MACCR;
  65132. 80338fe: 4b43 ldr r3, [pc, #268] ; (8033a0c <ETH_Init+0x248>)
  65133. /* Clear WD, PCE, PS, TE and RE bits */
  65134. tmpreg &= MACCR_CLEAR_MASK;
  65135. 8033900: 4a4e ldr r2, [pc, #312] ; (8033a3c <ETH_Init+0x278>)
  65136. _eth_delay_(PHY_CONFIG_DELAY);
  65137. }
  65138. /*------------------------ ETHERNET MACCR Configuration --------------------*/
  65139. /* Get the ETHERNET MACCR value */
  65140. tmpreg = ETH->MACCR;
  65141. 8033902: 6819 ldr r1, [r3, #0]
  65142. /* Set the IPCO bit according to ETH_ChecksumOffload value */
  65143. /* Set the DR bit according to ETH_RetryTransmission value */
  65144. /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */
  65145. /* Set the BL bit according to ETH_BackOffLimit value */
  65146. /* Set the DC bit according to ETH_DeferralCheck value */
  65147. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog |
  65148. 8033904: 68a0 ldr r0, [r4, #8]
  65149. }
  65150. /*------------------------ ETHERNET MACCR Configuration --------------------*/
  65151. /* Get the ETHERNET MACCR value */
  65152. tmpreg = ETH->MACCR;
  65153. /* Clear WD, PCE, PS, TE and RE bits */
  65154. tmpreg &= MACCR_CLEAR_MASK;
  65155. 8033906: 400a ands r2, r1
  65156. /* Set the IPCO bit according to ETH_ChecksumOffload value */
  65157. /* Set the DR bit according to ETH_RetryTransmission value */
  65158. /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */
  65159. /* Set the BL bit according to ETH_BackOffLimit value */
  65160. /* Set the DC bit according to ETH_DeferralCheck value */
  65161. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog |
  65162. 8033908: 6861 ldr r1, [r4, #4]
  65163. 803390a: 4308 orrs r0, r1
  65164. ETH_InitStruct->ETH_Jabber |
  65165. 803390c: 68e1 ldr r1, [r4, #12]
  65166. 803390e: 4308 orrs r0, r1
  65167. ETH_InitStruct->ETH_InterFrameGap |
  65168. 8033910: 6921 ldr r1, [r4, #16]
  65169. 8033912: 4308 orrs r0, r1
  65170. ETH_InitStruct->ETH_CarrierSense |
  65171. 8033914: 6961 ldr r1, [r4, #20]
  65172. 8033916: 4308 orrs r0, r1
  65173. ETH_InitStruct->ETH_Speed |
  65174. 8033918: 69a1 ldr r1, [r4, #24]
  65175. 803391a: 4308 orrs r0, r1
  65176. ETH_InitStruct->ETH_ReceiveOwn |
  65177. 803391c: 69e1 ldr r1, [r4, #28]
  65178. 803391e: 4308 orrs r0, r1
  65179. ETH_InitStruct->ETH_LoopbackMode |
  65180. 8033920: 6a21 ldr r1, [r4, #32]
  65181. 8033922: 4308 orrs r0, r1
  65182. ETH_InitStruct->ETH_Mode |
  65183. 8033924: 6a61 ldr r1, [r4, #36] ; 0x24
  65184. 8033926: 4308 orrs r0, r1
  65185. ETH_InitStruct->ETH_ChecksumOffload |
  65186. 8033928: 6aa1 ldr r1, [r4, #40] ; 0x28
  65187. 803392a: 4308 orrs r0, r1
  65188. ETH_InitStruct->ETH_RetryTransmission |
  65189. 803392c: 6ae1 ldr r1, [r4, #44] ; 0x2c
  65190. 803392e: 4308 orrs r0, r1
  65191. ETH_InitStruct->ETH_AutomaticPadCRCStrip |
  65192. 8033930: 6b21 ldr r1, [r4, #48] ; 0x30
  65193. 8033932: 4308 orrs r0, r1
  65194. /* Set the IPCO bit according to ETH_ChecksumOffload value */
  65195. /* Set the DR bit according to ETH_RetryTransmission value */
  65196. /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */
  65197. /* Set the BL bit according to ETH_BackOffLimit value */
  65198. /* Set the DC bit according to ETH_DeferralCheck value */
  65199. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog |
  65200. 8033934: 6b61 ldr r1, [r4, #52] ; 0x34
  65201. 8033936: 4301 orrs r1, r0
  65202. 8033938: 430a orrs r2, r1
  65203. ETH_InitStruct->ETH_RetryTransmission |
  65204. ETH_InitStruct->ETH_AutomaticPadCRCStrip |
  65205. ETH_InitStruct->ETH_BackOffLimit |
  65206. ETH_InitStruct->ETH_DeferralCheck);
  65207. /* Write to ETHERNET MACCR */
  65208. ETH->MACCR = (uint32_t)tmpreg;
  65209. 803393a: 601a str r2, [r3, #0]
  65210. /* Set the DAIF bit according to ETH_DestinationAddrFilter value */
  65211. /* Set the PR bit according to ETH_PromiscuousMode value */
  65212. /* Set the PM, HMC and HPF bits according to ETH_MulticastFramesFilter value */
  65213. /* Set the HUC and HPF bits according to ETH_UnicastFramesFilter value */
  65214. /* Write to ETHERNET MACFFR */
  65215. ETH->MACFFR = (uint32_t)(ETH_InitStruct->ETH_ReceiveAll |
  65216. 803393c: 6ba2 ldr r2, [r4, #56] ; 0x38
  65217. 803393e: 6be1 ldr r1, [r4, #60] ; 0x3c
  65218. 8033940: 4311 orrs r1, r2
  65219. ETH_InitStruct->ETH_SourceAddrFilter |
  65220. 8033942: 6c22 ldr r2, [r4, #64] ; 0x40
  65221. 8033944: 4311 orrs r1, r2
  65222. ETH_InitStruct->ETH_PassControlFrames |
  65223. 8033946: 6c62 ldr r2, [r4, #68] ; 0x44
  65224. 8033948: 4311 orrs r1, r2
  65225. ETH_InitStruct->ETH_BroadcastFramesReception |
  65226. 803394a: 6ca2 ldr r2, [r4, #72] ; 0x48
  65227. 803394c: 4311 orrs r1, r2
  65228. ETH_InitStruct->ETH_DestinationAddrFilter |
  65229. 803394e: 6ce2 ldr r2, [r4, #76] ; 0x4c
  65230. 8033950: 4311 orrs r1, r2
  65231. ETH_InitStruct->ETH_PromiscuousMode |
  65232. 8033952: 6d22 ldr r2, [r4, #80] ; 0x50
  65233. 8033954: 4311 orrs r1, r2
  65234. /* Set the DAIF bit according to ETH_DestinationAddrFilter value */
  65235. /* Set the PR bit according to ETH_PromiscuousMode value */
  65236. /* Set the PM, HMC and HPF bits according to ETH_MulticastFramesFilter value */
  65237. /* Set the HUC and HPF bits according to ETH_UnicastFramesFilter value */
  65238. /* Write to ETHERNET MACFFR */
  65239. ETH->MACFFR = (uint32_t)(ETH_InitStruct->ETH_ReceiveAll |
  65240. 8033956: 6d62 ldr r2, [r4, #84] ; 0x54
  65241. 8033958: 430a orrs r2, r1
  65242. 803395a: 605a str r2, [r3, #4]
  65243. ETH_InitStruct->ETH_PromiscuousMode |
  65244. ETH_InitStruct->ETH_MulticastFramesFilter |
  65245. ETH_InitStruct->ETH_UnicastFramesFilter);
  65246. /*--------------- ETHERNET MACHTHR and MACHTLR Configuration ---------------*/
  65247. /* Write to ETHERNET MACHTHR */
  65248. ETH->MACHTHR = (uint32_t)ETH_InitStruct->ETH_HashTableHigh;
  65249. 803395c: 6da2 ldr r2, [r4, #88] ; 0x58
  65250. 803395e: 609a str r2, [r3, #8]
  65251. /* Write to ETHERNET MACHTLR */
  65252. ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow;
  65253. 8033960: 6de2 ldr r2, [r4, #92] ; 0x5c
  65254. 8033962: 60da str r2, [r3, #12]
  65255. /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */
  65256. /* Set the PLT bit according to ETH_PauseLowThreshold value */
  65257. /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */
  65258. /* Set the RFE bit according to ETH_ReceiveFlowControl value */
  65259. /* Set the TFE bit according to ETH_TransmitFlowControl value */
  65260. tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) |
  65261. 8033964: 6e62 ldr r2, [r4, #100] ; 0x64
  65262. 8033966: 6ea1 ldr r1, [r4, #104] ; 0x68
  65263. ETH->MACHTHR = (uint32_t)ETH_InitStruct->ETH_HashTableHigh;
  65264. /* Write to ETHERNET MACHTLR */
  65265. ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow;
  65266. /*----------------------- ETHERNET MACFCR Configuration --------------------*/
  65267. /* Get the ETHERNET MACFCR value */
  65268. tmpreg = ETH->MACFCR;
  65269. 8033968: 6998 ldr r0, [r3, #24]
  65270. /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */
  65271. /* Set the PLT bit according to ETH_PauseLowThreshold value */
  65272. /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */
  65273. /* Set the RFE bit according to ETH_ReceiveFlowControl value */
  65274. /* Set the TFE bit according to ETH_TransmitFlowControl value */
  65275. tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) |
  65276. 803396a: 4311 orrs r1, r2
  65277. ETH_InitStruct->ETH_ZeroQuantaPause |
  65278. 803396c: 6ee2 ldr r2, [r4, #108] ; 0x6c
  65279. 803396e: 4311 orrs r1, r2
  65280. ETH_InitStruct->ETH_PauseLowThreshold |
  65281. 8033970: 6f22 ldr r2, [r4, #112] ; 0x70
  65282. 8033972: 4311 orrs r1, r2
  65283. ETH_InitStruct->ETH_UnicastPauseFrameDetect |
  65284. 8033974: 6f62 ldr r2, [r4, #116] ; 0x74
  65285. 8033976: 4311 orrs r1, r2
  65286. ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow;
  65287. /*----------------------- ETHERNET MACFCR Configuration --------------------*/
  65288. /* Get the ETHERNET MACFCR value */
  65289. tmpreg = ETH->MACFCR;
  65290. /* Clear xx bits */
  65291. tmpreg &= MACFCR_CLEAR_MASK;
  65292. 8033978: f64f 7241 movw r2, #65345 ; 0xff41
  65293. 803397c: 4002 ands r2, r0
  65294. /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */
  65295. /* Set the PLT bit according to ETH_PauseLowThreshold value */
  65296. /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */
  65297. /* Set the RFE bit according to ETH_ReceiveFlowControl value */
  65298. /* Set the TFE bit according to ETH_TransmitFlowControl value */
  65299. tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) |
  65300. 803397e: 430a orrs r2, r1
  65301. 8033980: 6e21 ldr r1, [r4, #96] ; 0x60
  65302. 8033982: ea42 4101 orr.w r1, r2, r1, lsl #16
  65303. ETH_InitStruct->ETH_PauseLowThreshold |
  65304. ETH_InitStruct->ETH_UnicastPauseFrameDetect |
  65305. ETH_InitStruct->ETH_ReceiveFlowControl |
  65306. ETH_InitStruct->ETH_TransmitFlowControl);
  65307. /* Write to ETHERNET MACFCR */
  65308. ETH->MACFCR = (uint32_t)tmpreg;
  65309. 8033986: 6199 str r1, [r3, #24]
  65310. /*----------------------- ETHERNET MACVLANTR Configuration -----------------*/
  65311. /* Set the ETV bit according to ETH_VLANTagComparison value */
  65312. /* Set the VL bit according to ETH_VLANTagIdentifier value */
  65313. ETH->MACVLANTR = (uint32_t)(ETH_InitStruct->ETH_VLANTagComparison |
  65314. 8033988: 6fe1 ldr r1, [r4, #124] ; 0x7c
  65315. 803398a: 6fa2 ldr r2, [r4, #120] ; 0x78
  65316. 803398c: 430a orrs r2, r1
  65317. 803398e: 61da str r2, [r3, #28]
  65318. ETH_InitStruct->ETH_VLANTagIdentifier);
  65319. /*-------------------------------- DMA Config ------------------------------*/
  65320. /*----------------------- ETHERNET DMAOMR Configuration --------------------*/
  65321. /* Get the ETHERNET DMAOMR value */
  65322. tmpreg = ETH->DMAOMR;
  65323. 8033990: f503 5380 add.w r3, r3, #4096 ; 0x1000
  65324. /* Clear xx bits */
  65325. tmpreg &= DMAOMR_CLEAR_MASK;
  65326. 8033994: 4a2a ldr r2, [pc, #168] ; (8033a40 <ETH_Init+0x27c>)
  65327. ETH_InitStruct->ETH_VLANTagIdentifier);
  65328. /*-------------------------------- DMA Config ------------------------------*/
  65329. /*----------------------- ETHERNET DMAOMR Configuration --------------------*/
  65330. /* Get the ETHERNET DMAOMR value */
  65331. tmpreg = ETH->DMAOMR;
  65332. 8033996: 6999 ldr r1, [r3, #24]
  65333. /* Set the TTC bit according to ETH_TransmitThresholdControl value */
  65334. /* Set the FEF bit according to ETH_ForwardErrorFrames value */
  65335. /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */
  65336. /* Set the RTC bit according to ETH_ReceiveThresholdControl value */
  65337. /* Set the OSF bit according to ETH_SecondFrameOperate value */
  65338. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame |
  65339. 8033998: f8d4 0084 ldr.w r0, [r4, #132] ; 0x84
  65340. /*-------------------------------- DMA Config ------------------------------*/
  65341. /*----------------------- ETHERNET DMAOMR Configuration --------------------*/
  65342. /* Get the ETHERNET DMAOMR value */
  65343. tmpreg = ETH->DMAOMR;
  65344. /* Clear xx bits */
  65345. tmpreg &= DMAOMR_CLEAR_MASK;
  65346. 803399c: 400a ands r2, r1
  65347. /* Set the TTC bit according to ETH_TransmitThresholdControl value */
  65348. /* Set the FEF bit according to ETH_ForwardErrorFrames value */
  65349. /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */
  65350. /* Set the RTC bit according to ETH_ReceiveThresholdControl value */
  65351. /* Set the OSF bit according to ETH_SecondFrameOperate value */
  65352. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame |
  65353. 803399e: f8d4 1080 ldr.w r1, [r4, #128] ; 0x80
  65354. 80339a2: 4308 orrs r0, r1
  65355. ETH_InitStruct->ETH_ReceiveStoreForward |
  65356. 80339a4: f8d4 1088 ldr.w r1, [r4, #136] ; 0x88
  65357. 80339a8: 4308 orrs r0, r1
  65358. ETH_InitStruct->ETH_FlushReceivedFrame |
  65359. 80339aa: f8d4 108c ldr.w r1, [r4, #140] ; 0x8c
  65360. 80339ae: 4308 orrs r0, r1
  65361. ETH_InitStruct->ETH_TransmitStoreForward |
  65362. 80339b0: f8d4 1090 ldr.w r1, [r4, #144] ; 0x90
  65363. 80339b4: 4308 orrs r0, r1
  65364. ETH_InitStruct->ETH_TransmitThresholdControl |
  65365. 80339b6: f8d4 1094 ldr.w r1, [r4, #148] ; 0x94
  65366. 80339ba: 4308 orrs r0, r1
  65367. ETH_InitStruct->ETH_ForwardErrorFrames |
  65368. 80339bc: f8d4 1098 ldr.w r1, [r4, #152] ; 0x98
  65369. 80339c0: 4308 orrs r0, r1
  65370. ETH_InitStruct->ETH_ForwardUndersizedGoodFrames |
  65371. 80339c2: f8d4 109c ldr.w r1, [r4, #156] ; 0x9c
  65372. 80339c6: 4308 orrs r0, r1
  65373. /* Set the TTC bit according to ETH_TransmitThresholdControl value */
  65374. /* Set the FEF bit according to ETH_ForwardErrorFrames value */
  65375. /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */
  65376. /* Set the RTC bit according to ETH_ReceiveThresholdControl value */
  65377. /* Set the OSF bit according to ETH_SecondFrameOperate value */
  65378. tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame |
  65379. 80339c8: f8d4 10a0 ldr.w r1, [r4, #160] ; 0xa0
  65380. 80339cc: 4301 orrs r1, r0
  65381. 80339ce: 430a orrs r2, r1
  65382. ETH_InitStruct->ETH_ForwardErrorFrames |
  65383. ETH_InitStruct->ETH_ForwardUndersizedGoodFrames |
  65384. ETH_InitStruct->ETH_ReceiveThresholdControl |
  65385. ETH_InitStruct->ETH_SecondFrameOperate);
  65386. /* Write to ETHERNET DMAOMR */
  65387. ETH->DMAOMR = (uint32_t)tmpreg;
  65388. 80339d0: 619a str r2, [r3, #24]
  65389. /* Set the FB bit according to ETH_FixedBurst value */
  65390. /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */
  65391. /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */
  65392. /* Set the DSL bit according to ETH_DesciptorSkipLength value */
  65393. /* Set the PR and DA bits according to ETH_DMAArbitration value */
  65394. ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats |
  65395. 80339d2: f8d4 20a8 ldr.w r2, [r4, #168] ; 0xa8
  65396. 80339d6: f8d4 10a4 ldr.w r1, [r4, #164] ; 0xa4
  65397. 80339da: 4311 orrs r1, r2
  65398. ETH_InitStruct->ETH_FixedBurst |
  65399. ETH_InitStruct->ETH_RxDMABurstLength | /* !! if 4xPBL is selected for Tx or Rx it is applied for the other */
  65400. 80339dc: f8d4 20ac ldr.w r2, [r4, #172] ; 0xac
  65401. /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */
  65402. /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */
  65403. /* Set the DSL bit according to ETH_DesciptorSkipLength value */
  65404. /* Set the PR and DA bits according to ETH_DMAArbitration value */
  65405. ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats |
  65406. ETH_InitStruct->ETH_FixedBurst |
  65407. 80339e0: f441 0100 orr.w r1, r1, #8388608 ; 0x800000
  65408. ETH_InitStruct->ETH_RxDMABurstLength | /* !! if 4xPBL is selected for Tx or Rx it is applied for the other */
  65409. 80339e4: 4311 orrs r1, r2
  65410. ETH_InitStruct->ETH_TxDMABurstLength |
  65411. 80339e6: f8d4 20b0 ldr.w r2, [r4, #176] ; 0xb0
  65412. 80339ea: 4311 orrs r1, r2
  65413. (ETH_InitStruct->ETH_DescriptorSkipLength << 2) |
  65414. 80339ec: f8d4 20b8 ldr.w r2, [r4, #184] ; 0xb8
  65415. 80339f0: 430a orrs r2, r1
  65416. 80339f2: f8d4 10b4 ldr.w r1, [r4, #180] ; 0xb4
  65417. /* Set the FB bit according to ETH_FixedBurst value */
  65418. /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */
  65419. /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */
  65420. /* Set the DSL bit according to ETH_DesciptorSkipLength value */
  65421. /* Set the PR and DA bits according to ETH_DMAArbitration value */
  65422. ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats |
  65423. 80339f6: ea42 0281 orr.w r2, r2, r1, lsl #2
  65424. 80339fa: 601a str r2, [r3, #0]
  65425. ETH_InitStruct->ETH_DMAArbitration |
  65426. ETH_DMABMR_USP); /* Enable use of separate PBL for Rx and Tx */
  65427. #ifdef USE_ENHANCED_DMA_DESCRIPTORS
  65428. /* Enable the Enhanced DMA descriptors */
  65429. ETH->DMABMR |= ETH_DMABMR_EDE;
  65430. 80339fc: 681a ldr r2, [r3, #0]
  65431. 80339fe: f042 0280 orr.w r2, r2, #128 ; 0x80
  65432. 8033a02: 601a str r2, [r3, #0]
  65433. #endif /* USE_ENHANCED_DMA_DESCRIPTORS */
  65434. /* Return Ethernet configuration success */
  65435. return ETH_SUCCESS;
  65436. 8033a04: 2001 movs r0, #1
  65437. }
  65438. 8033a06: b007 add sp, #28
  65439. 8033a08: bdf0 pop {r4, r5, r6, r7, pc}
  65440. 8033a0a: bf00 nop
  65441. 8033a0c: 40028000 .word 0x40028000
  65442. 8033a10: feced300 .word 0xfeced300
  65443. 8033a14: 00e4e1bf .word 0x00e4e1bf
  65444. 8033a18: fde9f140 .word 0xfde9f140
  65445. 8033a1c: 017d783f .word 0x017d783f
  65446. 8033a20: fc6c7900 .word 0xfc6c7900
  65447. 8033a24: 026259ff .word 0x026259ff
  65448. 8033a28: fa0a1f00 .word 0xfa0a1f00
  65449. 8033a2c: 02faf07f .word 0x02faf07f
  65450. 8033a30: 000fffff .word 0x000fffff
  65451. 8033a34: 0004fffe .word 0x0004fffe
  65452. 8033a38: 0004ffff .word 0x0004ffff
  65453. 8033a3c: ff20810f .word 0xff20810f
  65454. 8033a40: f8de3f23 .word 0xf8de3f23
  65455. 08033a44 <_sbrk>:
  65456. extern char _ebss; // Defined by the linker
  65457. extern char __bss_end__;
  65458. static char *heap_end;
  65459. char *prev_heap_end;
  65460. if (heap_end == 0) {
  65461. 8033a44: 4b0a ldr r3, [pc, #40] ; (8033a70 <_sbrk+0x2c>)
  65462. 8033a46: 681a ldr r2, [r3, #0]
  65463. 8033a48: b90a cbnz r2, 8033a4e <_sbrk+0xa>
  65464. //heap_end = &_ebss;
  65465. heap_end = &__bss_end__;
  65466. 8033a4a: 4a0a ldr r2, [pc, #40] ; (8033a74 <_sbrk+0x30>)
  65467. 8033a4c: 601a str r2, [r3, #0]
  65468. }
  65469. prev_heap_end = heap_end;
  65470. 8033a4e: 681b ldr r3, [r3, #0]
  65471. */
  65472. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)
  65473. {
  65474. register uint32_t result;
  65475. __ASM volatile ("MRS %0, msp\n" : "=r" (result) );
  65476. 8033a50: f3ef 8208 mrs r2, MSP
  65477. char * stack = (char*) __get_MSP();
  65478. if (heap_end + incr > stack)
  65479. 8033a54: 1818 adds r0, r3, r0
  65480. 8033a56: 4290 cmp r0, r2
  65481. 8033a58: d905 bls.n 8033a66 <_sbrk+0x22>
  65482. {
  65483. _write (STDERR_FILENO, "Heap and stack collision\n", 25);
  65484. errno = ENOMEM;
  65485. 8033a5a: 4b07 ldr r3, [pc, #28] ; (8033a78 <_sbrk+0x34>)
  65486. 8033a5c: 220c movs r2, #12
  65487. 8033a5e: 601a str r2, [r3, #0]
  65488. return (caddr_t) -1;
  65489. 8033a60: f04f 33ff mov.w r3, #4294967295
  65490. 8033a64: e001 b.n 8033a6a <_sbrk+0x26>
  65491. //abort ();
  65492. }
  65493. heap_end += incr;
  65494. 8033a66: 4a02 ldr r2, [pc, #8] ; (8033a70 <_sbrk+0x2c>)
  65495. 8033a68: 6010 str r0, [r2, #0]
  65496. return (caddr_t) prev_heap_end;
  65497. }
  65498. 8033a6a: 4618 mov r0, r3
  65499. 8033a6c: 4770 bx lr
  65500. 8033a6e: bf00 nop
  65501. 8033a70: 2000e4b8 .word 0x2000e4b8
  65502. 8033a74: 20014fd8 .word 0x20014fd8
  65503. 8033a78: 20014ed4 .word 0x20014ed4
  65504. 08033a7c <Reset_Handler>:
  65505. .weak Reset_Handler
  65506. .type Reset_Handler, %function
  65507. Reset_Handler:
  65508. /* Copy the data segment initializers from flash to SRAM */
  65509. movs r1, #0
  65510. 8033a7c: 2100 movs r1, #0
  65511. b LoopCopyDataInit
  65512. 8033a7e: f000 b804 b.w 8033a8a <LoopCopyDataInit>
  65513. 08033a82 <CopyDataInit>:
  65514. CopyDataInit:
  65515. ldr r3, =_sidata
  65516. 8033a82: 4b0d ldr r3, [pc, #52] ; (8033ab8 <LoopFillZerobss+0x16>)
  65517. ldr r3, [r3, r1]
  65518. 8033a84: 585b ldr r3, [r3, r1]
  65519. str r3, [r0, r1]
  65520. 8033a86: 5043 str r3, [r0, r1]
  65521. adds r1, r1, #4
  65522. 8033a88: 3104 adds r1, #4
  65523. 08033a8a <LoopCopyDataInit>:
  65524. LoopCopyDataInit:
  65525. ldr r0, =_sdata
  65526. 8033a8a: 480c ldr r0, [pc, #48] ; (8033abc <LoopFillZerobss+0x1a>)
  65527. ldr r3, =_edata
  65528. 8033a8c: 4b0c ldr r3, [pc, #48] ; (8033ac0 <LoopFillZerobss+0x1e>)
  65529. adds r2, r0, r1
  65530. 8033a8e: 1842 adds r2, r0, r1
  65531. cmp r2, r3
  65532. 8033a90: 429a cmp r2, r3
  65533. bcc CopyDataInit
  65534. 8033a92: f4ff aff6 bcc.w 8033a82 <CopyDataInit>
  65535. ldr r2, =_sbss
  65536. 8033a96: 4a0b ldr r2, [pc, #44] ; (8033ac4 <LoopFillZerobss+0x22>)
  65537. b LoopFillZerobss
  65538. 8033a98: f000 b803 b.w 8033aa2 <LoopFillZerobss>
  65539. 08033a9c <FillZerobss>:
  65540. /* Zero fill the bss segment. */
  65541. FillZerobss:
  65542. movs r3, #0
  65543. 8033a9c: 2300 movs r3, #0
  65544. str r3, [r2], #4
  65545. 8033a9e: f842 3b04 str.w r3, [r2], #4
  65546. 08033aa2 <LoopFillZerobss>:
  65547. LoopFillZerobss:
  65548. ldr r3, = _ebss
  65549. 8033aa2: 4b09 ldr r3, [pc, #36] ; (8033ac8 <LoopFillZerobss+0x26>)
  65550. cmp r2, r3
  65551. 8033aa4: 429a cmp r2, r3
  65552. bcc FillZerobss
  65553. 8033aa6: f4ff aff9 bcc.w 8033a9c <FillZerobss>
  65554. /* Call the clock system intitialization function.*/
  65555. bl SystemInit
  65556. 8033aaa: f7f2 f83b bl 8025b24 <SystemInit>
  65557. /* Call static constructors */
  65558. bl __libc_init_array
  65559. 8033aae: f7ed fd6b bl 8021588 <__libc_init_array>
  65560. /* Call the application's entry point.*/
  65561. bl main
  65562. 8033ab2: f7f2 ff5f bl 8026974 <main>
  65563. bx lr
  65564. 8033ab6: 4770 bx lr
  65565. /* Copy the data segment initializers from flash to SRAM */
  65566. movs r1, #0
  65567. b LoopCopyDataInit
  65568. CopyDataInit:
  65569. ldr r3, =_sidata
  65570. 8033ab8: 0803b750 .word 0x0803b750
  65571. ldr r3, [r3, r1]
  65572. str r3, [r0, r1]
  65573. adds r1, r1, #4
  65574. LoopCopyDataInit:
  65575. ldr r0, =_sdata
  65576. 8033abc: 20000000 .word 0x20000000
  65577. ldr r3, =_edata
  65578. 8033ac0: 200018f8 .word 0x200018f8
  65579. adds r2, r0, r1
  65580. cmp r2, r3
  65581. bcc CopyDataInit
  65582. ldr r2, =_sbss
  65583. 8033ac4: 200018f8 .word 0x200018f8
  65584. FillZerobss:
  65585. movs r3, #0
  65586. str r3, [r2], #4
  65587. LoopFillZerobss:
  65588. ldr r3, = _ebss
  65589. 8033ac8: 20014fd8 .word 0x20014fd8
  65590. 08033acc <ADC_IRQHandler>:
  65591. * @retval None
  65592. */
  65593. .section .text.Default_Handler,"ax",%progbits
  65594. Default_Handler:
  65595. Infinite_Loop:
  65596. b Infinite_Loop
  65597. 8033acc: f7ff bffe b.w 8033acc <ADC_IRQHandler>
  65598. 08033ad0 <tinytens>:
  65599. 8033ad0: 89bc 97d8 d2b2 3c9c a733 d5a8 f623 3949 .......<3...#.I9
  65600. 8033ae0: a73d 44f4 0ffd 32a5 979d cf8c ba08 255b =..D...2......[%
  65601. 8033af0: 6f43 64ac 0628 0e18 Co.d(...
  65602. 08033af8 <_ctype_>:
  65603. 8033af8: 2000 2020 2020 2020 2020 2828 2828 2028 . (((((
  65604. 8033b08: 2020 2020 2020 2020 2020 2020 2020 2020
  65605. 8033b18: 8820 1010 1010 1010 1010 1010 1010 1010 ...............
  65606. 8033b28: 0410 0404 0404 0404 0404 1004 1010 1010 ................
  65607. 8033b38: 1010 4141 4141 4141 0101 0101 0101 0101 ..AAAAAA........
  65608. 8033b48: 0101 0101 0101 0101 0101 0101 1010 1010 ................
  65609. 8033b58: 1010 4242 4242 4242 0202 0202 0202 0202 ..BBBBBB........
  65610. 8033b68: 0202 0202 0202 0202 0202 0202 1010 1010 ................
  65611. 8033b78: 0020 0000 0000 0000 0000 0000 0000 0000 ...............
  65612. 8033b88: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  65613. 8033b98: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  65614. 8033ba8: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  65615. 8033bb8: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  65616. 8033bc8: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  65617. 8033bd8: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  65618. 8033be8: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  65619. 8033bf8: 0000 0000 0000 0000 ........
  65620. 08033c00 <p05.5261>:
  65621. 8033c00: 0005 0000 0019 0000 007d 0000 0000 0000 ........}.......
  65622. 08033c10 <__mprec_tens>:
  65623. 8033c10: 0000 0000 0000 3ff0 0000 0000 0000 4024 .......?......$@
  65624. 8033c20: 0000 0000 0000 4059 0000 0000 4000 408f ......Y@.....@.@
  65625. 8033c30: 0000 0000 8800 40c3 0000 0000 6a00 40f8 .......@.....j.@
  65626. 8033c40: 0000 0000 8480 412e 0000 0000 12d0 4163 .......A......cA
  65627. 8033c50: 0000 0000 d784 4197 0000 0000 cd65 41cd .......A....e..A
  65628. 8033c60: 0000 2000 a05f 4202 0000 e800 4876 4237 ... _..B....vH7B
  65629. 8033c70: 0000 a200 1a94 426d 0000 e540 309c 42a2 ......mB..@..0.B
  65630. 8033c80: 0000 1e90 bcc4 42d6 0000 2634 6bf5 430c .......B..4&.k.C
  65631. 8033c90: 8000 37e0 c379 4341 a000 85d8 3457 4376 ...7y.AC....W4vC
  65632. 8033ca0: c800 674e c16d 43ab 3d00 6091 58e4 43e1 ..Ngm..C.=.`.X.C
  65633. 8033cb0: 8c40 78b5 af1d 4415 ef50 d6e2 1ae4 444b @..x...DP.....KD
  65634. 8033cc0: d592 064d f0cf 4480 4af6 c7e1 2d02 44b5 ..M....D.J...-.D
  65635. 8033cd0: 9db4 79d9 7843 44ea ...yCx.D
  65636. 08033cd8 <__mprec_tinytens>:
  65637. 8033cd8: 89bc 97d8 d2b2 3c9c a733 d5a8 f623 3949 .......<3...#.I9
  65638. 8033ce8: a73d 44f4 0ffd 32a5 979d cf8c ba08 255b =..D...2......[%
  65639. 8033cf8: 6f43 64ac 0628 0ac8 Co.d(...
  65640. 08033d00 <__mprec_bigtens>:
  65641. 8033d00: 8000 37e0 c379 4341 6e17 b505 b8b5 4693 ...7y.AC.n.....F
  65642. 8033d10: f9f5 e93f 4f03 4d38 1d32 f930 7748 5a82 ..?..O8M2.0.Hw.Z
  65643. 8033d20: bf3c 7f73 4fdd 7515 454c 5f44 6c42 6e69 <.s..O.uLED_Blin
  65644. 8033d30: 006b 7542 7474 6e6f 0073 6e49 7469 6154 k.Buttons.InitTa
  65645. 8033d40: 6b73 4800 7261 4664 7561 746c 0a3a 000d sk.HardFault:...
  65646. 8033d50: 0d0a 6552 6967 7473 7265 3a73 0d0a 5300 ..Registers:...S
  65647. 8033d60: 2050 2020 2020 2020 2020 3020 2578 3830 P 0x%08
  65648. 8033d70: 786c 0d0a 5200 2030 2020 2020 2020 2020 lx...R0
  65649. 8033d80: 3020 2578 3830 786c 0d0a 5200 2031 2020 0x%08lx...R1
  65650. 8033d90: 2020 2020 2020 3020 2578 3830 786c 0d0a 0x%08lx..
  65651. 8033da0: 5200 2032 2020 2020 2020 2020 3020 2578 .R2 0x%
  65652. 8033db0: 3830 786c 0d0a 5200 2033 2020 2020 2020 08lx...R3
  65653. 8033dc0: 2020 3020 2578 3830 786c 0d0a 5200 3231 0x%08lx...R12
  65654. 8033dd0: 2020 2020 2020 2020 3020 2578 3830 786c 0x%08lx
  65655. 8033de0: 0d0a 4c00 2052 2020 2020 2020 2020 3020 ...LR 0
  65656. 8033df0: 2578 3830 786c 0d0a 5000 2043 2020 2020 x%08lx...PC
  65657. 8033e00: 2020 2020 3020 2578 3830 786c 0d0a 5000 0x%08lx...P
  65658. 8033e10: 5253 2020 2020 2020 2020 3020 2578 3830 SR 0x%08
  65659. 8033e20: 786c 0d0a 2500 2064 b4d0 bdd0 202e 6425 lx...%d ..... %d
  65660. 8033e30: d120 2e87 2520 2064 bcd0 b8d0 bdd0 002e ... %d ........
  65661. 8033e40: 2e31 0030 7325 7400 7572 0065 6166 736c 1.0.%s.true.fals
  65662. 8033e50: 0065 6e6f 3100 3239 312e 3836 312e 322e e.on.192.168.1.2
  65663. 8033e60: 3100 3239 312e 3836 312e 312e 3200 3535 .192.168.1.1.255
  65664. 8033e70: 322e 3535 322e 3535 302e 7000 6275 696c .255.255.0.publi
  65665. 8033e80: 0063 5442 362d 3037 0031 2e30 2e30 2e30 c.BT-6701.0.0.0.
  65666. 8033e90: 0030 3830 302e 2e37 3032 3631 4500 2d43 0.08.07.2016.EC-
  65667. 8033ea0: 4334 342d 2d44 3030 302d 2d30 4130 4b00 4C-4D-00-00-0A.K
  65668. 8033eb0: 2d4e 3330 302d 3030 3130 5400 4f32 004b N-03-00001.T2OK.
  65669. 8033ec0: 0020 6572 7571 7365 5f74 6174 6b73 5100 .request_task.Q
  65670. 8033ed0: 0d31 5400 0d4c 5400 5100 000d 0053 0052 1..TL..T.Q..S.R.
  65671. 8033ee0: 0d43 4300 0d54 4900 000d 0d46 4900 4c44 C..CT..I..F..IDL
  65672. 8033ef0: 0045 2509 0963 7525 2509 0975 7525 0a0d E..%c.%u.%u.%u..
  65673. 8033f00: 0000 0000 ....
  65674. 08033f04 <file__index_html>:
  65675. 8033f04: a3e4 0803 6c51 0803 6c5d 0803 0434 0000 ....Ql..]l..4...
  65676. 8033f14: 0001 0000 ....
  65677. 08033f18 <data__info_html>:
  65678. 8033f18: 692f 666e 2e6f 7468 6c6d 0000 5448 5054 /info.html..HTTP
  65679. 8033f28: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  65680. 8033f38: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  65681. 8033f48: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  65682. 8033f58: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  65683. 8033f68: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  65684. 8033f78: 6e65 2d74 654c 676e 6874 203a 3131 3230 ent-Length: 1102
  65685. 8033f88: 0a0d 6f43 6e6e 6365 6974 6e6f 203a 6c43 ..Connection: Cl
  65686. 8033f98: 736f 0d65 430a 6e6f 6574 746e 742d 7079 ose..Content-typ
  65687. 8033fa8: 3a65 7420 7865 2f74 7468 6c6d 0a0d 6f43 e: text/html..Co
  65688. 8033fb8: 746e 6e65 2d74 6e45 6f63 6964 676e 203a ntent-Encoding:
  65689. 8033fc8: 7a67 7069 0a0d 0a0d 8b1f 0008 0000 0000 gzip............
  65690. 8033fd8: 0a04 569d 6edd 36db 7e14 9615 45db 580c ...V.n.6.~...E.X
  65691. 8033fe8: 7376 6037 8092 0b22 0eb6 1b4d 19a0 5db0 vs7`.."...M....]
  65692. 8033ff8: b40d db44 256c a352 2728 50c1 4920 eebb ..D.l%R.('.P I..
  65693. 8034008: 05a2 040a 18bb 6e86 df43 1bc0 2dea ea5d .......nC....-].
  65694. 8034018: 15f4 37a8 39da e4a4 8844 61bb 90bb f22d ...7.9..D..a..-.
  65695. 8034028: f2fc f7e3 3b1d f1bc bdc9 bdad 76af c9b7 .....;.......v..
  65696. 8034038: e4d4 1c59 27e2 98c9 449c c294 b38a 0e34 ..Y..'...D....4.
  65697. 8034048: 6e73 4918 4ca6 dc97 b444 e332 23e0 b9b0 sn.I.L..D.2..#..
  65698. 8034058: a9dd 4531 bfc0 c4a9 a22c 065f dc5f b60a ..1E....,._._...
  65699. 8034068: 5e54 2330 1946 24a7 d251 0970 b721 23b7 T^0#F..$Q.p.!..#
  65700. 8034078: 4e9e 1b78 5924 23ce 133a bf7c da50 f15c .Nx.$Y.#:.|.P.\.
  65701. 8034088: 17db 99a9 2946 899f 0784 d16e 5217 c118 ....F)....n..R..
  65702. 8034098: a0b2 584c a3c6 7ecd 0ece 5e44 abe5 5575 ..LX...~..D^..uU
  65703. 80340a8: ed72 0c16 464a a137 1184 e326 fdb1 2ed1 r...JF7...&.....
  65704. 80340b8: 27eb a2f6 b23e ed6f 7ebc cf6a 17ea d0e1 .'..>.o..~j.....
  65705. 80340c8: c2db c84c 6487 f9aa a238 1339 9072 2594 ..L..d..8.9.r..%
  65706. 80340d8: 9a25 1167 cd2d c661 29cb 06e7 0d32 f1fd %.g.-.a..)..2...
  65707. 80340e8: 2a47 8c3d 54c3 48cc b192 8cb2 64a8 11b3 G*=..T.H.....d..
  65708. 80340f8: c4d3 057f 1f29 2ab3 ed33 2c72 780e 181a ....)..*3.r,.x..
  65709. 8034108: 4055 6b82 0131 e466 9bda 90e2 4d35 9908 U@.k1.f.....5M..
  65710. 8034118: 83f2 4201 600f 1af8 9a99 6c28 c181 6903 ...B.`....(l...i
  65711. 8034128: cfda e236 4a03 0a44 73dd 0559 7002 5c6e ..6..JD..sY..pn\
  65712. 8034138: acab 878d dae6 e08e 7bd5 4be3 870c 5b5f .........{.K.._[
  65713. 8034148: b638 02bf 474e 0e76 2d78 93ea a8fa e67e 8...NGv.x-....~.
  65714. 8034158: a3ab d5ff 2018 1181 5272 7efa fb63 8433 ..... ..rR.~c.3.
  65715. 8034168: 631d bd80 6fb0 5fec 6cf6 987d 6390 3dd5 .c...o._.l}..c.=
  65716. 8034178: 4b22 988c 2901 5fd6 1e15 cb1c 2b0e a560 "K...)._.....+`.
  65717. 8034188: e087 9c0a 9afb 0515 e900 6850 0678 9b67 ..........Phx.g.
  65718. 8034198: be6e 1b27 4218 0700 9b31 4cb1 40a4 2551 n.'..B..1..L.@Q%
  65719. 80341a8: 9183 403a b0e0 58c2 dce9 ef99 dddf c5d9 ..:@...X........
  65720. 80341b8: 295e fec1 8c94 eba8 993c 4a08 f280 0553 ^)......<..J..S.
  65721. 80341c8: 3e29 dedd 3883 9483 f16b 8bf6 ada6 2715 )>...8..k......'
  65722. 80341d8: 28cc b970 59c0 93c3 deb6 4952 d50e e3b5 .(p..Y....RI....
  65723. 80341e8: 3d82 ec05 f616 fd6d 3882 7ffc d603 209e .=....m..8.....
  65724. 80341f8: 06fa b7b4 c63e 5a75 4615 28e4 e72a 7438 ....>.uZ.F.(*.8t
  65725. 8034208: 5c15 d895 84be 78bb 390d ebcf abe7 8e34 .\.....x.9....4.
  65726. 8034218: 2a2f d9e5 88da e01f 4f16 9cec 77d8 22ee /*.......O...w."
  65727. 8034228: eccf f69f 4c77 5782 6f0b 4ef3 429a 402b ....wL.W.o.N.B+@
  65728. 8034238: 7d70 53e9 cf60 7d51 7a8c 4023 5fa9 813a p}.S`.Q}.z#@._:.
  65729. 8034248: fde3 d719 a025 aeba 9d87 5b5b e804 1af7 ....%.....[[....
  65730. 8034258: a8d1 3b8f 3971 584b a29a ae6e f59f 1615 ...;q9KX..n.....
  65731. 8034268: 67b4 bdc0 fd65 becc 7621 7d09 8723 3a8f .g..e...!v.}#..:
  65732. 8034278: 6029 484e 28a7 b544 d603 3da9 b2c7 1708 )`NH.(D....=....
  65733. 8034288: 3d44 a36d 50e2 a2c8 c432 161c ad30 3f0c D=m..P..2...0..?
  65734. 8034298: 4980 27e5 da97 2d97 9af5 46d7 48b4 00a2 .I.'...-...F.H..
  65735. 80342a8: a8d9 2815 4619 c655 04e5 1a26 bcdd 9389 ...(.FU...&.....
  65736. 80342b8: 7ae9 2fef a4f1 f000 7d85 cf07 3c39 407f .z./.....}..9<.@
  65737. 80342c8: 4b1b cd38 dfe2 28db cb0f 2a3b 4c71 3af6 .K8....(..;*qL.:
  65738. 80342d8: 56c8 ffab cfdb 0e4f 003a b00f 3604 5c38 .V....O.:....68\
  65739. 80342e8: cf41 889e 07ef 5124 4c39 c022 3907 5ab6 A.....$Q9L"..9.Z
  65740. 80342f8: d7fc 8626 434e 3871 8caa b251 ddc1 282f ..&.NCq8..Q.../(
  65741. 8034308: 3251 44c9 30f2 9aa2 4a9b 524b a356 985c Q2.D.0...JKRV.\.
  65742. 8034318: 20db 8dd4 ff5e e6c6 6e6a 8c8e f024 8504 . ..^...jn..$...
  65743. 8034328: 3916 87d3 5d30 815e be9c 9383 11cc 1057 .9..0]^.......W.
  65744. 8034338: 2816 27c2 0b85 0bc1 2f83 603f 9cfd 132f .(.'...../?`../.
  65745. 8034348: 8a2d b7ab 7c3e 66c0 efcc 5252 a4ea cdf9 -...>|.f..RR....
  65746. 8034358: 5078 8de2 fdfa fc38 a8c7 c278 e7cd eff7 xP....8...x.....
  65747. 8034368: dddd 1cb8 fd25 2571 78dd 90d9 6fbd dc3f ....%.q%.x...o?.
  65748. 8034378: 8da0 7b96 2103 5b81 ed9f dced e489 6fc0 ...{.!.[.......o
  65749. 8034388: c1f6 3b9c 76dd 6ead 8d0f 1aad e6bb 1766 ...;.v.n......f.
  65750. 8034398: 2e1d d755 5975 bbed 8d12 bac4 8d2e d0f0 ..U.uY..........
  65751. 80343a8: 0bc1 6ba8 7b76 f468 e83a 600d 56b8 5a1c ...kv{h.:..`.V.Z
  65752. 80343b8: 6b77 ac34 7938 bb69 5bc2 68f4 72f9 d0e9 wk4.8yi..[.h.r..
  65753. 80343c8: f4ec 932b 32ec 72cd c284 7d24 4dc9 dbfb ..+..2.r..$}.M..
  65754. 80343d8: 35f3 1bfc 1391 829e cd65 a3ee ba0e bff0 .5......e.......
  65755. 80343e8: 9b41 0a0d 53bf 520b 063f cf9d 6851 bb20 A....S.R?...Qh .
  65756. 80343f8: 30e7 50ec f575 fae3 cf7b e20c 4bac 4837 .0.Pu...{....K7H
  65757. 8034408: 0316 7bda fbd4 f2f8 878a 0fee dfd2 c2d1 ...{............
  65758. 8034418: d382 0930 0000 ..0...
  65759. 0803441e <data__settings_html>:
  65760. 803441e: 732f 7465 6974 676e 2e73 7468 6c6d 0000 /settings.html..
  65761. 803442e: 5448 5054 312f 312e 3220 3030 4f20 0d4b HTTP/1.1 200 OK.
  65762. 803443e: 530a 7265 6576 3a72 6c20 4977 2f50 2e31 .Server: lwIP/1.
  65763. 803444e: 2e33 2031 6828 7474 3a70 2f2f 6173 6176 3.1 (http://sava
  65764. 803445e: 6e6e 6861 6e2e 6e6f 6e67 2e75 726f 2f67 nnah.nongnu.org/
  65765. 803446e: 7270 6a6f 6365 7374 6c2f 6977 2970 0a0d projects/lwip)..
  65766. 803447e: 6f43 746e 6e65 2d74 654c 676e 6874 203a Content-Length:
  65767. 803448e: 3032 3337 0a0d 6f43 6e6e 6365 6974 6e6f 2073..Connection
  65768. 803449e: 203a 6c43 736f 0d65 430a 6e6f 6574 746e : Close..Content
  65769. 80344ae: 742d 7079 3a65 7420 7865 2f74 7468 6c6d -type: text/html
  65770. 80344be: 0a0d 6f43 746e 6e65 2d74 6e45 6f63 6964 ..Content-Encodi
  65771. 80344ce: 676e 203a 7a67 7069 0a0d 0a0d 8b1f 0008 ng: gzip........
  65772. 80344de: 0000 0000 0a04 58b5 6edd c6dc 7e15 9a15 .......X.n...~..
  65773. 80344ee: 8369 405d 95dc 246c ec28 8125 7656 5f03 i.]@..l$(.%.Vv._
  65774. 80344fe: 1524 a712 ae6e 598c b472 113b 4aff 770e $...n..Yr.;..J.w
  65775. 803450e: 1aa5 6406 4d3b 2403 8068 26f6 da28 7d18 ...d;M.$h..&(..}
  65776. 803451e: b583 2722 648a 40cb 809f a37c 677e e486 .."'.d.@..|.~g..
  65777. 803452e: 52ce 7ff2 b17c 3912 399c e7ff 733b e8ce .R..|..9.9..;s..
  65778. 803453e: d5c2 6c3f f8de eb6c 359a 5195 8de8 afe8 ..?l..l..5.Q....
  65779. 803454e: b215 e278 36da 38de bc0b c451 b325 29fc ..x..6.8..Q.%..)
  65780. 803455e: 72cb 5d2e 90bb cedb f06f ad4d a54e 1d4c .r.]....o.M.N.L.
  65781. 803456e: e7fe cc42 fb5c ce4f bfa7 3675 2893 5265 ..B.\.O...u6.(eR
  65782. 803457e: 438c 5b6e 127e 1e4b c8e3 6bf5 0f2e bc26 .Cn[~.K....k..&.
  65783. 803458e: 1439 88b3 f6bb f04c 9a79 d264 37d8 8117 9.....L.y.d..7..
  65784. 803459e: ba9c 9f01 9f09 ea3b 4d65 42c4 160a b93a ......;.eM.B..:.
  65785. 80345ae: 42cf 6eee 45ac 576c 4544 bed4 3917 d4cf .B.n.ElWDE...9..
  65786. 80345be: 030b 774b 2c1d 90a4 f721 ffca 8b94 6eea ..Kw.,..!......n
  65787. 80345ce: af75 2fda cb4f cb9f f2e3 3468 5fd4 a146 u../O.....h4._F.
  65788. 80345de: 7788 69ac b7c6 3b5d 2262 f81e 6e79 195b .w.i..];b"..yn[.
  65789. 80345ee: 5d0f 973b 217b a7cf 4b9c 19d0 e56a 49c7 .];.{!...K..j..I
  65790. 80345fe: e7b0 028d b331 e044 7eda c452 99d2 2c67 ....1.D..~R...g,
  65791. 803460e: 8ec5 c595 9920 58c7 bd4b 5ff2 f8e0 e6a4 .... ..XK.._....
  65792. 803461e: 527c 949e aa8f ab7d 587c 2fdd f10f cf78 |R....}.|X./..x.
  65793. 803462e: 9f2a 4ad2 a8f9 a9fc 945c 543f f8fb 23f0 *..J....\.?T...#
  65794. 803463e: 9ede d558 9adf d60f 4f28 6c59 8c30 688b ..X.....(OYl0..h
  65795. 803464e: 33cc 7bdb 346f 2fa4 559e c5dd 6391 7d1c .3.{o4./.U...c.}
  65796. 803465e: 1e52 460e 14c3 42e2 431a 29a4 77f7 4d3e R..F...B.C.).w>M
  65797. 803466e: 2603 16f9 7e83 68de c93b 8b22 52f9 3124 .&...~.h;."..R$1
  65798. 803467e: 6b5c 7bc1 04d3 a50a 4e49 42ca 7fec 0794 \k.{....IN.B....
  65799. 803468e: 79a0 1e58 f755 47ca e524 d942 a4ee c6fa .yX.U..G$.B.....
  65800. 803469e: eac2 f549 55ad 541e 857f 876e 02e5 968f ..I..U.T..n.....
  65801. 80346ae: e1d2 f2c7 7ca8 616c 21f1 3924 0505 8ba8 .....|la.!$9....
  65802. 80346be: 23a7 fdda ce94 5f57 c761 d901 8b5f e229 .#....W_a..._.).
  65803. 80346ce: 90b4 b34a 1e74 96d8 4bdc 0a11 4429 279c ..J.t....K..)D.'
  65804. 80346de: de19 10fd ae8f c24d 143a 593e da12 1a56 ......M.:.>Y..V.
  65805. 80346ee: 9f32 934f e030 6b99 0f97 8296 fbb5 64c3 2.O.0..k.......d
  65806. 80346fe: 6222 cadb 5fc5 ed40 3ae2 63d4 21bb 278f "b..._@..:.c.!.'
  65807. 803470e: 2688 e37b db7d 11d2 b2d7 46f1 4ce3 b4ff .&{.}......F.L..
  65808. 803471e: 5a38 718a 6521 2a02 cfca 9261 8773 b40e 8Z.q!e.*..a.s...
  65809. 803472e: c63c b632 73f0 2402 7c07 cd61 5858 5b80 <.2..s.$.|a.XX.[
  65810. 803473e: 3df9 f5ec 6958 b0bd 6b3d 5264 8bcc 2471 .=..Xi..=kdR..q$
  65811. 803474e: c028 56b5 850d f0bc 4e7d 9394 0fd8 bf85 (..V....}N......
  65812. 803475e: dae3 9719 1645 c723 b5e0 9bad 7b57 b5fd ....E.#.....W{..
  65813. 803476e: 1b0b 1cab 98c8 180b de12 bea9 c381 6486 ...............d
  65814. 803477e: c6a2 4beb d7df 629c 1b36 0cb3 d36a 273f ...K...b6...j.?'
  65815. 803478e: dbe0 08ac f365 2dba 7976 c8e0 09a4 95e1 ....e..-vy......
  65816. 803479e: 0e33 3d45 1a85 b745 6237 a275 3888 bbe0 3.E=..E.7bu..8..
  65817. 80347ae: 0203 5687 d81b 213c d841 14aa 89cd b477 ...V..<!A.....w.
  65818. 80347be: 2321 171e 808e eb2b 45ad 58d8 c203 1235 !#....+..E.X..5.
  65819. 80347ce: 51e1 a6ef 0f07 7a09 632e 76af 82fd 4dcc .Q.....z.c.v...M
  65820. 80347de: 55f9 ad7d d3b9 f37e 600c 8a4a 9278 caaf .U}...~..`J.x...
  65821. 80347ee: b14b 033f 9d06 0c87 43a4 8a97 b788 4d13 K.?......C.....M
  65822. 80347fe: 2bc1 43bf 7f42 6081 07de 45eb 25f5 f7c5 .+.CB..`...E.%..
  65823. 803480e: f592 00b0 9e6e 0171 4461 714a 61a2 2143 ....n.q.aDJq.aC!
  65824. 803481e: 7421 6e9b 2b9c 9600 3047 ed0d 5c45 e409 !t.n.+..G0..E\..
  65825. 803482e: f22d 19d4 bb27 3664 afa2 97d2 d33e 6203 -...'.d6....>..b
  65826. 803483e: c9a3 56e4 7f57 9622 fd59 b5c1 381b e0d8 ...VW.".Y....8..
  65827. 803484e: 6493 6c63 a1c3 d3da 5dfa 506f 976c 70eb .dcl.....]oPl..p
  65828. 803485e: 8100 6985 77cd 38f2 974a ac41 78cd 8d83 ...i.w.8J.A..x..
  65829. 803486e: ef6d 8f93 dc3e 9a5a e561 cc4c 1ce5 fea6 m...>.Z.a.L.....
  65830. 803487e: 392f b90a 5071 bd7d 94c4 fd73 31d7 6922 /9..qP}...s..1"i
  65831. 803488e: 792a 9a94 0332 a8f8 9084 b556 b4c0 aa12 *y..2.....V.....
  65832. 803489e: 8588 c1bb 056e 8179 8a5b e3f7 701a 0817 ....n.y.[....p..
  65833. 80348ae: fb99 683a a85a a15c 4843 4abf 109f b9c8 ..:hZ.\.CH.J....
  65834. 80348be: b588 e031 02d1 1d94 fbc3 545f 47f7 f1c3 ..1......._T.G..
  65835. 80348ce: 1c8a ae0a 5926 5052 854a cc6c 0b43 ae4b ....&YRPJ.l.C.K.
  65836. 80348de: 77cd 2925 2b71 3802 db91 808f 4ff4 6faa .w%)q+.8.....O.o
  65837. 80348ee: 1c09 fc01 67c8 ca42 cb2f 8205 0e8f a379 .....gB./.....y.
  65838. 80348fe: 879c 97dc 7a8d 6c8a 828d c296 2715 748f .....z.l.....'.t
  65839. 803490e: 9940 6b94 3374 1097 9a34 4814 bd52 dff8 @..kt3..4..HR...
  65840. 803491e: b362 1cae f90a 110c d721 213f 2a04 5365 b.......!.?!.*eS
  65841. 803492e: e87c 15ad 7088 adb2 0645 5b87 a153 86ea |....p..E..[S...
  65842. 803493e: 472e e88a 0c99 a178 1855 1ba2 0765 10d5 .G....x.U...e...
  65843. 803494e: e575 b617 680b ed77 ec42 aede d85d c76e u....hw.B...].n.
  65844. 803495e: da2e 6726 632c d5c6 ca77 a7f6 fe28 8608 ..&g,c..w...(...
  65845. 803496e: 18f2 0537 e418 7b6e 7849 aa88 b3fa adaa ..7...n{Ix......
  65846. 803497e: 943f 54a7 a995 eb3c 01c0 3d04 0c27 348d ?..T..<....='..4
  65847. 803498e: 6551 6345 1d49 6667 6a91 d6bf 1af6 1d33 QeEcI.gf.j....3.
  65848. 803499e: beb4 00cc 94f6 ab88 282b 535a 812a faed ........+(ZS*...
  65849. 80349ae: 1227 8cb7 1f5e 0fc5 3cce 4dc6 efe1 4650 '...^....<.M..PF
  65850. 80349be: a9d5 8c36 05b4 b08c 486b f2fe 6199 ee52 ..6.....kH...aR.
  65851. 80349ce: a468 bd98 0895 9830 2276 1280 8ce8 9fff h.....0.v"......
  65852. 80349de: 1995 992d 90b7 2619 aeed de5d 665a 4c18 ..-....&..].Zf.L
  65853. 80349ee: 763b 3331 7cc3 6a6e 6ad6 41d1 22c5 57ac ;v13.|nj.j.A.".W
  65854. 80349fe: 6f55 1b86 0bed 810a 4c2e 45cf 2379 3316 Uo.......L.Ey#.3
  65855. 8034a0e: 78dc f96e 1449 e815 5035 3e01 bbc6 3e85 .xn.I...5P.>...>
  65856. 8034a1e: bf46 31b7 9e4c f334 0246 db0e 64f2 b542 F..1L.4.F....dB.
  65857. 8034a2e: 9a4e d50e e4da 55dd 9ef3 1efa 89e0 1898 N......U........
  65858. 8034a3e: cda2 2133 29b9 4ddb 785a e173 74ba e96b ..3!.).MZxs..tk.
  65859. 8034a4e: 2cce 40bf 88bc 0cc5 e177 5beb 71c0 f52a .,.@....w..[.q*.
  65860. 8034a5e: d4fb a042 d9db 5d78 2da3 d609 2d12 ce17 ..B...x].-...-..
  65861. 8034a6e: a6d8 84fd bd02 fdc2 1be2 bf73 d4d8 930e ..........s.....
  65862. 8034a7e: d747 ed37 4bb7 fe1d de97 ff98 33a5 c1fc G.7..K.......3..
  65863. 8034a8e: 86a3 2591 1098 ab34 567b 5f73 b3a8 5b04 ...%..4.{Vs_...[
  65864. 8034a9e: f00d deef 5e91 257c 6e7b 18de db94 51c2 .....^|%{n.....Q
  65865. 8034aae: ec87 7a6a 5fb4 4f6b 5306 b71f 9239 3f59 ..jz._kO.S..9.Y?
  65866. 8034abe: cb2d bd08 351b 01e4 de2a 6e09 756a b10d -....5..*..nju..
  65867. 8034ace: 6fae 2839 8778 2e08 45d4 9a8b 5420 53c0 .o9(x....E.. T.S
  65868. 8034ade: 1175 87bf 4332 f34d dd5d d7df 6dc5 b909 u...2CM.]....m..
  65869. 8034aee: 2646 9489 0105 9ada 6a55 d360 08ce 1d54 F&......Uj`...T.
  65870. 8034afe: 303e 632e 98af 35f0 5a87 86dd 375f 266a >0.c...5.Z.._7j&
  65871. 8034b0e: 16b8 6477 8af8 264a 034d 375e 406e e6b3 ..wd..J&M.^7n@..
  65872. 8034b1e: d44a 1cbb 9623 20ef ff42 ab8d d92b bd09 J...#.. B...+...
  65873. 8034b2e: 53fb ef98 2f10 3774 58c7 30c4 2bdb 9be0 .S.../t7.X.0.+..
  65874. 8034b3e: db22 2966 50b1 4d8c d72c a9cf c6a5 ae2a ".f).P.M,.....*.
  65875. 8034b4e: 06ad 973a d637 7fd7 7b4d b355 f75d 4dff ..:.7...M{U.]..M
  65876. 8034b5e: 5de7 c75f 3e9b cd39 c444 bdb2 7db3 eeb2 .]_..>9.D....}..
  65877. 8034b6e: 7fab 4e8f d728 32ad 435a 07c4 1146 f4f5 ...N(..2ZC..F...
  65878. 8034b7e: 3d01 2e32 8a47 5a05 97f2 d5e1 f574 402a .=2.G..Z....t.*@
  65879. 8034b8e: ccf9 38c9 265a d895 410f 94f9 c4ae 44af ...8Z&...A.....D
  65880. 8034b9e: ce6f 98b2 129a f11d e08a 4938 e288 8203 o.........8I....
  65881. 8034bae: c848 1cb9 fcff 6e44 4579 edfa a10c b811 H.....DnyE......
  65882. 8034bbe: c350 d01e beff 8b3b 9d51 5297 9da2 b4c5 P.....;.Q..R....
  65883. 8034bce: f4cc 88e8 57aa 2f8b e07a fb95 4899 ed65 .....W./z....He.
  65884. 8034bde: 2a1f c375 d9cf e98c 0c55 325a 1ebf 7d9e .*u.....U.Z2...}
  65885. 8034bee: ed4e 50e2 a3af 7855 29de eaef 1f67 badd N..P..Ux.)..g...
  65886. 8034bfe: ed79 0377 8f34 00f9 2de6 ded2 116d b65c y.w.4....-..m.\.
  65887. 8034c0e: 5b81 3faa c35d 6f30 4933 0476 2fcf 585f .[.?].0o3Iv../_X
  65888. 8034c1e: d3bf 32bf 19a3 4c86 e231 899b 8ff4 6f34 ...2...L1.....4o
  65889. 8034c2e: 82b9 aa8d 47b7 0b87 ffd7 67aa 5a63 d4e8 .....G.....gcZ..
  65890. 8034c3e: f7ba cd07 6540 88bb a4d5 d7ab 8dbf c62d ....@e........-.
  65891. 8034c4e: aed0 503f 38c1 4408 a98e 1ed2 b0ee e261 ..?P.8.D......a.
  65892. 8034c5e: d8ef 4844 9601 3231 c67b 3bd6 ef6a 3c72 ..DH..12{..;j.r<
  65893. 8034c6e: 3af4 e34c 1704 9798 a9e2 2a76 a496 0ea7 .:L.......v*....
  65894. 8034c7e: 73ca 3639 5b1a 89b8 9edf 5c63 cc93 5007 .s96.[....c\...P
  65895. 8034c8e: cd4d 0611 d87a 9689 9cd0 dc8b 70d9 09dd M...z........p..
  65896. 8034c9e: 9b97 5c1f 61ef 84fe 036f 211a dff4 177d ...\.a..o..!..}.
  65897. 8034cae: 378f c444 4293 f8f6 06da d4bf f837 18ab .7D..B......7...
  65898. 8034cbe: 573e 4600 2c53 acfa acc8 892d 9033 bdec >W.FS,....-.3...
  65899. 8034cce: 17bc c068 66aa cfa9 ffb0 f29a ed26 5de8 ..h..f......&..]
  65900. 8034cde: ef58 eff7 595c df46 8d50 ffb0 0b0f 5d40 X...\YF.P.....@]
  65901. 8034cee: d23d 0016 2f00 =....
  65902. 08034cf3 <data__main_js>:
  65903. 8034cf3: 6d2f 6961 2e6e 736a 0000 0000 5448 5054 /main.js....HTTP
  65904. 8034d03: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  65905. 8034d13: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  65906. 8034d23: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  65907. 8034d33: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  65908. 8034d43: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  65909. 8034d53: 6e65 2d74 654c 676e 6874 203a 3737 3239 ent-Length: 7792
  65910. 8034d63: 0a0d 6f43 6e6e 6365 6974 6e6f 203a 6c43 ..Connection: Cl
  65911. 8034d73: 736f 0d65 430a 6e6f 6574 746e 742d 7079 ose..Content-typ
  65912. 8034d83: 3a65 6120 7070 696c 6163 6974 6e6f 782f e: application/x
  65913. 8034d93: 6a2d 7661 7361 7263 7069 0d74 430a 6e6f -javascript..Con
  65914. 8034da3: 6574 746e 452d 636e 646f 6e69 3a67 6720 tent-Encoding: g
  65915. 8034db3: 697a 0d70 430a 6361 6568 432d 6e6f 7274 zip..Cache-Contr
  65916. 8034dc3: 6c6f 203a 7270 7669 7461 2c65 6d20 7861 ol: private, max
  65917. 8034dd3: 612d 6567 383d 3436 3030 0a0d 0a0d 8b1f -age=86400......
  65918. 8034de3: 0008 0000 0000 0a04 5ccd 7379 c6dc ff95 .........\ys....
  65919. 8034df3: 202a 50a2 0f03 1c38 b0ea 1993 5382 6cba * .P..8......S.l
  65920. 8034e03: 6b2b 2b1d ebd1 2964 8586 67a3 e206 300c +k.+..d)...g...0
  65921. 8034e13: 3006 18a2 5592 bc49 aa39 8aec bcab ec7f .0...UI.9.......
  65922. 8034e23: d6d6 a56e 1bf6 5e38 512b c4ec daa9 404f ..n...8^+Q....O@
  65923. 8034e33: a37e bdfd ddd7 0340 9433 a3e4 b776 8b12 ~.....@.3...v...
  65924. 8034e43: 4683 af1f bf5f bdfb 70c6 849e 9c45 d626 .F.._....p..E.&.
  65925. 8034e53: 9685 1cef a265 6798 1589 e1a5 2a7c a292 ....e..g....|*..
  65926. 8034e63: 1233 adc5 a089 d79f 6f0f e847 3271 fdd4 3........oG.q2..
  65927. 8034e73: eaf1 9a46 c7ee c682 f3d9 585c 9179 61c5 ..F.......\Xy..a
  65928. 8034e83: f761 6987 7ad6 67e2 e056 f395 dc84 0dd3 a..i.z.gV.......
  65929. 8034e93: a0bd cf93 7126 b2d1 96fb b8ed d791 47ed ....&q.........G
  65930. 8034ea3: 619b 2267 5192 ee31 ed47 73b6 2344 1785 .ag".Q1.G..sD#..
  65931. 8034eb3: 44ee babb 67ab fd3b d878 3b12 5ddd f3cf .D...g;.x..;.]..
  65932. 8034ec3: 051d 41e3 449c 41e9 9e67 3c88 67f4 af02 ...A.D.Ag..<.g..
  65933. 8034ed3: 7637 139d d2f9 2bb6 f338 4e0a 7037 b943 7v.....+8..N7pC.
  65934. 8034ee3: e440 6df9 b3db 6adb 3512 c045 84eb 5d5b @..m...j.5E...[]
  65935. 8034ef3: 450d 0e22 9bac 217e a2fa 6983 e3b6 9629 .E"...~!...i..).
  65936. 8034f03: 9c21 2ff0 7da7 f5f9 f76e f0b5 0db5 9971 !../.}..n.....q.
  65937. 8034f13: 12b6 b1b5 f129 1674 2267 d4c7 53a2 6fa4 ....).t.g"...S.o
  65938. 8034f23: d9dd 087e 24a4 96a3 d273 85c0 5517 4620 ..~..$..s....U F
  65939. 8034f33: 2262 510a b361 95d9 ad60 dea6 cf1e ab5d b".Qa...`.....].
  65940. 8034f43: 61bb c8fd ac4f 1f8d d1be bab5 1edd 7ffd .a..O...........
  65941. 8034f53: c2c3 7d72 e763 3f43 b712 9c93 c7ce e4ef ..r}c.C?........
  65942. 8034f63: e1c5 7444 99d2 c61f a1c5 75d7 73cb 5a0c ..Dt.......u.s.Z
  65943. 8034f73: b772 37a1 b3f3 bc5c 4939 a2fd e8d5 78cf r..7..\.9I.....x
  65944. 8034f83: 8569 af6d bdd3 6cec ac6d 2b78 5140 8fa3 i.m....lm.x+@Q..
  65945. 8034f93: f617 e8e9 2f22 ef13 45cf bc5e f999 9740 ...."/...E^...@.
  65946. 8034fa3: 9ead 8470 2b51 4e70 804e 7289 c8e9 fc2f ..p.Q+pNN..r../.
  65947. 8034fb3: 1937 c048 a9a0 f7c6 fc76 8dd0 3742 f64e 7.H.....v...B7N.
  65948. 8034fc3: 1886 a6ed 42f3 98fe 641d e06e 7b17 6e38 .....B...dn..{8n
  65949. 8034fd3: 4cbc b644 8857 8ce9 0a9a cc9c 0c44 370b .LD.W.......D..7
  65950. 8034fe3: 9fbf 881e cdcc a3af 644d bb87 006e 0b0a ........Md..n...
  65951. 8034ff3: 7d36 614d 2801 44ac 4ecb 8200 8129 c709 6}Ma.(.D.N..)...
  65952. 8035003: dc22 587f b4e0 4c01 3cd5 13f3 9131 becd "..X...L.<..1...
  65953. 8035013: 681b 0554 429d 053c 27fd 5805 afa3 d228 .hT..B<..'.X..(.
  65954. 8035023: b41f de40 e78c 9d30 99a4 ed77 6b9d ee0f ..@...0...w..k..
  65955. 8035033: bdec e0f5 add6 eebb 3493 0206 0c3a dbf7 .........4..:...
  65956. 8035043: 77db f1de 6e2e 98e6 0adb 7e27 720e fa99 .w...n....'~.r..
  65957. 8035053: fed9 ba5a 6f6f ae6d f353 c5d6 e876 bd38 ..Z.oom.S...v.8.
  65958. 8035063: f3a5 b83d f375 6695 27f3 ff53 7d71 6ac2 ..=.u..f.'S.q}.j
  65959. 8035073: 045b 9842 da09 c82d c9a3 fcad a6e2 0212 [.B...-.........
  65960. 8035083: c838 4911 9680 fe03 48ad fb93 e128 b2d0 8..I.....H..(...
  65961. 8035093: f8a3 8e09 ce98 3430 e8f6 c3f7 30ce f2ce ......04.....0..
  65962. 80350a3: c6e2 9e38 7d44 e827 b3f8 4899 7e22 cf44 ..8.D}'....H"~D.
  65963. 80350b3: 9dea 91a3 5418 d230 dd41 839b 1718 6d69 .....T0.A.....im
  65964. 80350c3: 4ea3 90bf 900e 9338 d035 55e7 b367 68eb .N....8.5..Ug..h
  65965. 80350d3: 8cd2 4862 ff1b b3d0 3493 7611 4c5f c172 ..bH.....4.v_Lr.
  65966. 80350e3: 0d7b 25cf 70d2 4881 b925 f8b4 f5f0 15bc {..%.p.H%.......
  65967. 80350f3: e91b bd16 7052 6c7c 9307 dc34 2bb7 4308 ....Rp|l..4..+.C
  65968. 8035103: 61c5 4bc1 2c39 0e20 7abb 872e 2f05 b0e5 .a.K9, ..z.../..
  65969. 8035113: c1b0 8961 2028 0ab8 a048 2f7c fb1c 48c9 ..a.( ..H.|/...H
  65970. 8035123: f700 73a0 0440 d99c 3645 b617 2de7 b5e9 ...s@...E6...-..
  65971. 8035133: baba b662 a78a 9c22 2217 8e72 b596 1c42 ..b...".."r...B.
  65972. 8035143: 6430 67be d590 4dc5 84d0 4715 8d9e 9f33 0d.g...M...G..3.
  65973. 8035153: ae1c 3869 9140 adb3 4fd3 ff4e fa7a f4fc ..i8@....ON.z...
  65974. 8035163: a72f f29f 67df 75ae f9fa 97e9 1f67 a75b /....g.u....g.[.
  65975. 8035173: 3b7f 39fb 78bf 1786 dff4 3473 fd9e f4e2 .;.9.x....s4....
  65976. 8035183: d9d9 f12f d9f8 87d9 bf67 d0b2 e9fa 2fd9 ../.....g....../
  65977. 8035193: 7ece 9e89 a15f 0bf1 786a 9f86 387f 15fb .~.._...jx...8..
  65978. 80351a3: fdfe 879c 657f 2461 feba 5a8d f630 cc33 .....ea$...Z0.3.
  65979. 80351b3: 73f0 877a 1f61 ac75 7fd3 49e5 737e ccfa .sz.a.u....I~s..
  65980. 80351c3: 0742 62ac f461 e807 c1f9 2fd9 b969 d03f B..ba....../i.?.
  65981. 80351d3: 67dc 25bf ce08 b43e 3f4e 68b3 33f9 a774 .g.%..>.N?.h.3t.
  65982. 80351e3: e8be d1bd 00b5 73fc c5bc ce80 fae6 6b6c .......s......lk
  65983. 80351f3: b7d3 99c6 7a18 9876 2026 69eb 1c27 b6c5 .....zv.& .i'...
  65984. 8035203: eee6 48a0 fc2c 16b7 09d1 f664 e9d6 97ef ...H,.....d.....
  65985. 8035213: b581 eeb9 fd83 b581 8bad 9690 055a 6907 ............Z..i
  65986. 8035223: 0874 ca96 5645 175c 3060 ac30 7f5b 1219 t...EV\.`00.[...
  65987. 8035233: dd73 234d 4391 3a43 22ae 0bd8 26ad 1de2 s.M#.CC:."...&..
  65988. 8035243: 4710 ee25 4852 b0d0 9bd8 49a6 a45c 4199 .G%.RH.....I\..A
  65989. 8035253: d815 f980 2986 0565 e88d 57b9 41d1 e1a3 .....)e....W.A..
  65990. 8035263: 127c 2ad8 20e9 4f12 50e2 89ac 4b2c 8381 |..*. .O.P..,K..
  65991. 8035273: 60cd 1509 f500 9d9f 7c7d a7fa 8fb3 0a70 .`......}|....p.
  65992. 8035283: bbd6 1ff7 d9f2 c05a ce32 899b 2be5 e51c ......Z.2....+..
  65993. 8035293: 7c97 9f0e 6cae 07ae 610a 29df 6ada 1270 .|...l...a.).jp.
  65994. 80352a3: 48d2 586e 0d8d aeaf 1ab6 de2d 86ca a40b .HnX......-.....
  65995. 80352b3: 47d7 a077 2154 e93b 0c74 68b9 86db c1e2 .Gw.T!;.t..h....
  65996. 80352c3: 4e99 c1ff c49f 86d0 c3b0 ac94 3df0 054c .N...........=L.
  65997. 80352d3: 1b11 85ed 74e9 c73a 1d19 5ec2 a80a 20f5 .....t:....^...
  65998. 80352e3: 0b8b 6b51 a90e ea79 3e27 eb88 7df6 abb6 ..Qk..y.'>...}..
  65999. 80352f3: 86cc 684b b511 972e 32d1 96a4 e678 5147 ..Kh.....2..x.GQ
  66000. 8035303: a786 3d11 0e8d 6bf0 7b2c fbe6 1df8 2d7b ...=...k,{....{-
  66001. 8035313: 2734 0cc5 f7d4 9e24 05a1 5f8a 6a4b 89bc 4'....$...._Kj..
  66002. 8035323: 21c6 3b1a 3aac 7445 dc7c fb52 b710 d3ef .!.;.:Et|.R.....
  66003. 8035333: 22bc 5bcf d743 6eb6 5fdf d9c3 0e7d 7a9e .".[C..n._..}..z
  66004. 8035343: 5386 8795 ccc9 67fb d63e 4ecf b53f 0c1d .S.....g>..N?...
  66005. 8035353: 818e c741 9c5d b462 c538 216f 7e2c fa77 ..A.].b.8.o!,~w.
  66006. 8035363: 97a7 1c0c f6bb a7e9 e9d6 93bf 38b8 82fd .............8..
  66007. 8035373: 4a7e 2071 c9c5 6af3 65d1 86ab f558 3ff4 ~Jq ...j.e..X..?
  66008. 8035383: 6c59 f0b0 1eb0 bdde df73 a8da 9506 5e90 Yl......s......^
  66009. 8035393: cc9b 5a20 3061 fcc3 7305 0fda 6c70 8dd6 .. Za0...s..pl..
  66010. 80353a3: d8ea b616 1b56 b810 7bf6 a274 1c2f e151 ....V....{t./.Q.
  66011. 80353b3: 5a33 160a 788e 9561 8c6a 3a58 4406 8e50 3Z...xa.j.X:.DP.
  66012. 80353c3: 2b89 b0c1 7f88 eec3 0529 b48f 4a1d 3ff5 .+......)....J.?
  66013. 80353d3: a189 95fd 6419 001a e9f6 807f 4957 7fa6 .....d......WI..
  66014. 80353e3: be0a 8e7d fb53 1208 c214 4719 6907 e90c ..}.S......G.i..
  66015. 80353f3: b76f b683 62bd ebbb 6d3f ba5d d3ba bb5d o....b..?m]...].
  66016. 8035403: 7bba 097c ae7f e2ec 1f9f 1eee 74ef 7637 .{|..........t7v
  66017. 8035413: fc07 ff93 3819 3a8f 37ff 2efd c3ac cbe4 .....8.:.7......
  66018. 8035423: 32c9 e27e e64f 19c2 74ac c47b 781c 9c52 .2~.O....t{..xR.
  66019. 8035433: 16bb 4fa4 0cc1 0b35 0c07 61b3 bab0 edc6 ...O..5....a....
  66020. 8035443: ec36 9156 f0f9 48b5 979a e556 c7d7 27ee 6.V....H..V....'
  66021. 8035453: 9f44 7b50 3d7f 98fb e794 317f 49a2 fe69 D.P{.=.....1.Ii.
  66022. 8035463: d41a 2ace 2ff3 79a0 7d52 429f 7df1 be80 ...*./.yR}.B.}..
  66023. 8035473: 66d0 439f 7cf9 fa79 d247 5280 4adf fac5 .f.C.|y.G..R.J..
  66024. 8035483: ee5b 11f3 dc49 f4e7 ecf6 6777 c3bf dcc1 [...I.....wg....
  66025. 8035493: 4f9d 9103 fb95 54de c1cf 8177 3b87 7271 .O.....T..w..;qr
  66026. 80354a3: 7fc7 284a 1ca8 17b3 0121 cc62 0f87 7243 ..J(....!.b...Cr
  66027. 80354b3: ef32 e34c 9e24 a7ce 6410 9b46 94ff 48db 2.L.$....dF....H
  66028. 80354c3: 059c 9824 cd0c 0128 7c86 b583 48a2 6c55 ..$...(..|...HUl
  66029. 80354d3: 068d c8ad cc14 ffa7 6842 3529 33fd 6ecb ........Bh)5.3.n
  66030. 80354e3: 6d87 0208 1858 f1a4 02bf 6062 908a f0b5 .m..X.....b`....
  66031. 80354f3: 5921 1a12 d459 904f 7ff4 3921 2444 415d !Y..Y.O...!9D$]A
  66032. 8035503: bd10 d6d1 dbf0 4bae 10a6 13ec 3bac f57c .......K.....;|.
  66033. 8035513: 6975 eeef 9178 6bd7 e902 0915 1e12 faef ui..x..k........
  66034. 8035523: 894f fd29 9fb5 5b5d c7fb f6dd 7585 d68d O.)...][.....u..
  66035. 8035533: 04ba 5b20 1a07 901b d382 244d 2842 b993 .. [......M$B(..
  66036. 8035543: d446 47f9 7b45 5920 8674 f890 8482 97c4 F..GE{ Yt.......
  66037. 8035553: cad4 1656 ef89 74e7 6404 7da5 7641 ec20 ..V....t.d.}Av .
  66038. 8035563: 0b3b fe54 ecfc 889f 6da8 fa37 d80e 9f33 ;.T......m7...3.
  66039. 8035573: d307 78b8 fa13 8738 861a 277a ae43 9f65 ...x..8...z'C.e.
  66040. 8035583: 827e b0e5 b4ae a521 7849 1bf6 d502 8b22 ~.....!.Ix....".
  66041. 8035593: 4093 7fc4 ce00 5db4 d0d9 f224 4ca8 3fd5 .@.....]..$..L.?
  66042. 80355a3: 26d3 b606 d303 6a41 b5d5 8138 2cfa b51f .&....Aj..8..,..
  66043. 80355b3: d592 be14 7973 d257 692c 2864 d961 f15d ....syW.,id(a.].
  66044. 80355c3: db9d 1b34 3406 3529 4542 e475 e04e 99b1 ..4..4)5BEu.N...
  66045. 80355d3: 7ae6 01dd b170 d33f 6bce 07f8 6f4e 3519 .z..p.?..k..No.5
  66046. 80355e3: ef4b 3b56 ca3b 31d3 1c04 0782 8fd1 bcef K.V;;..1........
  66047. 80355f3: 3373 4525 3158 3f75 54f2 05a4 df2f 8a2e s3%EX1u?.T../...
  66048. 8035603: 03d9 2319 5018 a580 d4de a6a3 086b 3d49 ...#.P......k.I=
  66049. 8035613: 3f11 17be 863c da89 efb2 61c4 e696 b0e9 .?..<......a....
  66050. 8035623: 50e8 eddf fbed 4430 6022 2449 c0ad d9f5 .P....0D"`I$....
  66051. 8035633: e126 51a8 8d1f 1909 874d f939 72f1 9ebf &..Q....M.9..r..
  66052. 8035643: 7936 a471 3c57 ea2f 0770 e8f6 7981 0681 6yq.W</.p....y..
  66053. 8035653: 3cea ddcf dd4b e7ae 4189 766b dd10 6fce .<..K....Akv...o
  66054. 8035663: 59a4 b586 7bb9 833e 11b8 70db 5df8 4f5b .Y...{>....p.][O
  66055. 8035673: af06 38a9 899c 6874 ab85 21ab fd09 61c9 ...8..th...!...a
  66056. 8035683: 822b 0ecb e6ac 2229 932d d474 6fb2 a9b1 +.....)"-.t..o..
  66057. 8035693: 130b e012 f0e6 cd7b 07e0 4d1b dff7 a9bb ......{....M....
  66058. 80356a3: 3e0d dc69 7161 1f1c 18ab db78 0c0b 4a16 .>i.aq....x....J
  66059. 80356b3: 0f2a 819c 6981 a79b 48c2 39f2 3306 13c4 *....i...H.9.3..
  66060. 80356c3: d20e 7e0c 1b57 c5a6 7bfd b70f 572b 6b14 ...~W....{..+W.k
  66061. 80356d3: d2f9 bd09 7f0d 18be 39c7 51b0 cf6d 3771 .........9.Qm.q7
  66062. 80356e3: 6010 4263 29e2 9ddf 26c1 f715 2131 1491 .`cB.)...&..1!..
  66063. 80356f3: 3607 a3ca 8f67 249a 984f 93ce 9102 64b8 .6..g..$O......d
  66064. 8035703: 8fb1 8472 1ecb e02d 9fc7 91c0 4f01 1efd ..r...-......O..
  66065. 8035713: 418c 1bfe dd98 06b0 d058 da2e 300b 9d97 .A......X....0..
  66066. 8035723: 4e1e e107 1943 1c2a 69e8 213e 94ae 1d7e .N..C.*..i>!..~.
  66067. 8035733: 6073 ab35 cdfd d2d7 0c87 5f9b aded 920a s`5........_....
  66068. 8035743: ed5c 91c3 f605 1060 93fb ee96 c409 952a \.....`.......*.
  66069. 8035753: 0c02 ab06 3eab 5d60 e2e9 4290 ea36 6581 .....>`]...B6..e
  66070. 8035763: af3a ac16 9ee7 b0ea 1d42 8040 2f8a 9eca :.......B.@../..
  66071. 8035773: 89d2 075c 0785 785b ac1f 95ad 5e48 8d83 ..\...[x....H^..
  66072. 8035783: 5509 3c0c 5157 c0a4 4e0d 0a5c 5640 9d42 .U.<WQ...N\.@VB.
  66073. 8035793: 728c b019 8e72 3e70 1b75 0f9d 5b57 14fd .r..r.p>u...W[..
  66074. 80357a3: bcd4 2056 1940 b7c0 18a7 ee4e 1307 d911 ..V @.....N.....
  66075. 80357b3: f56e a1d3 c9d5 782f bed5 9f53 873c e957 n...../x..S.<.W.
  66076. 80357c3: f08d e616 612e c4c9 7d34 9622 5381 f0c1 .....a..4}"..S..
  66077. 80357d3: 3e92 ed6a f417 d032 2714 54c3 63d9 b70d .>j...2..'.T.c..
  66078. 80357e3: b40b 58cc 5c96 3ec8 3e97 ec1e f34c 9326 ...X.\.>.>..L.&.
  66079. 80357f3: 94fe 6302 6365 9864 6a16 616a d6aa e44b ...cecd..jja..K.
  66080. 8035803: 201d 01f4 46bd 8f7a e2b4 afd9 0ad9 48c7 . ...Fz........H
  66081. 8035813: f5c3 8fa9 1701 85c3 e781 1a44 3d87 2f98 ..........D..=./
  66082. 8035823: 17f1 0876 6a1b 5ecf 1e3a cc8e bfe9 c461 ..v..j.^:.....a.
  66083. 8035833: f05f 523f f05e c1a3 8879 1862 8d23 f460 _.?R^...y.b.#.`.
  66084. 8035843: 8079 92bf da95 0a30 591e 1664 ff4c d83f y.....0..Yd.L.?.
  66085. 8035853: f005 5675 6ffc b464 5d4b 1b7a 02e4 ff2e ..uV.od.K]z.....
  66086. 8035863: 8c4e e782 7f70 2cf8 19e4 7d9e 8d2c 2682 N...p..,...},..&
  66087. 8035873: 0e45 6240 74e4 3b52 14b1 275b 6fad 98a6 E.@b.tR;..['.o..
  66088. 8035883: b491 d1f8 7bc3 ff77 b497 fdb2 2dd6 1d68 .....{w......-h.
  66089. 8035893: ccd6 a8a4 a85f 4993 fb73 e8ae ea2f bf66 ...._..Is.../.f.
  66090. 80358a3: 9ba1 99a1 4784 a0bb 4aa0 602e d7b8 5795 .....G...J.`...W
  66091. 80358b3: 12d0 80a4 ab21 2a97 4a5c bd58 bb75 e494 ....!..*\JX.u...
  66092. 80358c3: a86e 12c8 1661 41c8 d78e fb41 2441 de87 n...a..A..A.A$..
  66093. 80358d3: 3ed7 9865 32b2 f864 190b 6461 4fc3 b5ea .>e..2d...ad.O..
  66094. 80358e3: c0cf 9f7a fc73 0d81 65d8 a106 02e3 2086 ..z.s....e.....
  66095. 80358f3: bf4d 1025 d3ca c67b 35ce 415c ac98 527f M.%...{..5\A...R
  66096. 8035903: 2ce0 b989 057c c3a2 73c2 f1d6 6edf d8f7 .,..|....s...n..
  66097. 8035913: 1fe1 8c20 3428 cca7 b25e 2984 fa7e 4d1c .. .(4..^..)~..M
  66098. 8035923: 9c5f b07d e634 ebc3 c887 7c99 b6e7 2061 _.}.4......|..a
  66099. 8035933: 436d 0a93 9891 fb61 8c8b 1ec5 62e5 6eac mC....a......b.n
  66100. 8035943: 31a5 4e41 34fe 207f 6e90 c7ca 7260 2ccd .1AN.4. .n..`r.,
  66101. 8035953: fd36 d3c8 ed84 bb2a c77d c62f cc9d da47 6.....*.}./...G.
  66102. 8035963: 0a71 bacb fd54 4f48 4918 15a2 9ae4 44e2 q...T.HO.I.....D
  66103. 8035973: 0dec 78fd ba42 6653 08a4 8dd5 e94e 1ec1 ...xB.Sf....N...
  66104. 8035983: ae65 a590 6ee2 632a 1d45 ea31 0dda 7c30 e....n*cE.1...0|
  66105. 8035993: e5a5 996b 6bb9 1c37 a3f2 b13e 8ecb ce66 ..k..k7...>...f.
  66106. 80359a3: 58c9 207e 4ff3 17c8 ecf5 5def 74ba 0789 .X~ .O.....].t..
  66107. 80359b3: 7cdc ccc1 cd37 b999 d7e3 5999 ebe5 07ce .|..7......Y....
  66108. 80359c3: 755c e860 19ff 8f8a afe0 7d06 a59d 4a74 \u`........}..tJ
  66109. 80359d3: fcf0 74b5 da8f ba62 8491 91a9 7ba6 ca19 ...t..b......{..
  66110. 80359e3: 7790 7f3c bc21 35a4 cfbe 91bb 1b3d c373 .w<.!..5....=.s.
  66111. 80359f3: d3f0 f651 27a5 2a02 94a0 f9e6 a84b d50e ..Q..'.*....K...
  66112. 8035a03: d532 e688 2552 2d4d a95d 9a4a bf9e d558 2...R%M-].J...X.
  66113. 8035a13: d687 effb 6f4f 63a8 e9d2 05d6 51dc f60e ....Oo.c.....Q..
  66114. 8035a23: fba5 04a3 1eed 6865 5fcf 3698 7655 63e3 ......eh._.6Uv.c
  66115. 8035a33: 04e3 2f0b 7b5f 00b7 a4c1 a562 dba5 27f6 .../_{....b....'
  66116. 8035a43: 367e 2dad 77ec cdb8 179d 7de1 7de2 9044 ~6.-.w.....}.}D.
  66117. 8035a53: 73f0 b399 378c 5c4b a6e8 8cef 0d5e da6f .s...7K\....^.o.
  66118. 8035a63: 0765 994a 2ee1 0bf4 0c95 fe80 355a 2359 e.J.........Z5Y#
  66119. 8035a73: f72d 289a c2e9 2031 a425 1c1d 4fc4 f629 -..(..1 %....O).
  66120. 8035a83: b140 9852 307d e102 512e fb14 884b dff4 @.R.}0...Q..K...
  66121. 8035a93: 7168 91cb 9854 1f76 3e9e c0eb 3873 b97f hq..T.v..>..s8..
  66122. 8035aa3: f0ab e014 554b 6fa2 c79a 89e2 72c8 04d3 ....KU.o.....r..
  66123. 8035ab3: 2e56 e249 893f 3e47 4372 141d 6477 46d7 V.I.?.G>rC..wd.F
  66124. 8035ac3: 74b0 a3e1 10fa 914b 7a78 d90f 3bc3 6f0f .t....K.xz...;.o
  66125. 8035ad3: 42df 8715 a352 286b 400b 73f6 a8c9 d4ce .B..R.k(.@.s....
  66126. 8035ae3: c22f 6b71 3b7d 238b d24c 2d79 f27b b7a8 /.qk};.#L.y-{...
  66127. 8035af3: f1b1 b3a8 51ce 95d4 0a8d 401c c9ce d84a .....Q.....@..J.
  66128. 8035b03: a60f d61c accd 6aa6 82e8 3108 1f12 38d2 .......j...1...8
  66129. 8035b13: 8c07 1b65 98c9 1a66 eca5 7f55 5d41 7217 ..e...f...U.A].r
  66130. 8035b23: 652b c6df ea1b 2e5c e882 d97b 6aaf 75ac +e....\...{..j.u
  66131. 8035b33: b041 b17d 65cb 52ea 403a 58ec 7e10 2739 A.}..e.R:@.X.~9'
  66132. 8035b43: af43 efd8 cdd2 03a3 2139 57bb 91ba 1e3c C.......9!.W..<.
  66133. 8035b53: ae6a 793b 8498 5c1a 47fa e093 2a12 b746 j.;y...\.G...*F.
  66134. 8035b63: ad25 3527 7efc 320b c934 e1ec 4e2c a7ae %.'5.~.24...,N..
  66135. 8035b73: e91c b145 1510 250a 2aa3 c284 5ef4 1695 ..E....%.*...^..
  66136. 8035b83: eb40 c4aa 2a82 723a 0e5c a855 afc0 0c17 @....*:r\.U.....
  66137. 8035b93: de82 89d1 736b c4e9 545d 4099 588b 0f66 ....ks..]T.@.Xf.
  66138. 8035ba3: 35a4 c7cc d94e b3d1 0973 9808 5004 d988 .5..N...s....P..
  66139. 8035bb3: 46cb 1f52 9e0f b219 617a f53c f927 06cb .FR.....za<.'...
  66140. 8035bc3: 7ee8 f21e 6464 86d9 7240 9fb5 fafc b6e1 .~..dd..@r......
  66141. 8035bd3: 223f 4990 cdf3 10e6 7d87 6b0a 0ae8 81a8 ?".I.....}.k....
  66142. 8035be3: 9b84 555f 68f8 5ae4 40d4 1389 0670 b61c .._U.h.Z.@..p...
  66143. 8035bf3: e639 9263 8268 a837 81e1 f4bb 0aba 189d 9.c.h.7.........
  66144. 8035c03: 212a 9649 b0a0 903e f47a b490 2174 8d38 *!I...>.z...t!8.
  66145. 8035c13: 0e02 9c9e a1c1 955a 09ea 5bd5 dddd 7c06 ......Z....[...|
  66146. 8035c23: 808b 97d4 b090 7355 6e48 2471 5116 a55c ......UsHnq$.Q\.
  66147. 8035c33: e1d3 640d b150 900c d518 7ae0 6771 1d8a ...dP......zqg..
  66148. 8035c43: a656 dd95 a386 1f52 d72d 6444 c5f0 8a6b V.....R.-.Dd..k.
  66149. 8035c53: a8fa 7617 0246 5cd6 ad73 a6b9 d420 6496 ...vF..\s... ..d
  66150. 8035c63: f6da 446c 6bcb 2b18 01df f2f8 b7b7 4bbc ..lD.k.+.......K
  66151. 8035c73: 7edb 6677 c163 f797 49bb 3b61 5079 d7c8 .~wfc....Ia;yP..
  66152. 8035c83: 7ade e902 4efc 9a0c b287 8e37 b5d3 29a7 .z...N....7....)
  66153. 8035c93: c054 58c1 8988 8dea 677c 1134 a877 3df9 T..X....|g4.w..=
  66154. 8035ca3: 766a 7677 b2c9 857e 6ea9 bbde c3c3 221e jvwv..~..n....."
  66155. 8035cb3: 3ba4 f6f9 edd3 438b 3d8e 95ca 5825 277f .;.....C.=..%X.'
  66156. 8035cc3: 690e af63 130e 9926 f4c1 6bcf c39b f72c .ic...&....k..,.
  66157. 8035cd3: f1a9 4d6b 0733 f9e2 f250 9d22 879d a40e ..kM3...P.".....
  66158. 8035ce3: 1970 06a1 08e0 6741 bb85 42b3 1bf5 7e3c p.....Ag...B..<~
  66159. 8035cf3: 38e1 a0f4 b5af 0c02 578e 0780 e1e9 e0f3 .8.......W......
  66160. 8035d03: 4941 39e5 e8f0 af41 8f04 dcee e780 5944 AI.9..A.......DY
  66161. 8035d13: 391a 5a98 9d24 3883 c62a 6f9b febc 9843 .9.Z$..8*..o..C.
  66162. 8035d23: d03f b069 4a24 af53 761e 1766 9109 f9b7 ?.i.$JS..vf.....
  66163. 8035d33: 0c5a 0bb3 d29d 9c24 e1c4 57be 64fa f91c Z.....$....W.d..
  66164. 8035d43: 7f3c 8f02 2a33 f38b 540f a346 0b27 4ec6 <...3*...TF.'..N
  66165. 8035d53: 5564 9713 9057 8647 44aa 481a 919e 4eae dU..W.G..D.H...N
  66166. 8035d63: e7a4 87d2 4b29 a915 72b5 5c36 05b8 c2d4 ....)K...r6\....
  66167. 8035d73: 81de 60ae 86a4 8ed2 ca37 e519 9584 6db5 ...`....7......m
  66168. 8035d83: 3796 31ea 99a5 124c 8c99 7a5b aca1 555c .7.1..L...[z..\U
  66169. 8035d93: 4902 da2d 2cf5 21cb f1b9 74ba 313a cb14 .I-..,.!...t:1..
  66170. 8035da3: f193 a37e 26c8 a837 4c28 6e44 31e9 f67a ..~..&7.(LDn.1z.
  66171. 8035db3: 86f7 abc3 abdd 5b5d fdb5 d6e4 ef3b 7bdc ......][....;..{
  66172. 8035dc3: 9a8f 7ebb 4574 66e8 6e2e eb44 cbe5 d861 ...~tE.f.nD...a.
  66173. 8035dd3: e745 0625 ad45 174d 2110 59de a40b 192f E.%.E.M..!.Y../.
  66174. 8035de3: 30c7 1bb9 ad5d eb49 2ae9 c132 8acd e6a4 .0..].I..*2.....
  66175. 8035df3: 0d84 bc7b 9931 e399 2be9 a4e3 cb33 22d2 ..{.1....+..3.."
  66176. 8035e03: aca5 690e d66c 26aa a941 bef8 8ae1 a333 ...il..&A.....3.
  66177. 8035e13: fab2 ca53 c4ea 9c5d 694a 6ad9 8426 8c0b ..S...].Ji.j&...
  66178. 8035e23: a481 3d59 9cff 0d81 3018 56d2 ef49 9ea6 ..Y=.....0.VI...
  66179. 8035e33: 8727 e3c1 c4f8 f914 9e74 99bf 4726 0c54 '.......t...&GT.
  66180. 8035e43: 2e7c e3f3 182f 271e e18d a32a e18e 0dcc |.../..'..*.....
  66181. 8035e53: a828 f2dd f607 0d9a a07b d6af 03f4 322a (.......{.....*2
  66182. 8035e63: f656 430e 4b31 5a0f 5d1b 3a29 2034 34da V..C1K.Z.]):4 .4
  66183. 8035e73: f472 0cb0 15d9 94d4 16bf c2ca 3251 2297 r...........Q2."
  66184. 8035e83: e5af f9af 0fdf f59d b910 db7e e36e 8a37 ..........~.n.7.
  66185. 8035e93: 65af 67d2 b6b3 3d2f df5d c741 d22e 54ef .e.g../=].A....T
  66186. 8035ea3: 6e23 9660 0a0d 682f ed47 86fa b8f4 eead #n`.../hG.......
  66187. 8035eb3: eec0 1860 35db f094 9198 c297 b03a 8f44 ..`..5......:.D.
  66188. 8035ec3: 6db4 8a8e f0ec a088 a21b f252 e2c0 c82e .m........R.....
  66189. 8035ed3: 717b a539 1eed f305 5900 bc93 d487 e87a {q9......Y....z.
  66190. 8035ee3: a127 5098 0512 b04f 917f 81fd 33e3 0592 '..P..O......3..
  66191. 8035ef3: c3b6 8305 f482 922d f484 3607 10cc 4216 ......-....6...B
  66192. 8035f03: 345c c766 d0a4 27ab bec6 906a 86b6 4f28 \4f....'..j...(O
  66193. 8035f13: 425b 4d75 61f5 1f90 65a5 c8dd a815 d6b8 [BuM.a...e......
  66194. 8035f23: fca5 0a43 fa8a 9ab0 1d7d 138a 1304 7dea ..C.....}......}
  66195. 8035f33: c4c9 6241 e473 f8ee e4bb 62e2 9443 74e5 ..Abs......bC..t
  66196. 8035f43: 7505 c306 bf70 629b cfe8 c527 d9a0 5080 .u..p..b..'....P
  66197. 8035f53: 8fb5 2d10 28dd 9490 b54c 8430 11c7 2e1b ...-.(..L.0.....
  66198. 8035f63: 987d 0d5d 03a3 3453 909b 1de1 1152 a60d }.]...S4....R...
  66199. 8035f73: b882 d5f2 4109 26bc df94 f6c4 ec97 69be .....A.&.......i
  66200. 8035f83: 189d 77bb 4a8e ceab 24e7 f2b3 9034 a5ce ...w.J...$..4...
  66201. 8035f93: 286c 381f 5331 ad87 9b9d 5262 d2f8 654e l(.81S....bR..Ne
  66202. 8035fa3: 8d0d b9f0 66f9 c18b 448a 5881 eadf 4f2a .....f...D.X..*O
  66203. 8035fb3: 7550 cd93 709b d41e 748b a886 1361 af47 Pu...p...t..a.G.
  66204. 8035fc3: b486 f773 4ca8 da9d 2f06 00ff 8411 6c0e ..s..L.../.....l
  66205. 8035fd3: 1b9a 3a28 806c 3645 15da 1c78 bee7 09c7 ..(:l.E6..x.....
  66206. 8035fe3: 68bd b631 6a88 d1ab 0679 7aa8 fb1d ad19 .h1..j..y..z....
  66207. 8035ff3: ac47 63e3 fa53 c719 20a6 4761 0107 9c02 G..cS.... aG....
  66208. 8036003: a4e3 dc00 2bf4 ea84 3f51 c0a7 ff22 5d6c .....+..Q?..".l]
  66209. 8036013: cab9 8481 45f3 4add a19d 4895 d944 9537 .....E.J...HD.7.
  66210. 8036023: 5c52 9d79 b013 f38c e4a6 ead9 1f1e 5b07 R\y............[
  66211. 8036033: 95de ac1f 5eae 637d a28b df15 888c e297 .....^}c........
  66212. 8036043: 4f88 40de 8b8d 5984 5345 9d1d 455c 387d .O.@...YES..\E}8
  66213. 8036053: 6fa9 84b2 d794 bdaa 1955 7f89 1e48 5067 .o......U...H.gP
  66214. 8036063: 8df7 0bc8 aded b6d5 4d44 b092 6cd4 5520 ........DM...l U
  66215. 8036073: ba14 ed5f a12a 272b c243 d97d 9271 5a71 .._.*.+'C.}.q.qZ
  66216. 8036083: 0a41 d2ad 0880 5468 5996 1138 b67e 42ad A.....hT.Y8.~..B
  66217. 8036093: 0c57 ea80 5b0a d048 15a5 77e9 c6eb 8b65 W....[H....w..e.
  66218. 80360a3: 4849 e5cc 6488 1954 bc82 626d 89a0 36a5 IH...dT...mb...6
  66219. 80360b3: 9bae 77e4 247d e8ab 7d40 d2b8 858a afb4 ...w}$..@}......
  66220. 80360c3: 4beb a8df 9842 a0ea 90c0 28a8 e1b5 aea5 .K..B......(....
  66221. 80360d3: bfcb 9387 d714 3a13 7c3f dccd f707 552d .......:?|....-U
  66222. 80360e3: bd1b 9be9 b5af 843c d716 d058 1352 a9f1 ......<...X.R...
  66223. 80360f3: a3a0 7cd1 78b2 8e16 1eb4 fe6f eee4 7bde ...|.x....o....{
  66224. 8036103: aeb7 ea7b f1ef d1f1 5f49 eefd acb0 8ef7 ..{.....I_......
  66225. 8036113: f220 957a 6a54 c48a 3d72 a82e 5171 0f82 .z.Tj..r=..qQ..
  66226. 8036123: 186f ccc9 720d 1b5b 219d 212c 9ddb 5e93 o....r[..!,!...^
  66227. 8036133: 107d 9fdd 2258 713c c059 b995 6af2 f979 }...X"<qY....jy.
  66228. 8036143: 80cc 4f69 5070 ac9f c10e fe92 002f 6482 ..iOpP....../..d
  66229. 8036153: 4362 1382 f010 e309 80c2 2cb9 f0a6 8d51 bC.........,..Q.
  66230. 8036163: f7e2 2d14 aeb2 a6c1 2ae1 3ec1 de63 3f95 ...-.....*.>c..?
  66231. 8036173: cd21 2cf2 8254 517c 2ec4 72e1 1a93 5d95 !..,T.|Q...r...]
  66232. 8036183: d4d7 d054 2739 1734 caf1 0cfd 3e17 0a10 ..T.9'4......>..
  66233. 8036193: 9045 2794 b46b b399 a641 0db1 9d70 028d E..'k...A...p...
  66234. 80361a3: 03d4 24d0 2e27 de00 b066 bb6b 8244 60f3 ...$'...f.k.D..`
  66235. 80361b3: 718f 61dd 6814 8a23 aca2 6b72 733a b14e .q.a.h#...rk:sN.
  66236. 80361c3: 4ed5 f902 0dba 14f3 114c 11e0 2896 3494 .N......L....(.4
  66237. 80361d3: 9655 94c3 1587 a9a0 de4a f323 408e c6b3 U.......J.#..@..
  66238. 80361e3: 5a6a 43ed b265 332d c772 5b7d 9415 b598 jZ.Ce.-3r.}[....
  66239. 80361f3: ad4c 1b11 3739 f851 8ee3 8ca8 e883 35be L...97Q........5
  66240. 8036203: 9322 7f98 ed39 574b e770 f5ed fd2e 6f9f "...9.KWp......o
  66241. 8036213: 8dbe 51bd aafd 641b 1943 e10c 7f7b b2ea ...Q...dC...{...
  66242. 8036223: 489d 0042 eefb db83 8da8 4946 8015 8d47 .HB.......FI..G.
  66243. 8036233: bb66 1e35 eed4 8dcd 20c9 b76b 6a22 4985 f.5...... k."j.I
  66244. 8036243: 4636 531d 9b24 3504 f921 c7e6 dd09 93af 6F.S$..5!.......
  66245. 8036253: 438d cc6a 3b71 1325 9264 9a82 a900 efb1 .Cj.q;%.d.......
  66246. 8036263: 62ea 7819 b0c3 18c0 7530 70c3 ffbd 5f28 .b.x....0u.p..(_
  66247. 8036273: 011f 5c6c a316 878b 117c d611 c064 10d7 ..l\....|...d...
  66248. 8036283: 595d a478 dec3 717c d1d0 10b7 4d61 ec2e ]Yx...|q....aM..
  66249. 8036293: 93a9 19c3 6145 32af db5b ae1b 5b2e a082 ....Ea.2[....[..
  66250. 80362a3: e451 cc96 1327 8554 8989 aa01 982c 4903 Q...'.T.....,..I
  66251. 80362b3: 13c8 9424 114b 1cb8 ad9d 40c0 2051 11b1 ..$.K......@Q ..
  66252. 80362c3: 50d6 7214 81a3 755d 7075 570d d707 171a .P.r..]uup.W....
  66253. 80362d3: 8107 8ab9 de84 e22d 2809 535d 3d14 4c42 ......-..(]S.=BL
  66254. 80362e3: f9cd 581a 600d 1f75 5e4e b2fc d0a0 dc02 ...X.`u.N^......
  66255. 80362f3: 1af1 f9fb 83bd 9884 a506 875e 10ad 7c52 ..........^...R|
  66256. 8036303: dfc5 7709 9849 8fe3 e017 9c1f 05d3 a663 ...wI.........c.
  66257. 8036313: e392 adcb f362 20f5 09f0 4938 b403 8f0d ....b.. ..8I....
  66258. 8036323: e4c3 2d3a 2ca1 141f b525 222e 1253 398d ..:-.,..%.."S..9
  66259. 8036333: a558 907a 3a72 8be0 7b34 e463 f023 78d6 X.z.r:..4{c.#..x
  66260. 8036343: 3e3a 53d6 bc41 a12b 6b8e 6c2f 822a d023 :>.SA.+..k/l*.#.
  66261. 8036353: 78d9 a73a 5933 b2f1 fd23 746a 7c82 2748 .x:.3Y..#.jt.|H'
  66262. 8036363: b83b 1807 b2ed 09c5 4309 e8bd 2066 76e4 ;........C..f .v
  66263. 8036373: 8b29 c9d0 fac3 2d64 9f2a 3bd4 8902 c313 ).....d-*..;....
  66264. 8036383: 24f7 f8e9 49b8 4559 e5ea f839 cb5a e874 .$...IYE..9.Z.t.
  66265. 8036393: 90c4 d1ac 62f8 0319 d7f2 12cf a033 dd77 .....b......3.w.
  66266. 80363a3: 0840 7b25 1e5c 2b71 4972 cc7a d567 a909 @.%{\.q+rIz.g...
  66267. 80363b3: 8683 b653 4bb3 568e a744 3d7c 0f4b 1a90 ..S..K.VD.|=K...
  66268. 80363c3: 387a cd9f 1452 39f5 af15 890d 3c93 3c48 z8..R..9.....<H<
  66269. 80363d3: 46be ef9c 770c 43fb bd5c 3b0c 9e61 3aa3 .F...w.C\..;a..:
  66270. 80363e3: c3ae 94d9 9487 7d83 f088 d161 17e2 2b70 .......}..a...p+
  66271. 80363f3: 11d0 48f7 4d71 8a30 0994 dae2 3954 2b57 ...HqM0.....T9W+
  66272. 8036403: 4461 2b91 2fdf 6586 17d0 4c70 3efa 26a6 aD.+./.e..pL.>.&
  66273. 8036413: 2ccf 25c2 1f60 45a4 bca4 9e00 17b9 e785 .,.%`..E........
  66274. 8036423: 8873 756d c975 2a8b bf74 6aba 6fc3 4315 s.muu..*t..j.o.C
  66275. 8036433: f964 7b23 9745 9681 0082 5e54 6f0e e7ea d.#{E.....T^.o..
  66276. 8036443: e3e3 55ea cce5 2ce8 a218 a640 541a 9557 ...U...,..@..TW.
  66277. 8036453: fc05 081f 376b 1f76 fbbb c4ee ba9d 9b89 ....k7v.........
  66278. 8036463: 32a2 e886 dc28 6775 49f8 99b2 f07c 71d0 .2..(.ug.I..|..q
  66279. 8036473: 87df c0ea bbe3 de0f d229 7db7 3354 cae8 ........)..}T3..
  66280. 8036483: a735 594f bc4e 5762 cdec 9d2c fdfe b51c 5.OYN.bW..,.....
  66281. 8036493: ea07 327a a646 9706 0f60 5a13 a282 9242 ..z2F...`..Z..B.
  66282. 80364a3: 3056 5d37 9a07 a60e c9bd c260 5834 f3de V07]......`.4X..
  66283. 80364b3: e8ce bc1c 4ed9 dbb6 70cf a012 118e 775c .....N...p....\w
  66284. 80364c3: ba94 1fe3 ce2a c1af 6503 c895 0636 8f0f ....*....e..6...
  66285. 80364d3: 4882 bc69 faba e7be b10d f430 050f 23cb .Hi.......0....#
  66286. 80364e3: 750f 7bf7 767b 721b 0e19 b934 63e0 bb8c .u.{{v.r..4..c..
  66287. 80364f3: 6f00 b95a 39d5 f438 a431 63d4 5d0f de30 .oZ..98.1..c.]0.
  66288. 8036503: 79a7 d06e da75 e216 d28d 03bb a85a dac0 .yn.u.......Z...
  66289. 8036513: 8578 413b d5f2 5c7d e5ec ebe2 a3b4 cb38 x.;A..}\......8.
  66290. 8036523: a7db 2499 61f1 0e06 1a29 c784 f175 728a ...$.a..)...u..r
  66291. 8036533: 294a 4381 6942 38ef b83d 0141 1148 42b5 J).CBi.8=.A.H..B
  66292. 8036543: 3d94 2005 f840 40cc 49d9 1d8c a5d1 0b85 .=. @..@.I......
  66293. 8036553: 3db8 dbcd d989 914b c15b 41ef 7f6b 7575 .=....K.[..Ak.uu
  66294. 8036563: 391f 745f 4f04 2041 90dd 8e6c f689 fec9 .9_t.OA ..l.....
  66295. 8036573: 0900 db2d f993 b1a6 9c25 dea4 ec50 56f4 ..-.....%...P..V
  66296. 8036583: ff30 0063 cc61 4064 18f3 2131 5303 ace6 0.c.a.d@..1!.S..
  66297. 8036593: abd4 2d7a 65b1 8d4c 2957 4309 5e96 eb52 ..z-.eL.W).C.^R.
  66298. 80365a3: 0d12 5c56 eba6 2905 c0d6 0808 16f8 8af9 ..V\...)........
  66299. 80365b3: 8a70 e431 c586 14a1 8faa d96e 5377 ce0b p.1.......n.wS..
  66300. 80365c3: 9504 5a52 8a53 2098 6839 9815 144c 3fb8 ..RZS.. 9h..L..?
  66301. 80365d3: 0d6a 4c29 41d4 0480 b584 4e90 dc63 34c8 j.)L.A.....Nc..4
  66302. 80365e3: 4616 e220 208b 3dbe 5e47 8401 6665 96d6 .F .. .=G^..ef..
  66303. 80365f3: aa2e 5846 32b8 e42e a432 8ac2 bc31 5e1a ..FX.2..2...1..^
  66304. 8036603: 169d a2d5 7382 445a 4aca 552b 00f2 57a1 .....sZD.J+U...W
  66305. 8036613: 3b32 220c 90a8 2880 6956 7970 4943 0201 2;."...(VipyCI..
  66306. 8036623: 219c 17d9 7152 6a6c d01f 750c 8a47 24c7 .!..Rqlj...uG..$
  66307. 8036633: a184 d63b 5a07 0823 0cc9 f3b5 13eb 349b ..;..Z#........4
  66308. 8036643: 1a4e a888 bc51 9ee2 f498 e364 8c1c 582d N...Q.....d...-X
  66309. 8036653: 6330 162f 8416 045c 2c2b 1611 2ad8 630d 0c/...\.+,...*.c
  66310. 8036663: c0e8 3ac8 8b88 6131 63a8 5471 7e95 c45a ...:..1a.cqT.~Z.
  66311. 8036673: 16c2 4292 73b2 e74c b5a5 0959 87bd d79d ...B.sL...Y.....
  66312. 8036683: 0c84 c515 8feb 0c48 c4e9 a6c6 d57a 40d8 ......H.....z..@
  66313. 8036693: 3d81 a3d4 9034 a721 46c2 09d8 876a 756c .=..4.!..F..j.lu
  66314. 80366a3: 40d7 8559 eaff 820a 4124 0279 4598 24f1 .@Y.....$Ay..E.$
  66315. 80366b3: 9162 5088 e151 64b1 6432 ea59 60ec 2cbe b..PQ..d2dY..`.,
  66316. 80366c3: 8aa5 8664 5913 21e3 63e5 24b5 6942 131c ..d..Y.!.c.$Bi..
  66317. 80366d3: ba61 890f 9062 3f9e dbd8 4506 1a49 e446 a...b..?...EI.F.
  66318. 80366e3: f22d 41f0 f909 0c1d 8d17 a15a d691 b48c -..A......Z.....
  66319. 80366f3: 64ae 93fb 169e cfed aa1e 34c4 6a5d 93fb .d.........4]j..
  66320. 8036703: 153e be70 a9d9 42cf 0eda d625 a80d b421 >.p....B..%...!.
  66321. 8036713: 6e18 56e2 db96 40cb ef87 7910 65c3 8fa0 .n.V...@...y.e..
  66322. 8036723: f418 6ed1 247f 0035 5ef1 33b4 85da 2375 ...n.$5..^.3..u#
  66323. 8036733: 45ab 3660 d813 d447 fe48 8f40 77c2 fb74 .E`6..G.H.@..wt.
  66324. 8036743: 71e2 908a 9833 e9d6 a807 d8c7 a13f a2d0 .q..3.......?...
  66325. 8036753: 5e20 1171 95fd 1cfd 0379 6717 9f26 55f1 ^q.....y..g&..U
  66326. 8036763: 6c01 42a1 b82b 3686 dae6 9b28 9987 52f8 .l.B+..6..(....R
  66327. 8036773: c8cb 74b0 177c 25aa 1a9e e088 cefb 2d52 ...t|..%......R-
  66328. 8036783: d656 8757 693a c39c c339 4b53 c3c7 7fd7 V.W.:i..9.SK....
  66329. 8036793: 28fa 1f6f bfe3 eb0b 2d23 882e f0aa 01e5 .(o.....#-......
  66330. 80367a3: 0178 cb81 494e 8b82 b839 f829 2133 ae67 x...NI..9.).3!g.
  66331. 80367b3: d3d6 d262 7f5b 6394 730e 5e0a 7025 a9ca ..b.[..c.s.^%p..
  66332. 80367c3: 46e8 492a ad1a aae6 5849 1135 85d5 bcec .F*I....IX5.....
  66333. 80367d3: 103d 5ba3 674f fb2d a3d1 2f80 d15d d75f =..[Og-..../]._.
  66334. 80367e3: 5dae 54d1 1977 5243 2497 4b3e 441b 9beb .].Tw.CR.$>K.D..
  66335. 80367f3: 726a 21e6 8343 33d2 28ce f230 0acb 4623 jr.!C..3.(0...#F
  66336. 8036803: 6a13 70c7 8e73 4fc2 0706 e635 ba34 3b83 .j.ps..O..5.4..;
  66337. 8036813: 181b e732 606f 6a40 4a9b 970e a03a 9f9a ..2.o`@j.J..:...
  66338. 8036823: 2563 927c e628 841d 7c65 d203 26a3 cbc2 c%|.(...e|...&..
  66339. 8036833: faa1 cf6c 4f7b 39ae 6e9c ef44 ab5e 703e ..l.{O.9.nD.^.>p
  66340. 8036843: c113 0618 930d ab26 1ca1 5a64 1ca2 5016 ......&...dZ...P
  66341. 8036853: 4e63 015d d012 ebad 7f6e 8608 ae60 07c1 cN].....n...`...
  66342. 8036863: e863 2982 573d 85a8 12f1 6675 1873 d472 c..)=W....ufs.r.
  66343. 8036873: a95e 7623 9773 7299 1c35 4420 d5c5 2a32 ^.#vs..r5. D..2*
  66344. 8036883: a282 c16d 933e 1b8a 4691 c2a5 3f58 610b ..m.>....F..X?.a
  66345. 8036893: e93f 255f 52cb 1745 3ed2 fc47 1ed5 a4ee ?._%.RE..>G.....
  66346. 80368a3: cc44 ea06 a527 5af4 a435 c097 c266 b11d D...'..Z5...f...
  66347. 80368b3: 17db 0452 82c0 93c3 89ee f88f 91b8 82fc ..R.............
  66348. 80368c3: b60f df44 d1ea 0c12 95bf c278 7b67 7bc8 ..D.......x.g{.{
  66349. 80368d3: 8d2f 6357 742f c971 0588 76d5 e142 ba12 /.Wc/tq....vB...
  66350. 80368e3: 0336 8707 b03e aaa2 bed3 0b47 b47a 7087 6...>.....G.z..p
  66351. 80368f3: 65a0 3223 4e34 d02f 1a4c 6af1 436f bd73 .e#24N/.L..joCs.
  66352. 8036903: 42f2 79c8 b029 2199 3580 0904 cfe4 3712 .B.y)..!.5.....7
  66353. 8036913: 8d14 1b71 8e0e 80b1 b416 9600 00ee 0c6d ..q...........m.
  66354. 8036923: da2e 54d6 b144 e28f ce24 db83 fad6 a3d6 ...TD...$.......
  66355. 8036933: 62e4 a2ef 7fcd 2fab f041 ad9c 8f8b 4d92 .b...../A......M
  66356. 8036943: 1854 5bef 53b8 2184 43e4 e4e5 d943 fbea T..[.S.!.C..C...
  66357. 8036953: 1713 3521 a829 4156 60f0 7c8e 6954 1ab1 ..!5).VA.`.|Ti..
  66358. 8036963: 42b2 d003 7f58 62eb decf 97b2 cbad 59ab .B..X..b.......Y
  66359. 8036973: 2294 6cf5 00fa 3ace 39dc 9f1b 21aa 8d41 .".l...:.9...!A.
  66360. 8036983: d70f 2c10 8b5b 1822 511a 6eaf e405 97a0 ...,[."..Q.n....
  66361. 8036993: f44f 9465 21f2 97d0 3413 1186 1fac 47d0 O.e..!...4.....G
  66362. 80369a3: f816 dd3e 9f81 e425 50e0 b6fd 3159 5348 ..>...%..P..Y1HS
  66363. 80369b3: 01a8 078f 3c01 e157 d592 c1bb 2689 e67c .....<W......&|.
  66364. 80369c3: 73a9 8220 b8fd 1750 af0e cae1 c730 f8f1 .s ...P.....0...
  66365. 80369d3: 44eb 056c 13e0 f443 a2b9 9bc6 57a1 4a2b .Dl...C......W+J
  66366. 80369e3: def0 fd78 7407 0479 d751 b791 8ad2 5756 ..x..ty.Q.....VW
  66367. 80369f3: 5ac9 ecc1 7108 9dd0 8a4b 0df9 3656 0728 .Z...q..K...V6(.
  66368. 8036a03: e318 6450 0cac 7e31 ce2b 40ad 3d90 108b ..Pd..1~+..@.=..
  66369. 8036a13: 0444 ca23 2df2 e3dc 8bc8 88b8 64e7 c273 D.#..-.......ds.
  66370. 8036a23: 5fa5 bcb2 e115 9165 73a2 1f30 bdb1 bb05 ._....e..s0.....
  66371. 8036a33: be34 d0f7 1d7a b80d 0cd2 1723 cf5e 2aea 4...z.....#.^..*
  66372. 8036a43: a5fc 26b1 2048 a4e2 25c4 aa7d a8eb bc16 ...&H ...%}.....
  66373. 8036a53: 3f37 65dd f37c e287 107c 07bd 2608 5584 7?.e|...|....&.U
  66374. 8036a63: f902 f6fd ebc6 53a0 753d 1fb5 c2f3 df9b .......S=u......
  66375. 8036a73: df7a 4223 d70b 6302 61e5 1e75 b2d7 3fcc z.#B...c.au....?
  66376. 8036a83: 7434 30e8 a09e 1ddc 8f1e efe7 28a0 f793 4t.0.........(..
  66377. 8036a93: b76d 5dd3 8264 1276 0b7c de88 0b56 4e80 m..]d.v.|...V..N
  66378. 8036aa3: b9d4 72ca aa7d dd8b da09 5db3 ff54 02a9 ...r}......]T...
  66379. 8036ab3: 077e c74f c2c7 d6c5 a207 efb7 44f4 0185 ~.O..........D..
  66380. 8036ac3: 727c 24cb 562d da62 8ace e1fa 0ea6 f5c9 |r.$-Vb.........
  66381. 8036ad3: 2943 30ad dc37 5de9 7032 4fd4 8f65 2028 C).07..]2p.Oe.(
  66382. 8036ae3: 2622 0e28 a87f e696 a6f6 6cfe 4ad0 7a50 "&(........l.JPz
  66383. 8036af3: ab3a 8136 9053 77bd 1bec 171c 1e86 3f96 :.6.S..w.......?
  66384. 8036b03: 4114 bbda 01f5 b5d8 f290 c7de e975 6294 .A..........u..b
  66385. 8036b13: 8e19 213b c984 b2b8 17c4 ba6e 5db8 e128 ..;!......n..](.
  66386. 8036b23: b788 f51e 4e26 b8cf 45c1 1857 8c14 f005 ....&N...EW.....
  66387. 8036b33: 1382 d0a9 5712 e8ef 64a3 c125 463c 317b .....W...d%.<F{1
  66388. 8036b43: 9780 94b8 611e ebb9 76c0 4f9d 08bc 7f85 .....a...v.O....
  66389. 8036b53: 0de7 c2c2 0de7 dac3 1532 22ac de1a 4a0e ........2.."...J
  66390. 8036b63: 7e90 e406 6e48 77b5 e211 ebb0 d94b 7508 .~..Hn.w....K..u
  66391. 8036b73: 1ad8 ed6b 9114 ae8e 819b 3103 b54e fbd6 ..k........1N...
  66392. 8036b83: b9bb 297c ddd1 5778 1978 9282 3f79 2f87 ..|)..xWx...y?./
  66393. 8036b93: 0c83 e6bd 8a02 2a79 f086 6a34 844a 48b5 ......y*..4jJ..H
  66394. 8036ba3: d3cf 876b 086c 0c19 e1c7 c4e0 3f42 2517 ..k.l.......B?.%
  66395. 8036bb3: f741 c9f8 4dee 9c3d a483 3ea1 a937 c403 A....M=....>7...
  66396. 8036bc3: 1c0b f982 8122 7a44 e882 ce35 3540 ba23 ....".Dz..5.@5#.
  66397. 8036bd3: 1944 def5 8782 76a6 d2ca ae0b 7d16 0d62 D......v.....}b.
  66398. 8036be3: 434c 2652 0b49 0b88 5eae 0481 c756 3d3f LCR&I....^..V.?=
  66399. 8036bf3: 53b1 43be d55d 4eda 08d3 00ea ac31 2fe5 .S.C]..N....1../
  66400. 8036c03: f83a 1d80 7962 40f9 d3f6 9e8f f66a 6710 :...by.@....j..g
  66401. 8036c13: 88d6 e6a9 c194 a830 0e75 758a 69fc 9034 ......0.u..u.i4.
  66402. 8036c23: 2b3f 2846 3229 4dc0 85de b9b5 5800 1e93 ?+F()2.M.....X..
  66403. 8036c33: ce6f 4c83 1969 b671 4532 4d21 c199 89d1 o..Li.q.2E!M....
  66404. 8036c43: 0b4a fd39 01ff 79b5 91d0 50c2 0000 J.9....y...P..
  66405. 08036c51 <data__index_html>:
  66406. 8036c51: 692f 646e 7865 682e 6d74 006c 5448 5054 /index.html.HTTP
  66407. 8036c61: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  66408. 8036c71: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  66409. 8036c81: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  66410. 8036c91: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  66411. 8036ca1: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  66412. 8036cb1: 6e65 2d74 654c 676e 6874 203a 3039 0d35 ent-Length: 905.
  66413. 8036cc1: 430a 6e6f 656e 7463 6f69 3a6e 4320 6f6c .Connection: Clo
  66414. 8036cd1: 6573 0a0d 6f43 746e 6e65 2d74 7974 6570 se..Content-type
  66415. 8036ce1: 203a 6574 7478 682f 6d74 0d6c 430a 6e6f : text/html..Con
  66416. 8036cf1: 6574 746e 452d 636e 646f 6e69 3a67 6720 tent-Encoding: g
  66417. 8036d01: 697a 0d70 0d0a 1f0a 088b 0000 0000 0400 zip.............
  66418. 8036d11: 9d0a 5d55 d46f 1446 2bfd f753 9125 b662 ..U]o.F..+S.%.b.
  66419. 8036d21: 21bc 6d75 0429 f12a 8454 aada 453c f6b3 .!um).*.T...<E..
  66420. 8036d31: 78dd bfa8 5cf0 26ef 216f 5a14 a409 4845 .x...\.&o!.Z..EH
  66421. 8036d41: bc48 7f00 1421 4db6 4dd2 0bf8 7fe3 33d4 H...!..M.M.....3
  66422. 8036d51: 35e3 125d d02b d83e 6bde 3dcf ccf7 e7b9 .5].+.>..k.=....
  66423. 8036d61: 0cee babf fdf1 0fd6 6f77 14df 6709 3869 ........wo...gi8
  66424. 8036d71: 77b4 ca91 277c 3cf0 2444 70e3 1198 114b .w..|'.<D$.p..K.
  66425. 8036d81: b225 c4d2 5781 d8f3 86bf ee6f c26d fa5c %....W....o.m.\.
  66426. 8036d91: bf74 9356 fbc0 ffd9 d371 2adf 52b2 1ab2 t.V.....q..*.R..
  66427. 8036da1: e4a5 a889 99c8 a472 badc 5019 43bc 525d ......r....P.C]R
  66428. 8036db1: 332e bc0a a289 5969 bc54 6eb2 62aa 824e .3....iYT..n.bN.
  66429. 8036dc1: 2698 222a 05df 2a1b ac57 ea64 48eb 14a6 .&*"...*W.d..H..
  66430. 8036dd1: dd5c e4c8 caae ecea 5c63 aa6b 205c 3251 \.......c\k.\ Q2
  66431. 8036de1: 06f8 5825 4a71 79a1 0e63 7d9b 6873 6616 ..%XqJ.yc..}sh.f
  66432. 8036df1: 1cde fb34 93cd a0e1 32fd 554c 8bfe 2a48 ..4......2LU..H*
  66433. 8036e01: 071a 265e 7e55 d225 13da a515 a781 2f79 ..^&U~%.......y/
  66434. 8036e11: 9d25 3110 0670 e6ed 4547 17bc 630e 1135 %..1p...GE...c5.
  66435. 8036e21: 2a51 0eb5 5cbc 464e 12b2 c3ed 698f eb2c Q*...\NF.....i,.
  66436. 8036e31: bb94 ac70 2976 b9f6 0128 2170 b7c7 5488 ..p.v)..(.p!...T
  66437. 8036e41: 9fb5 a1c2 925c 7950 bb4c ac57 90f0 ada2 ....\.PyL.W.....
  66438. 8036e51: 1691 853b 20a5 0171 bba6 1977 7b5f c542 ..;.. q...w._{B.
  66439. 8036e61: 4f60 ed79 a82b 5cbc a75a 3e5d 75c8 f08c `Oy.+..\Z.]>.u..
  66440. 8036e71: 5db3 7f6d d884 a5fc 6585 6ac4 4682 c9f5 .]m......e.j.F..
  66441. 8036e81: c967 f4d8 0855 8238 be55 5ba3 a1fa 0579 g...U.8.U..[..y.
  66442. 8036e91: 1fd5 bd58 99cd 3639 e627 dda8 f9c3 9534 ..X...96'.....4.
  66443. 8036ea1: 8b8f e52e 39a5 7e6d 6735 5948 f920 39b1 .....9m~5gHY ..9
  66444. 8036eb1: 666a 26ff 6a0d b278 6095 ce45 2569 12cb jf.&.jx..`E.i%..
  66445. 8036ec1: 3a42 9615 c32e 92de bdab f1bc b57a a517 B:..........z...
  66446. 8036ed1: 29cc ee15 75de b90f e82b 27ed 2bdb acec .)...u..+..'.+..
  66447. 8036ee1: a1ad 176f db53 f338 eed2 640e 337f e6a7 ..o.S.8....d.3..
  66448. 8036ef1: 9cc8 f308 7c01 600f 8433 b796 d66b 2c05 .....|.`3...k..,
  66449. 8036f01: 21eb 60d4 d1eb 45ae c06d 5f23 b4b3 e376 .!.`...Em.#_..v.
  66450. 8036f11: 570a 9a1c cde7 6823 1ef7 6780 2e66 38f0 .W....#h...gf..8
  66451. 8036f21: 1f34 df60 f999 ccd3 d15d 58b9 69fb 6b73 4.`.....]..X.isk
  66452. 8036f31: 761d 68c6 4bda b083 6253 0b73 0338 e21b .v.h.K..Sbs.8...
  66453. 8036f41: bf61 1c0c 47e8 27e0 1fff c6fa a067 ce3b a....G.'....g.;.
  66454. 8036f51: cd87 404c 671c c802 6504 787a 7caa 5c7b ..L@.g...ezx.|{\
  66455. 8036f61: fdd1 252f 45fb 4598 9fcd 8505 cd39 683b ../%.E.E....9.;h
  66456. 8036f71: d0f9 05fc f66b 2b31 76a7 7b3a ec24 96ba ....k.1+.v:{$...
  66457. 8036f81: 38a8 3b26 b66f 7055 1a2e 1b05 be74 2815 .8&;o.Up....t..(
  66458. 8036f91: 07f0 7d82 3cbc ad86 b821 1e68 8758 a6a0 ...}.<..!.h.X...
  66459. 8036fa1: b6f3 ee39 43d1 b2a6 faca 0eea 499c a840 ..9..C.......I@.
  66460. 8036fb1: 56df 5a9f baf4 a664 3e0a cf33 e8c0 1504 .V.Z..d..>3.....
  66461. 8036fc1: b817 6efe ce66 fbb0 8e96 d435 105b 5b41 ...nf.....5.[.A[
  66462. 8036fd1: 71c0 a76e 1fb3 bff9 f618 e605 04f6 b6bd .qn.............
  66463. 8036fe1: ff63 02f4 05fe 8e93 6f24 d247 3ffe c8f6 c.......$oG..?..
  66464. 8036ff1: 1cbc 7001 e87d 44fe e3ac b14f 9803 00ea ...p}..D..O.....
  66465. 8037001: 177c b718 9839 0763 8058 8f67 2a98 a9cf |...9.c.X.g..*..
  66466. 8037011: 66da 2eca f12d cdda ba31 fcd5 dc0e a239 .f..-...1.....9.
  66467. 8037021: 4099 4560 d859 f66a 78e4 0d6b ceec f38d .@`EY.j..xk.....
  66468. 8037031: 6683 c0f7 a32a 94ed eec6 38a8 733f 369f .f..*......8?s.6
  66469. 8037041: 15ae 7979 cf6f 1d13 aa55 c164 257b 424e ..yyo...U.d.{%NB
  66470. 8037051: 5da6 dc1e 1393 bed9 84f5 a2ae d9e5 4f74 .]............tO
  66471. 8037061: a13b 6adc fa4c 5965 2c61 7e59 0387 56e6 ;..jL.eYa,Y~...V
  66472. 8037071: b6be 51be 4aca fa66 610e 74d0 b6b2 2dfe ...Q.Jf..a.t...-
  66473. 8037081: 5ed4 0c82 41dc 0fff f11e ea43 07f8 0000 .^...A....C.....
  66474. 8037091: 0026 6170 7373 6f77 6472 003d 6f72 6574 &.password=.rote
  66475. 80370a1: 756b 7370 4800 5454 0050 6572 6461 635f kups.HTTP.read_c
  66476. 80370b1: 6d6f 756d 696e 7974 003d 7277 7469 5f65 ommunity=.write_
  66477. 80370c1: 6f63 6d6d 6e75 7469 3d79 6d00 6e61 6761 community=.manag
  66478. 80370d1: 7265 5049 003d 616d 616e 6567 4972 3250 erIP=.managerIP2
  66479. 80370e1: 003d 616d 616e 6567 4972 3350 003d 6864 =.managerIP3=.dh
  66480. 80370f1: 7063 003d 7069 6461 7264 003d 7767 003d cp=.ipaddr=.gw=.
  66481. 8037101: 616d 6b73 003d 003f 7270 646f 7461 3d65 mask=.?.prodate=
  66482. 8037111: 4800 5454 2f50 2e31 2030 3032 2030 4b4f .HTTP/1.0 200 OK
  66483. 8037121: 0a0d 6f43 746e 6e65 2d74 7954 6570 743a ..Content-Type:t
  66484. 8037131: 7865 2f74 7468 6c6d 0a0d 0a0d 7254 6575 ext/html....True
  66485. 8037141: 6f00 6e77 7265 003d 7973 4c73 636f 7461 .owner=.sysLocat
  66486. 8037151: 6f69 3d6e 6300 6d6f 656d 746e 003d 4547 ion=.comment=.GE
  66487. 8037161: 2054 6d2f 6961 2e6e 7363 0073 4547 2054 T /main.css.GET
  66488. 8037171: 722f 746f 6b65 702e 676e 4700 5445 2f20 /rotek.png.GET /
  66489. 8037181: 6166 6976 6f63 2e6e 6369 006f 4547 2054 favicon.ico.GET
  66490. 8037191: 6d2f 6961 2e6e 736a 4700 5445 2f20 6573 /main.js.GET /se
  66491. 80371a1: 7474 6e69 7367 682e 6d74 006c 4547 2054 ttings.html.GET
  66492. 80371b1: 692f 666e 2e6f 7468 6c6d 4700 5445 2f20 /info.html.GET /
  66493. 80371c1: 6567 4a74 6f73 2e6e 6763 0069 4547 2054 getJson.cgi.GET
  66494. 80371d1: 732f 7465 6974 676e 2e73 6763 0069 4547 /settings.cgi.GE
  66495. 80371e1: 2054 692f 666e 2e6f 6763 0069 4547 2054 T /info.cgi.GET
  66496. 80371f1: 722f 7365 7465 632e 6967 4700 5445 2f20 /reset.cgi.GET /
  66497. 8037201: 6572 6f62 746f 632e 6967 4700 5445 2f20 reboot.cgi.GET /
  66498. 8037211: 6f63 666e 7269 2e6d 6763 0069 692f 646e confirm.cgi./ind
  66499. 8037221: 7865 682e 6d74 006c 4f50 5453 2f20 6863 ex.html.POST /ch
  66500. 8037231: 6365 706b 6477 632e 6967 4700 5445 2f20 eckpwd.cgi.GET /
  66501. 8037241: 6573 5074 6f72 6164 6574 632e 6967 4700 setProdate.cgi.G
  66502. 8037251: 5445 2f20 7270 676f 6e6f 632e 6967 0400 ET /progon.cgi.
  66503. 08037260 <file__info_html>:
  66504. 8037260: 3f04 0803 3f18 0803 3f24 0803 04fa 0000 .?...?..$?......
  66505. 8037270: 0001 0000 ....
  66506. 08037274 <file__settings_html>:
  66507. 8037274: a944 0803 441e 0803 442e 0803 08c5 0000 D....D...D......
  66508. 8037284: 0001 0000 ....
  66509. 08037288 <file__main_css>:
  66510. 8037288: 7260 0803 729c 0803 72a8 0803 192d 0000 `r...r...r..-...
  66511. 8037298: 0001 0000 ....
  66512. 0803729c <data__main_css>:
  66513. 803729c: 6d2f 6961 2e6e 7363 0073 0000 5448 5054 /main.css...HTTP
  66514. 80372ac: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  66515. 80372bc: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  66516. 80372cc: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  66517. 80372dc: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  66518. 80372ec: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  66519. 80372fc: 6e65 2d74 654c 676e 6874 203a 3236 3533 ent-Length: 6235
  66520. 803730c: 0a0d 6f43 6e6e 6365 6974 6e6f 203a 6c43 ..Connection: Cl
  66521. 803731c: 736f 0d65 430a 6e6f 6574 746e 742d 7079 ose..Content-typ
  66522. 803732c: 3a65 7420 7865 2f74 7363 0d73 430a 6e6f e: text/css..Con
  66523. 803733c: 6574 746e 452d 636e 646f 6e69 3a67 6720 tent-Encoding: g
  66524. 803734c: 697a 0d70 430a 6361 6568 432d 6e6f 7274 zip..Cache-Contr
  66525. 803735c: 6c6f 203a 7270 7669 7461 2c65 6d20 7861 ol: private, max
  66526. 803736c: 612d 6567 383d 3436 3030 0a0d 0a0d 8b1f -age=86400......
  66527. 803737c: 0008 0000 0000 0a04 3cd5 8f6b 38e3 7f8e .........<k..8..
  66528. 803738c: bbc5 3e85 4f4c 99db eb3c 60e1 b70a bb33 ...>LO..<..`..3.
  66529. 803739c: 3b87 06e0 0fd8 9f3b eafa 1383 152b 3b4f .;....;.....+.O;
  66530. 80373ac: 6076 d53b 93d5 7fcb 523f 2522 afca e764 v`;.....?R"%..d.
  66531. 80373bc: 0380 e90e 2d87 1251 9149 4514 fad1 fbe1 .....-Q.I..E....
  66532. 80373cc: 053f 5945 921d fb3c 4d5d 75b6 bc1d 262d ?.EY..<.]M.u..-&
  66533. 80373dc: c9d3 f83c e0ef ff97 47f8 9ff0 56d9 b515 ..<......G...V..
  66534. 80373ec: b782 acd7 6499 0fe5 3616 fef8 4987 be5e .....d...6...I^.
  66535. 80373fc: 6196 3552 36d9 6157 6752 0aa9 d553 5924 .aR5.6WaRg..S.$Y
  66536. 803740c: 875e ecbb 9b75 9b1c 2cac f1f0 a954 5770 ^...u....,..T.pW
  66537. 803741c: 8d96 c2aa 4abd fc52 b5ef 4f2a f0c7 6490 .....JR...*O...d
  66538. 803742c: 7845 c550 2c29 b792 56b0 dd5b 3ea2 0e1d ExP.),...V[..>..
  66539. 803743c: f549 9ced f566 4f31 c5be bc9b 7edc 4cb9 I...f.1O.....~.L
  66540. 803744c: 63ea 6c56 f7ca 925f 4bea ee98 f38a 2cae .cVl.._..K.....,
  66541. 803745c: a89a be6e 2ae5 1ace 6020 406b 2a7e 43df ..n..*.. `k@~*.C
  66542. 803746c: 0b0d 410f 1c56 4d4f ffa8 dcfd 3b7c 1faa ...AV.OM....|;..
  66543. 803747c: 956b db54 cbfd fa39 36aa b25f 4a26 478e k.T...9..6_.&J.G
  66544. 803748c: 4928 ad8a 8b8a 50b2 0997 b220 aa49 3eb0 (I.....P.. .I..>
  66545. 803749c: e06d f1ef 2c7c 0ceb 8a91 952b 4d27 a6f6 m...|,....+.'M..
  66546. 80374ac: 4c2e b357 373f 1dea c87a d7b3 ce22 aed5 .LW.?7..z..."...
  66547. 80374bc: 4cb9 2012 4de0 9385 534d 764c f6e5 eb54 .L. .M..MSLv..T.
  66548. 80374cc: 58c7 ee3c 37cb 1f20 7947 b3ce 84e7 ecab .X<..7 .Gy......
  66549. 80374dc: aebb 1d37 6aa7 565b 2630 6e0c 0b51 f94f ..7..j[V0&.nQ.O.
  66550. 80374ec: 49a4 0036 9f5e acf3 fa66 7d75 7876 730d .I6.^...f.u}vx.s
  66551. 80374fc: aaf5 f48a 29bc e02b 3c72 98bd b0f7 4349 .....)+.r<....IC
  66552. 803750c: f740 a498 5669 42bc bef1 e439 7f86 e4bb @...iV.B..9.....
  66553. 803751c: e590 e2df 54bf 9259 ff87 f2ae 0537 99d3 .....TY.....7...
  66554. 803752c: 7584 d452 ad51 6caa 66b7 694e 6b62 9310 .uR.Q..l.fNibk..
  66555. 803753c: 4928 3b7f 4dd5 9b3c 3f4e a3ac 1d43 d6f5 (I.;.M<.N?..C...
  66556. 803754c: 365c fa65 0ced f8f3 159a 74f1 49bd 5fb6 \6e........t.I._
  66557. 803755c: ce70 348b 96da 5979 77c5 7b7f dbfc ff4f p..4..yY.w.{..O.
  66558. 803756c: 5b36 dbd3 b162 2358 766b f979 fa35 d716 6[..b.X#kvy.5...
  66559. 803757c: aadb f3cc 724b b34a dc32 c526 525b c787 ....KrJ.2.&.[R..
  66560. 803758c: 7caa 54ad 875d 206f a569 8e95 c8ac 42b3 .|.T].o i......B
  66561. 803759c: 5a45 d648 03d0 9fe2 acd3 926c 615a e9ad EZH.......l.Za..
  66562. 80375ac: d808 7cd8 79f7 620b 9d03 2fd7 6d1f c817 ...|.y.b.../.m..
  66563. 80375bc: f5be 655e fbaf 9806 79f3 a59f 2aa9 c25e ..^e.....y...*^.
  66564. 80375cc: 1d46 fe40 e51a 5dc1 7392 9687 0406 3ea8 F.@....].s.....>
  66565. 80375dc: 9526 9a2a 124b 1093 b124 cb99 d4f2 0a20 &.*.K...$..... .
  66566. 80375ec: 71d0 d9b2 9f54 ac9b d5c9 cd0b b450 9b29 .q..T.......P.).
  66567. 80375fc: 3ca6 b3c4 7be3 c290 4aa3 9b2f 3cb0 4636 .<...{...J/..<6F
  66568. 803760c: 6a3b b3c0 3578 f4f3 60d5 30f7 c985 319b ;j..x5...`.0...1
  66569. 803761c: 275b 0ff7 10ea d74c 1346 6a60 b9e2 5c3a ['....L.F.`j..:\
  66570. 803762c: e780 ce5f d6c4 54e9 3eb2 dbbe a6ed 1a97 .._....T.>......
  66571. 803763c: 9db4 1f66 33a7 9c7e b87e b8b0 9ebb 561e ..f..3~.~......V
  66572. 803764c: d61f b19a 97cc de41 9aa2 e534 8e31 2b26 ......A...4.1.&+
  66573. 803765c: 1d18 027a 34e2 d155 ae64 de4b 355e e3e7 ..z..4U.d.K.^5..
  66574. 803766c: 4c0a c7c0 cf33 6c72 7cd8 f631 4981 019a .L..3.rl.|1..I..
  66575. 803767c: cb41 f1e9 b2fd ceaf 6476 4116 fed0 5008 A.......vd.A...P
  66576. 803768c: 1946 59c6 7604 0303 41df cb06 f1df afa1 F..Y.v...A......
  66577. 803769c: bfae 72f8 8b04 6284 730b 3896 928c 5353 ...r...b.s.8..SS
  66578. 80376ac: b65e d825 2fb1 149b 4de4 1e81 8e1c a29e ^.%../...M......
  66579. 80376bc: ca1c 84a2 dea9 d0aa 093e 03f6 97f6 09cd ........>.......
  66580. 80376cc: 2f88 6342 dc79 aa5c ac1c 1b9b 2ad3 7206 ./Bcy.\......*.r
  66581. 80376dc: ce3c 3d8a 5ae8 ca43 6f40 3417 da23 4480 <..=.ZC.@o.4#..D
  66582. 80376ec: 1130 c25f d7c9 ad0a 1555 0080 79e8 9922 0._.....U....y".
  66583. 80376fc: 8258 984c 1d41 6f25 9d59 726d c8c5 1680 X.L.A.%oY.mr....
  66584. 803770c: e8c0 acc6 6168 81dd 37cd 8556 45d0 608b ....ha...7V..E.`
  66585. 803771c: a5ac 93b1 f8a6 90c5 8a61 f740 e354 c095 ........a.@.T...
  66586. 803772c: 1f5c a6b2 98d7 f69a edeb aaa9 d941 658f \...........A..e
  66587. 803773c: d306 1155 9f3a b0c1 8027 fa5d 8a12 6d61 ..U.:...'.]...am
  66588. 803774c: 99e1 a51a 976a f29c 1a86 b1c5 669e 4a6d ....j........fmJ
  66589. 803775c: aca3 c028 6a8a 7716 9dcb 5b9d 3b5b 41a8 ..(..j.w...[[;.A
  66590. 803776c: 62c1 a182 a920 2b32 45d9 0d2c bddb 7eda .b.. .2+.E,....~
  66591. 803777c: 7901 48f1 12ac 40b0 428e 4e21 efa6 015e .y.H...@.B!N..^.
  66592. 803778c: 5514 0dfd 259c e316 a717 46c3 2f55 1040 .U...%.....FU/@.
  66593. 803779c: 4dad ca9a 9708 88bd 6966 1a0c 8cec 24aa .M......fi.....$
  66594. 80377ac: eb34 968f d16a bdb2 0a04 ff14 5a77 9765 4...j.......wZe.
  66595. 80377bc: b10a a2a8 ed92 9532 92a7 84d3 a381 14d4 ......2.........
  66596. 80377cc: 6044 b7e8 ef2a 7621 81a8 225b 1707 3d74 D`..*.!v..["..t=
  66597. 80377dc: 0838 95ae c98a 8c02 3052 47b9 14db 1e4c 8.......R0.G..L.
  66598. 80377ec: dfe0 2b35 3063 be3f ccb3 49a0 cbae 4b3c ..5+c0?....I..<K
  66599. 80377fc: 3a83 5583 d2b1 18da c369 f11c f32a 1a8c .:.U....i...*...
  66600. 803780c: ca6a 64e2 ee87 2b8d 05e8 28da 3c50 1fe3 j..d...+...(P<..
  66601. 803781c: 4d44 e659 69e0 86c8 c45c e060 2557 2ed5 DMY..i..\.`.W%..
  66602. 803782c: 677b fb18 016e 78c0 0b80 f305 cbbe 594f {g..n..x......OY
  66603. 803783c: e16a c55a f01d 600e 20cc 1e69 cbed fb2a j.Z....`. i...*.
  66604. 803784c: 7b1d 83c8 76d4 29d9 06e7 4968 1364 7bf0 .{...v.)..hId..{
  66605. 803785c: 40a0 89f3 1947 e103 0e6e 0a65 b6ab 1271 .@..G...n.e...q.
  66606. 803786c: 9db9 c657 e080 70fa 3e3d 628a 2660 16fa ..W....p=>.b`&..
  66607. 803787c: 7279 95ac f100 5b8a c6e0 6d1b 5301 0fa1 yr.....[...m.S..
  66608. 803788c: c3ea 61d8 c98f f82b 3459 e6f7 db85 931d ...a..+.Y4......
  66609. 803789c: 6502 bc19 5720 4b6f a818 bf2a 2d72 9a3e .e.. WoK..*.r->.
  66610. 80378ac: eb62 806f 97a7 582b f414 1752 39ff f3f8 b.o...+X..R..9..
  66611. 80378bc: cd25 9ede dfb5 fe7d a59a 3ecd 2f9e 2057 %.....}....>./W
  66612. 80378cc: 64b2 1ed2 99f1 7964 6b86 81a8 ee74 7c4a .d....dy.k..t.J|
  66613. 80378dc: f2aa 2aef c3f0 4cbf c58e c7eb 8220 4106 ...*...L.... ..A
  66614. 80378ec: c334 8b7f aa32 b814 cdc2 74da 9dac ea3b 4...2......t..;.
  66615. 80378fc: 0d17 7488 b4e0 b0d7 75c5 32fc 6741 9c03 ...t.....u.2Ag..
  66616. 803790c: 43ad 5bf2 9f68 a7c1 cf37 249b a7a5 8bf2 .C.[h...7..$....
  66617. 803791c: ca25 6a38 ca34 c3bd b67e d8b4 9547 c576 %.8j4...~...G.v.
  66618. 803792c: 0690 07a2 e5b4 a318 8276 987f e434 eb6d ........v...4.m.
  66619. 803793c: a1b1 61e7 a702 f441 f0b0 73a8 e8b0 a82d ...a..A....s..-.
  66620. 803794c: f678 bd00 8f06 c80f a62d 2b25 ba46 568c x.......-.%+F..V
  66621. 803795c: e0d8 748f fc9b d636 e2ed 750f 1c0b eb1e ...t..6....u....
  66622. 803796c: 0674 fdfc 70a7 9505 7d02 1f39 c960 c9a1 t....p...}9.`...
  66623. 803797c: 4107 b370 8e40 5cdd 970b 8d81 9968 6816 .Ap.@..\....h..h
  66624. 803798c: 87b0 dbbf c0ed 829a b65b 524f ee10 8069 ........[.OR..i.
  66625. 803799c: 1536 ad85 dd7a df24 434d 4dfc 1fe6 cf79 6...z.$.MC.M..y.
  66626. 80379ac: 3dc5 b405 8b07 e036 a756 c9ec 162e c90f .=....6.V.......
  66627. 80379bc: 61e6 561c a6ec eb50 3309 3fbf caf2 3fc9 .a.V..P..3.?...?
  66628. 80379cc: 25de d9b3 61fc a42d 54c2 8f48 d19e 7769 .%...a-..TH...iw
  66629. 80379dc: 4b87 631b f0f7 8c30 f01a ef49 3cf5 03f7 .K.c..0...I..<..
  66630. 80379ec: 453c f6f2 0cee d265 448b d0ad 2a9b beb7 <E....e..D...*..
  66631. 80379fc: 2db9 5220 4c66 59d4 032a 06cd 47fc 5ac5 .- RfL.Y*....G.Z
  66632. 8037a0c: d887 4c1c e32d 360c 4d03 9e0d 9de4 9d68 ...L-..6.M....h.
  66633. 8037a1c: 3ad3 05c8 5bbc e9e1 1b3f 0363 4e46 fbfb .:...[..?.c.FN..
  66634. 8037a2c: 35d3 d8ef 9ecd 32ec 36d1 c430 6b1d 5aae .5.....2.60..k.Z
  66635. 8037a3c: 56c0 6086 b74c ee1f b7ee 9f6d 0514 dcb0 .V.`L.....m.....
  66636. 8037a4c: 0cd4 ce72 09ec e35d ec2d d6f7 82b9 148d ..r...].-.......
  66637. 8037a5c: 427a 16c9 0a77 2993 8a6c ecd6 2d71 cd51 zB..w..)l...q-Q.
  66638. 8037a6c: 718c 9ee4 d768 53ce 9cb9 772f 25ab 01b9 .q..h..S../w.%..
  66639. 8037a7c: 1a4c 26d8 06f2 a6ee 64b3 51b6 0edd c583 L..&.....d.Q....
  66640. 8037a8c: 1823 4311 392a 8c80 ec02 f4c1 dc86 4f2d #..C*9........-O
  66641. 8037a9c: 82b5 22ed 2d6c 25c7 428f ec0d e8ba 8109 ..."l-.%.B......
  66642. 8037aac: 7841 466c 8b0e 9e48 1cb5 1c1a 1d84 243f AxlF..H.......?$
  66643. 8037abc: 91ef bd7b f998 6e78 6d70 6e7a 67aa 0e88 ..{...xnpmzn.g..
  66644. 8037acc: 8a74 b6f6 d708 16e4 2d94 5072 9128 282d t........-rP(.-(
  66645. 8037adc: e45b 0f22 a988 c274 9367 fce5 f571 5b30 [."...t.g...q.0[
  66646. 8037aec: da2e cbbb ec03 61c1 23ed a1be 77f5 d90e .......a.#...w..
  66647. 8037afc: 9a5d 96a6 3108 bb0a bc65 d7f9 c952 b05d ]....1..e...R.].
  66648. 8037b0c: 72e9 2913 217a 7f46 a86a 78b7 5597 5c10 .r.)z!F.j..x.U.\
  66649. 8037b1c: eed9 1cb3 b2a8 19ec b307 80cc d0b9 cffe ................
  66650. 8037b2c: eed5 e1c6 7f6c 2b1a a51f 7fca 18b5 075e ....l..+......^.
  66651. 8037b3c: 9fdd 4f05 2cc1 6168 b231 49f0 844b 47ac ...O.,ha1..IK..G
  66652. 8037b4c: 3165 b04e 79e0 fa40 31dc 109a d85d 8751 e1N..y@..1..].Q.
  66653. 8037b5c: e920 c405 6a50 ec05 88eb 6f59 5325 2b2b ...Pj....Yo%S++
  66654. 8037b6c: 9cad 7d31 95bd 2d7d 54ad b5f4 95b4 304e ..1}..}-.T....N0
  66655. 8037b7c: 5561 cc62 7b0d 6d94 efc8 847d d4f4 6c59 aUb..{.m..}...Yl
  66656. 8037b8c: 5d5c 8c97 ba9e 769e cf16 5c1e 1d6c 67cf \].....v...\l..g
  66657. 8037b9c: 7ebf 8980 48c0 4e20 6d83 4b71 646f c85a .~...H N.mqKodZ.
  66658. 8037bac: 806a 3018 2077 9526 c51d c6ac b345 ca8f j..0w &.....E...
  66659. 8037bbc: 845d d5c1 caef fd34 e7d8 3c07 e0ed 3dc7 ].....4....<...=
  66660. 8037bcc: a8e8 6598 2d26 3dc7 b4b2 c1da 1a8f 7059 ...e&-.=......Yp
  66661. 8037bdc: c650 91c9 2559 da68 6943 c8df 3b8f b1f8 P...Y%h.Ci...;..
  66662. 8037bec: fc71 cfcb 2d3f 9e7e aff6 430f 89ab e831 q...?-~....C..1.
  66663. 8037bfc: a801 e7f4 9e6d f5d4 3ff7 63c2 e2f4 a9d6 ....m....?.c....
  66664. 8037c0c: 81ba ed10 aed6 5a52 409d f34c a1d3 6720 ......RZ.@L... g
  66665. 8037c1c: 0755 7567 d079 5ea4 212f ee95 d2bd 7d6b U.guy..^/!....k}
  66666. 8037c2c: 3cab 3d97 0d4b 1636 7918 e9a1 a131 0869 .<.=K.6..y..1.i.
  66667. 8037c3c: 63e1 85ec ace1 681c b59e 4902 edc6 2190 .c.....h...I...!
  66668. 8037c4c: bd6d f784 56b1 773b cc3a 2cec 70b3 6c9b m....V;w:..,.p.l
  66669. 8037c5c: e030 07aa 5b38 047d 7d23 4dc5 2004 2772 0...8[}.#}.M. r'
  66670. 8037c6c: 1d22 0d41 6f8d 9b01 8c21 9b82 2978 9917 ".A..o..!...x)..
  66671. 8037c7c: 179d 81cc 0ade 904a 0f96 e602 c0cf 4f22 ......J......."O
  66672. 8037c8c: 57c0 85e0 4216 e8db 8025 6851 1ead 94fd .W...B..%.Qh....
  66673. 8037c9c: 48c2 d018 43fe e5e2 f023 493c f2ab ce08 .H...C..#.<I....
  66674. 8037cac: 1172 27d8 f558 5f5f 80e1 2085 f525 1586 r..'X.__... %...
  66675. 8037cbc: 13cf d11d 00f5 eca8 f139 5b4b 3daf 74ed ........9.K[.=.t
  66676. 8037ccc: 73d1 ce42 8d90 1a44 e936 99b1 b887 cb26 .sB...D.6.....&.
  66677. 8037cdc: 33d0 35ee 9f98 f168 d554 cec7 31ce 2a00 .3.5..h.T....1.*
  66678. 8037cec: a828 b1a8 c653 6ce5 3a2d 6c7a 8b39 9881 (...S..l-:zl9...
  66679. 8037cfc: 28f4 2883 15bd e186 ef99 e1b4 8e65 22fc .(.(........e.."
  66680. 8037d0c: d318 697a f318 d53b b010 8167 3272 9726 ..zi..;...g.r2&.
  66681. 8037d1c: 4edd b297 06f2 2494 68f8 8c5f e1aa e3b8 .N.....$.h_.....
  66682. 8037d2c: 8454 4e87 6111 db0b c15c b344 1683 7d75 T..N.a..\.D...u}
  66683. 8037d3c: 80b4 233d a71f bc3b bbab 1285 3d07 13d6 ..=#..;......=..
  66684. 8037d4c: 61d3 0bb7 8a44 ef79 cca0 50e4 8b75 4b58 .a..D.y....Pu.XK
  66685. 8037d5c: a790 9fc1 4b48 94fa 8bbf f09a 18f2 e037 ....HK........7.
  66686. 8037d6c: c7b1 2b56 5814 b7a1 cc54 1054 270f 3c17 ..V+.X..T.T..'.<
  66687. 8037d7c: 11ae 567c 323a 9f2b e004 48cd b918 1964 ..|V:2+....H..d.
  66688. 8037d8c: 9f24 706b f42e 6242 cd6b 0422 faf1 5963 $.kp..Bbk."...cY
  66689. 8037d9c: 70d4 f920 1e4c 6b5b f6bb eca7 2c70 26ab .p .L.[k....p,.&
  66690. 8037dac: 5381 962b b6f4 9902 8a05 3c8f 6a19 14a4 .S+........<.j..
  66691. 8037dbc: 48a2 51ad f683 862e 3b82 5d68 6379 7389 .H.Q.....;h]yc.s
  66692. 8037dcc: a31b 6dbd 8221 e3ae 8327 25bc a0ce 6a28 ...m!...'..%..(j
  66693. 8037ddc: 90c4 4816 c863 8293 7eb0 688d 8122 1084 ...Hc....~.h"...
  66694. 8037dec: dc74 3d29 312c b8d2 5223 617f 95e1 b0af t.)=,1..#R.a....
  66695. 8037dfc: fbd0 de03 82d0 391d 036d de79 01fd 9a9d .......9m.y.....
  66696. 8037e0c: 78e1 6dee 3868 d107 b786 9183 ba2e cd85 .x.mh8..........
  66697. 8037e1c: fa38 5a92 2cc1 fdb6 0d2d a6b6 2cd2 2dc4 8..Z.,..-....,.-
  66698. 8037e2c: b328 37d3 a6d3 ea17 c8c0 0b51 6acc 191a (..7......Q..j..
  66699. 8037e3c: d834 9372 9834 a95e cd15 3717 9b46 e4e8 4.r.4.^....7F...
  66700. 8037e4c: 83c6 51d4 5c12 3dd5 d333 95c2 657a 9658 ...Q.\.=3...zeX.
  66701. 8037e5c: 3e86 41fb da33 463b 9db7 5313 1f1e ed51 .>.A3.;F...S..Q.
  66702. 8037e6c: b3e5 23df 9dad ccce 600f e06c 03da 3d33 ...#.....`l...3=
  66703. 8037e7c: f328 f03c 1cd8 9073 618c 97c9 7bd1 4363 (.<...s..a...{cC
  66704. 8037e8c: 8502 9ebd b2c9 abb2 3be4 3d3d fbfe eb6d .........;==..m.
  66705. 8037e9c: 8f3a eadf 4dbe 5716 b24b 22d0 8adf 306e :....M.WK.."..n0
  66706. 8037eac: 4881 abe9 18e2 6e0f 762d 6eab 05f0 7162 .H.....n-v.n..bq
  66707. 8037ebc: 160b 16ba fddd eeec 8bc3 2bd6 1a89 dc9d ...........+....
  66708. 8037ecc: d052 e9fe 85de 2154 8a2a 75e1 6ced e45e R.....T!*..u.l^.
  66709. 8037edc: ef09 86d0 3784 0f33 87cb 23d5 aa6c 6ba8 .....73....#l..k
  66710. 8037eec: e3e6 a7a0 8b7e dd7f 0bea a702 1890 5b41 ....~.........A[
  66711. 8037efc: 7b48 ccfc 8923 193d 135b 520a 049a e208 H{..#.=.[..R....
  66712. 8037f0c: ec35 2f3d 9513 aa42 3e8d aecd 3793 b1e8 5.=/..B..>...7..
  66713. 8037f1c: 22f1 53ec bd70 5b88 8573 cbbf cf04 a23c .".Sp..[s.....<.
  66714. 8037f2c: 6879 5ffe 6888 5da5 cc32 622a 8b6c 2681 yh._.h.]2.*bl..&
  66715. 8037f3c: 2eee 3e1f fb50 9505 162c 0593 9994 037c ...>P...,.....|.
  66716. 8037f4c: 0e7b 93a1 4a3e 120c df36 c550 4718 04d2 {...>J..6.P..G..
  66717. 8037f5c: 554f 29e7 d6fc 92a4 9f64 5360 db4c 8d30 OU.)....d.`SL.0.
  66718. 8037f6c: 240a 591f 4cd2 8df6 f5d4 0e81 772e fc98 .$.Y.L.......w..
  66719. 8037f7c: 6514 8040 978f fd59 2857 5e27 de1c 7c44 .e@...Y.W('^..D|
  66720. 8037f8c: 80f5 7a42 0a63 424a 89f2 5dde 5e8b 629d ..Bzc.JB...].^.b
  66721. 8037f9c: 77c6 e5cb 7612 1b81 99c8 204a 87a2 64aa .w...v....J ...d
  66722. 8037fac: 8bf6 2562 8e61 3f2d 9dc8 dda0 6e41 e4e0 ..b%a.-?....An..
  66723. 8037fbc: 577d 6d5e f97b 03d7 3370 ca09 ff22 1c16 }W^m{...p3.."...
  66724. 8037fcc: 382b 3ffb 1053 929d 9e63 b94f f98e 2c42 +8.?S...c.O...B,
  66725. 8037fdc: 1e1b d23d 5e2f c863 5203 08aa 1ce0 f820 ..=./^c..R.... .
  66726. 8037fec: 46ce 8331 e1f8 221e 1f89 9ccf 6108 724e .F1....".....aNr
  66727. 8037ffc: 9026 d30c 50c7 2099 61c4 ebf0 ac78 e66d &....P. .a..x.m.
  66728. 803800c: b257 1081 1c18 b3ae 79e8 4cd9 5298 a783 W........y.L.R..
  66729. 803801c: 7a1c 0c23 110b cb87 4a28 a4ec 8d74 5fe6 .z#.....(J..t.._
  66730. 803802c: 3e2b edcf f587 c0ef 54ce 63bd 1526 1623 +>.......T.c&.#.
  66731. 803803c: a899 e5b4 9e4e b775 62f2 bff7 eda6 a60b ....N.u..b......
  66732. 803804c: 7162 db88 05f4 7561 d7cb 0e3e 5098 cbbf bq....au..>..P..
  66733. 803805c: 99f7 f661 b74e d80f 720a 98bf 639a 7efb ..a.N....r...c.~
  66734. 803806c: 384e 2e6c 4c25 e03d 958f 8bd9 6ba4 60db N8l.%L=......k.`
  66735. 803807c: 77fb 817d 1808 95a1 4082 feb1 d996 8c84 .w}......@......
  66736. 803808c: c624 1a65 64e8 9123 9322 0526 c51c 0cca $.e..d#.".&.....
  66737. 803809c: c8bc 7114 963e 9a3e a327 83ee 3c99 0f13 ...q>.>.'....<..
  66738. 80380ac: c50e 03dc 02c2 020f 1ac4 e9dc 1e6f 9510 ............o...
  66739. 80380bc: 7079 69f5 85bb 35a4 8e0f 3cca afb8 5549 yp.i...5...<..IU
  66740. 80380cc: b380 c1e2 9951 2b85 aa8f 2170 0a02 180c ....Q..+..p!....
  66741. 80380dc: 34ba e1f5 0464 50c2 0639 3482 d58e 7913 .4..d..P9..4...y
  66742. 80380ec: 2063 d944 0818 d511 d1ca eb94 3016 95f6 c D..........0..
  66743. 80380fc: 31d3 a2cd 2901 3f30 5a41 9e67 946c 16b3 .1...)0?AZg.l...
  66744. 803810c: 549e c593 4671 7e22 b5c0 e3e1 bdb9 f494 .T..qF"~........
  66745. 803811c: 8c2a 2396 e82b 6878 433a def3 2fda 2389 *..#+.xh:C.../.#
  66746. 803812c: c9ba 2813 7f8b 7192 250f a89d fadb 1eeb ...(...q.%......
  66747. 803813c: 1402 2cfa 290a 8142 381e d0e9 9489 69e5 ...,.)B..8.....i
  66748. 803814c: 8fbb f970 9c84 43cf 6452 13c7 9d26 0596 ..p....CRd..&...
  66749. 803815c: 8f18 1aa1 c33f 46ca 4edd bc90 0909 989c ....?..F.N......
  66750. 803816c: 65f6 4f34 4f67 94f5 51d6 b0a7 4053 cde6 .e4OgO...Q..S@..
  66751. 803817c: 682d ce32 afe7 608a 3820 8a8f 8ba6 78f7 -h2....` 8.....x
  66752. 803818c: 53d6 2987 2925 b89f 58c4 e12a 5c13 7184 .S.)%)...X*..\.q
  66753. 803819c: a495 dd00 0112 1e6e 9ccf 696d 29b2 6683 ......n...mi.).f
  66754. 80381ac: 159f 2e6b bce3 932a 0643 d2cb f1ab 8d1f ..k...*.C.......
  66755. 80381bc: 8607 51fb 8482 f680 520e e286 0748 5bbe ...Q.....R..H..[
  66756. 80381cc: 08b8 4cb4 2782 2eb9 75da b474 cc99 725f ...L.'...ut..._r
  66757. 80381dc: 9c85 8c8d 709c 68f3 9eb0 6630 0c22 c19a .....p.h..0f"...
  66758. 80381ec: 49e1 4c13 4c03 c05f 4575 999e e6cf c87e .I.L.L_.uE....~.
  66759. 80381fc: 1af4 16ac 09ef d827 cc69 f33e 0bdb 6824 ......'.i.>...$h
  66760. 803820c: 7a43 0c16 8ae6 5bc0 0f06 928d 22f6 06f5 Cz.....[....."..
  66761. 803821c: e401 48da 4911 241b c2d2 1b21 eaa4 74aa ...H.I.$..!....t
  66762. 803822c: cbbd 8872 c5f5 7e49 27dc 91df f53f 3de3 ..r...I~.'..?..=
  66763. 803823c: d820 9443 b9f6 9104 0f9e b936 7087 0c3f .C.......6..p?.
  66764. 803824c: 0ecc 3926 e890 0b93 875f 7e5d ecb7 c972 ..&9...._.]~..r.
  66765. 803825c: 0b76 e019 bda2 4a67 f0d9 d9bb 61e3 75ac v.....gJ.....a.u
  66766. 803826c: 4d15 5c85 3059 d93d 8663 868d 4718 dd5b .M.\Y0=.c....G[.
  66767. 803827c: 8fe3 495d 9d12 c524 8f9f cf3c 498f 6329 ..]I..$...<..I)c
  66768. 803828c: b9f4 97b4 5b36 25d9 4ed2 1f7e aeb5 ac72 ....6[.%.N~...r.
  66769. 803829c: d121 b82f 04e4 43c6 15d2 61f7 6a29 a3bb !./....C...a)j..
  66770. 80382ac: cab9 3c3e ed45 5368 e983 5880 7cf3 890e ..><E.hS...X.|..
  66771. 80382bc: d73d ee33 ba57 9b21 0574 a98a 06b9 c866 =.3.W.!.t.....f.
  66772. 80382cc: 06ba cc65 b08e 2429 d746 a255 0dbd d746 ..e...)$F.U...F.
  66773. 80382dc: 13b5 6791 1643 7ad1 02cf bbad 81ef bcc6 ...gC..z........
  66774. 80382ec: 969c 2f40 9352 83ac 32c2 28e2 8309 60ce ..@/R....2.(...`
  66775. 80382fc: 29cc c8ad 4fec d989 a2e6 daab 1378 73f2 .)...O......x..s
  66776. 803830c: c650 e204 3600 033b 71cf 3fe6 1eaf 611f P....6;..q.?...a
  66777. 803831c: 24a7 6791 32d5 ce82 7124 cb29 6f4a 1e93 .$.g.2..$q).Jo..
  66778. 803832c: 9d22 d1c2 02b7 0dbd 11a5 8f6a 5c68 0f66 ".........j.h\f.
  66779. 803833c: a71b 031d 7dc5 ba58 3d46 ba68 beca 1159 .....}X.F=h...Y.
  66780. 803834c: ddb5 11f9 e395 48da 0d84 236a 4e13 1a8c .......H..j#.N..
  66781. 803835c: 0d52 1b06 2057 6282 ae6a 4674 bffc 3506 R...W .bj.tF...5
  66782. 803836c: 8da4 d694 cbe5 8f56 b462 9274 759b 0d14 ......V.b.t..u..
  66783. 803837c: cfd4 24c8 d8f9 6ae3 dab9 1e6e db57 6496 ...$...j..n.W..d
  66784. 803838c: b72f 5a89 22d2 b239 912f d0a2 55b7 32e1 /..Z."9./....U.2
  66785. 803839c: ed31 745c 2d55 7009 f91c f2e5 5d29 14da 1.\tU-.p....)]..
  66786. 80383ac: f62c 9eaf 971e 080b a178 525a 562f 8c8f ,.......x.ZR/V..
  66787. 80383bc: b7c4 3d4b ef81 7654 b7b1 b1dd f480 258e ..K=..Tv.......%
  66788. 80383cc: b2d5 a9dd 4b54 73aa e09a e921 fb8a 14b0 ....TK.s..!.....
  66789. 80383dc: 5db5 5d34 1f65 a29e b476 b8e9 125a 83f2 .]4]e...v...Z...
  66790. 80383ec: c96a 5f84 4b51 3306 0c98 1269 3141 d735 j.._QK.3..i.A15.
  66791. 80383fc: 6ec0 6ceb 2d48 556f 968c 725a 61b3 c4b5 .n.lH-oU..Zr.a..
  66792. 803840c: f3dd 58b8 36af 69db 736a 48da 97ac 9bf7 ...X.6.ijs.H....
  66793. 803841c: 34c7 6231 1bdd 9075 d8da 4289 02e8 cf31 .41b..u....B..1.
  66794. 803842c: fdfa 12aa d422 aa38 d98b 9a66 1676 fbc6 ....".8...f.v...
  66795. 803843c: 64a7 e643 bb03 fab0 2462 2bdb a4f2 afda .dC.....b$.+....
  66796. 803844c: a169 7b6b f9e1 5ad7 35e7 2a91 57e7 a910 i.k{...Z.5.*.W..
  66797. 803845c: 1368 c2b0 bf09 c943 7595 1270 2d55 5ca4 h.....C..up.U-.\
  66798. 803846c: 074d 512b dc35 5c68 10bb 41d5 d2d5 5e04 M.+Q5.h\...A...^
  66799. 803847c: 2bd1 630d 1f46 16d2 6104 47dc 6e61 66e8 .+.cF....a.Gan.f
  66800. 803848c: 9750 116e b6e8 5122 619b a245 d100 80b8 P.n..."Q.aE.....
  66801. 803849c: a6ee ba49 eb6c 5292 7cc9 6f71 6974 9e24 ..I.l..R.|qoti$.
  66802. 80384ac: 1136 d6f3 b10e 24a1 5971 d80f d555 09ba 6......$qY..U...
  66803. 80384bc: b579 7a7d 7198 98d4 afb7 eae9 3571 fb9b y.}z.q......q5..
  66804. 80384cc: b3c8 6983 99a4 e249 4f52 3b9e 5d95 fbec ...i..I.RO.;.]..
  66805. 80384dc: ad35 50dd 5b2a 4ea7 1be8 39d5 f075 7490 5..P*[.N...9u..t
  66806. 80384ec: 7dc5 8a58 2eda ae9a e592 5b57 ce84 3d78 .}X.......W[..x=
  66807. 80384fc: 8a88 e3a6 481a 0d9d 212a 7e13 0f45 cc19 .....H..*!.~E...
  66808. 803850c: 3110 66a4 c504 5cd4 bb03 b3ad 9d21 55bc .1.f...\....!..U
  66809. 803851c: 5a31 c96a 86cd d2d5 d344 b5c7 7d32 2d5a 1Zj.....D...2}Z-
  66810. 803852c: 1d96 5ec1 762e 5a0b 06e1 f4a3 2752 e2fb ...^.v.Z....R'..
  66811. 803853c: 3af6 2dbe 9c67 ae80 e42a 682d 9f6f d316 .:.-g...*.-ho...
  66812. 803854c: db79 4e59 f3b6 39a7 a447 e1cc 2b02 919e y.YN...9G....+..
  66813. 803855c: a274 0b85 393d d76f 2909 556f 54b1 1968 t...=9o..)oU.Th.
  66814. 803856c: d76f 348d 9a13 5a68 d939 e897 d2b9 fc1e o..4..hZ9.......
  66815. 803857c: 6544 2467 d757 a183 1ca8 386b 83ae ed06 Deg$W.....k8....
  66816. 803858c: 1541 5e24 d15c 8240 5832 690c 0196 3a62 A.$^\.@.2X.i..b:
  66817. 803859c: 40ae d4dd 90d5 ddf6 00a8 e52d 56e3 cac3 .@........-..V..
  66818. 80385ac: 4707 f60d 7e9b 21de a09a 4b85 c456 0ba5 .G...~.!...KV...
  66819. 80385bc: cce1 e3f4 3793 58e5 2cc0 c2d0 0586 226e .....7.X.,....n"
  66820. 80385cc: e707 c101 e9e4 f18c e55b c009 818d b35e ........[.....^.
  66821. 80385dc: 61b4 0e77 0ec3 5242 35c5 c4c6 1969 11a1 .aw...BR.5..i...
  66822. 80385ec: bb63 073e 921a ad97 d3b6 2cd5 e731 e233 c.>........,1.3.
  66823. 80385fc: 2aa3 8eb8 5542 0c30 1238 de6d 41cb e412 .*..BU0.8.m..A..
  66824. 803860c: b897 237a b3c8 3120 b2e7 33a2 660c 7c3b ..z#.. 1...3.f;|
  66825. 803861c: 671c 98db 9a89 0571 f4d1 8b8f 60a3 5111 .g....q......`.Q
  66826. 803862c: 5f0a 7500 d4c8 9998 33c3 d624 da7e 2f67 ._.u.....3$.~.g/
  66827. 803863c: f94c 642b db1c b903 8f5f 97de f86a 14f5 L.+d...._...j...
  66828. 803864c: dd9e 7b4c b74e 5f5a 98dc 768f 2720 b665 ..L{N.Z_...v 'e.
  66829. 803865c: 659f 728a e409 a497 6cf8 7507 ee79 b77c .e.r.....l.uy.|.
  66830. 803866c: 1f0a f2ef 4d87 b13a bf0b 877f 3fc3 3973 .....M:......?s9
  66831. 803867c: 19c1 adac 13bb 07a6 3e23 8620 00fc 8673 ........#> ...s.
  66832. 803868c: 4e27 f1b8 5303 d2e2 d56a fd97 02e3 32a8 'N...S..j......2
  66833. 803869c: 03fb 15ce cefa f832 05d0 c54f aff0 a03c ......2...O...<.
  66834. 80386ac: 3e99 1ff4 0cd0 5ac1 189e 8d2a 9cc4 d0fd .>.....Z..*.....
  66835. 80386bc: fdd1 b27d 4f53 1db7 0d1a 138d aa42 804d ..}.SO......B.M.
  66836. 80386cc: d1ac cec8 f3a6 f670 0ab0 8be7 3845 f7b9 ......p.....E8..
  66837. 80386dc: f092 11af da37 8b51 271a c2ef 408c c4de ....7.Q..'...@..
  66838. 80386ec: 7f14 b616 822d f4dd 7f0b cdea 2e39 270a ....-.......9..'
  66839. 80386fc: c825 a3e0 18e1 f27c be67 a7ee 974f 14d4 %.....|.g...O...
  66840. 803870c: 427f 61c5 9370 d69d 3c3a 1f95 e043 2b4d .B.ap...:<..C.M+
  66841. 803871c: 28f6 d033 03ca 48e9 4574 6c04 5136 c291 .(3....HtE.l6Q..
  66842. 803872c: 5a09 92df f56b 550b 6fb5 b0e8 ada2 5d53 .Z..k..U.o....S]
  66843. 803873c: 68f1 75ba 4637 b0fb 32d9 6e86 60e5 e337 .h.u7F...2.n.`7.
  66844. 803874c: 13e5 557c 94e8 b7b5 8356 30f4 879b 37d4 ..|U....V..0...7
  66845. 803875c: f042 491d f8c8 ebc0 d7f3 7ea3 e96f 1d1a B..I.......~o...
  66846. 803876c: 3b9c e386 2765 09dc 0cd8 ea93 4fe2 59e8 .;..e'.......O.Y
  66847. 803877c: 4b53 7065 f7ee 5e0b d34d d99d b1ee ab39 SKep...^M.....9.
  66848. 803878c: 64f1 c621 ac9b d4e0 f2fd 2e19 51ef d23f .d!..........Q?.
  66849. 803879c: 24fd 577c 5f08 0230 c7df ba63 de30 60f7 .$|W._0...c.0..`
  66850. 80387ac: ef0e 9d63 4269 3269 29cb 76f4 6f80 5d9b ..c.iBi2.).v.o.]
  66851. 80387bc: 0012 517e 2d8f d730 12d1 8fac f525 0b65 ..~Q.-0.....%.e.
  66852. 80387cc: 2431 edf3 ee79 9f3a 4885 412b 2fa9 759d 1$..y.:..H+A./.u
  66853. 80387dc: f284 6e83 bf48 4c43 b78c 77f3 4640 372c ...nH.CL...w@F,7
  66854. 80387ec: 2f16 e9f3 fb7c 1d02 8141 4bb9 7c00 ba74 ./..|...A..K.|t.
  66855. 80387fc: e031 8a5f 7d4d ff5c ad79 83af 72c9 74cc 1._.M}\.y....r.t
  66856. 803880c: 5ba3 fc77 cec1 899c bf34 0b88 88a6 6883 .[w.....4......h
  66857. 803881c: 2233 28b0 0d96 21f0 ca37 60af 6ba2 4b04 3".(...!7..`.k.K
  66858. 803882c: 45a3 28d7 cd89 5a72 be88 0acd c3da 992c .E.(..rZ......,.
  66859. 803883c: da35 5ec3 0b96 81f7 458e 5112 4c04 93e1 5..^.....E.Q.L..
  66860. 803884c: 7b14 0045 a8a1 2fef 52b0 1767 5c1b a0d4 .{E..../.Rg..\..
  66861. 803885c: 1b4d 18ab 54d7 7dc1 6a8d 1c8c eb84 7899 M....T.}.j.....x
  66862. 803886c: f3fb 8f78 4ebf 21d3 10b7 f763 8f1e 4e02 ..x..N.!..c....N
  66863. 803887c: fa9f b247 1de9 2490 ab01 435b fbb3 76d7 ..G....$..[C...v
  66864. 803888c: 4458 1a22 9faf 11c8 81b2 6966 2ebb 7685 XD".......fi...v
  66865. 803889c: 66b6 879c 5327 4c6a 9dda c4a3 b54e 30f6 .f..'SjL....N..0
  66866. 80388ac: 2084 0ada b223 9764 5eb5 0999 28b3 2482 . ..#.d..^...(.$
  66867. 80388bc: 0eb1 d6a2 a10a 8e02 bddd a7c1 a968 814e ............h.N.
  66868. 80388cc: 0681 b6ef dd57 2791 0b0b 4894 4f27 5eb1 ....W..'...H'O.^
  66869. 80388dc: e6e0 558b ff78 7f84 8f26 bcb8 beb5 6b56 ...Ux...&.....Vk
  66870. 80388ec: ccc1 b23e a077 5a8f adf4 a825 6049 ec6f ..>.w..Z..%.I`o.
  66871. 80388fc: 32c0 c8e7 83ea 17cd f96a 9e1a e5af 74be .2......j......t
  66872. 803890c: eebe b882 15a9 22d9 f41d feef 1c4f c913 ......."....O...
  66873. 803891c: ff86 7ef7 4789 b98c 0a50 c9bc daad 3997 ...~.G..P......9
  66874. 803892c: 046c b958 9e9f cdc0 c4a2 d9e0 2205 7013 l.X..........".p
  66875. 803893c: 0da1 0209 a9b4 8561 4b87 a305 86fe 702d ......a..K....-p
  66876. 803894c: 9771 3fd3 06d1 50c6 b0ef a522 0d62 30a7 q..?...P..".b..0
  66877. 803895c: d8a1 b096 c340 2af2 fc51 3d6c d085 872f ....@..*Q.l=../.
  66878. 803896c: ceab cc52 edc8 f8cf 5d91 8774 53bd 0d4a ..R......]t..SJ.
  66879. 803897c: 44f1 d80c b5b7 3af6 e6ee 5d0f f170 6bc7 .D.....:...]p..k
  66880. 803898c: 3cd8 bd64 abbb b728 e64f f302 1396 f317 .<d...(.O.......
  66881. 803899c: bd54 35c1 d195 7b31 fb87 f476 8985 f4f1 T..5..1{..v.....
  66882. 80389ac: 59e3 924f b8b9 0c0c 7a88 baf1 450f 936d .YO......z...Em.
  66883. 80389bc: 461d b16a 422d 7044 6507 0f92 02f7 c1b7 .Fj.-BDp.e......
  66884. 80389cc: 7b35 dabf 45db f02d 1673 50e7 e792 7ce8 5{...E-.s..P...|
  66885. 80389dc: bb21 f92a 2e5e 4b19 54bd 85a1 31eb d69e !.*.^..K.T...1..
  66886. 80389ec: f529 50dc 22f3 722f 54a1 f279 c960 d46f )..P."/r.Ty.`.o.
  66887. 80389fc: 6277 57b2 d2fb 7071 a007 d78c 782b 0ba8 wb.W..qp....+x..
  66888. 8038a0c: b9a0 80f4 5b65 ef53 b5a8 d529 3e82 d060 ....e[S...)..>`.
  66889. 8038a1c: 3d7f 8131 6fda 7c8c 3f94 4a59 a069 664f .=1..o.|.?YJi.Of
  66890. 8038a2c: f23c f4f4 5377 a378 e391 f932 3ee2 0e5e <...wSx...2..>^.
  66891. 8038a3c: 0e8b 3dcf 3eeb b7b0 6665 df51 a90e c1de ...=.>..efQ.....
  66892. 8038a4c: 4508 93aa 4e98 523d 8dcd ad24 6dbe debc .E...N=R..$..m..
  66893. 8038a5c: 8bcd f22d 9b26 b7ba 4495 7db0 e027 ed3e ..-.&....D.}'.>.
  66894. 8038a6c: 21e4 006f 0261 bafb 1231 7661 8349 23f5 .!o.a...1.avI..#
  66895. 8038a7c: 081d 6259 7a8c 94cd 2380 1399 b625 25a5 ..Yb.z...#..%..%
  66896. 8038a8c: ea5c adb9 f615 344a dd36 b6f5 5534 19ae \.....J46...4U..
  66897. 8038a9c: 3a6f 1644 6fa4 f582 1617 56d9 1f6a 3fea o:D..o.....Vj..?
  66898. 8038aac: 0c3b 525a c6e1 fb29 1f4e 6168 af91 d3e0 ;.ZR..).N.ha....
  66899. 8038abc: 9dcb fb46 23d7 a1da c3bf 03fd dde1 2e16 ..F..#..........
  66900. 8038acc: 6d51 13f0 1ef1 b641 112e 24b8 1bc2 23e2 Qm....A....$...#
  66901. 8038adc: 9ba6 409d c5bb 3bd0 3bc5 cfb8 ff2f d906 ...@...;.;../...
  66902. 8038aec: 4dc4 3903 80b3 5902 555c 6555 df65 7ae0 .M.9...Y\UUee..z
  66903. 8038afc: 4856 c505 0c0d cc7c dce2 2638 3692 7262 VH....|...8&.6br
  66904. 8038b0c: bd8b 2d82 a776 61ef ed7a 2348 b2e3 d4f5 ...-v..az.H#....
  66905. 8038b1c: 620e 5b77 b869 df4b 015c 916f 1195 6526 .bw[i.K.\.o...&e
  66906. 8038b2c: bd9f 7686 00af ef77 8641 89ab 997e acad ...v..w.A...~...
  66907. 8038b3c: f5d8 e070 0741 9cb8 49eb 96cc 20e1 3e70 ..p.A....I... p>
  66908. 8038b4c: 8379 c005 1a33 cf58 f621 84bd 378f bbd8 y...3.X.!....7..
  66909. 8038b5c: 5f43 5d92 a9f6 e23e 2d74 1de7 3869 f363 C_.]..>.t-..i8c.
  66910. 8038b6c: 3405 fc37 e85e babb ba7a eca2 d705 a2d5 .47.^...z.......
  66911. 8038b7c: 78cd e4b1 7443 6b64 c83f 64c2 9e40 6f6f .x..Ctdk?..d@.oo
  66912. 8038b8c: 1d86 f0c1 d1f5 bdd3 9d74 5e19 93cf 31d7 ........t..^...1
  66913. 8038b9c: 6184 8ba7 0795 d70b 45de a49b 2b79 66f3 .a.......E..y+.f
  66914. 8038bac: de16 b789 f7b9 f0b6 96de ed67 9907 999b ..........g.....
  66915. 8038bbc: 1121 9839 81d5 bb82 c09f 44c2 c390 f97d !.9........D..}.
  66916. 8038bcc: e41f dda7 d7bc 005a 2f00 ......Z..
  66917. 08038bd5 <data__rotek_png>:
  66918. 8038bd5: 722f 746f 6b65 702e 676e 0000 5448 5054 /rotek.png..HTTP
  66919. 8038be5: 312f 312e 3220 3030 4f20 0d4b 530a 7265 /1.1 200 OK..Ser
  66920. 8038bf5: 6576 3a72 6c20 4977 2f50 2e31 2e33 2031 ver: lwIP/1.3.1
  66921. 8038c05: 6828 7474 3a70 2f2f 6173 6176 6e6e 6861 (http://savannah
  66922. 8038c15: 6e2e 6e6f 6e67 2e75 726f 2f67 7270 6a6f .nongnu.org/proj
  66923. 8038c25: 6365 7374 6c2f 6977 2970 0a0d 6f43 746e ects/lwip)..Cont
  66924. 8038c35: 6e65 2d74 654c 676e 6874 203a 3935 3935 ent-Length: 5959
  66925. 8038c45: 0a0d 6f43 6e6e 6365 6974 6e6f 203a 6c43 ..Connection: Cl
  66926. 8038c55: 736f 0d65 430a 6e6f 6574 746e 742d 7079 ose..Content-typ
  66927. 8038c65: 3a65 6920 616d 6567 702f 676e 0a0d 6143 e: image/png..Ca
  66928. 8038c75: 6863 2d65 6f43 746e 6f72 3a6c 7020 6972 che-Control: pri
  66929. 8038c85: 6176 6574 202c 616d 2d78 6761 3d65 3638 vate, max-age=86
  66930. 8038c95: 3034 0d30 0d0a 890a 4e50 0d47 1a0a 000a 400.....PNG.....
  66931. 8038ca5: 0000 490d 4448 0052 0100 0057 0000 08ae ...IHDR...W.....
  66932. 8038cb5: 0006 0000 db82 7d4e 0000 0e17 4449 5441 ......N}....IDAT
  66933. 8038cc5: da78 9ded ac7d 672c c059 a1cf 7a80 3285 x...}.,gY....z.2
  66934. 8038cd5: 4b45 1014 4db6 a62d ae0a b68a 52d8 45c7 EK...M-......R.E
  66935. 8038ce5: 4131 1b2d 1045 0b7a 7a53 bc69 6060 634d 1A-.E.z.Szi.``Mc
  66936. 8038cf5: d894 c326 6c55 d2ac c6c5 285e 2c91 951f ..&.Ul....^(.,..
  66937. 8038d05: 4a92 885d 4ad5 dd02 6a3f 9352 1ba2 36ac .J]..J..?jR....6
  66938. 8038d15: a246 011b 6d69 e76b 72d2 71fb 7729 df7d F...imk..r.q)w}.
  66939. 8038d25: 7793 9c75 cece 9fbc b333 7e7b fc7f 6f72 .wu.....3.{~..ro
  66940. 8038d35: 39ce fb3b bf39 e67d 9e79 79f7 9677 e5cb .9;.9.}.y..yw...
  66941. 8038d45: 000e f800 1785 0001 b900 0002 5720 0000 ............ W..
  66942. 8038d55: 0ae4 0000 15c8 0000 02b9 2000 0057 4000 ........... W..@
  66943. 8038d65: 00ae c800 0015 b900 0002 7200 0005 ae40 ...........r..@.
  66944. 8038d75: 0000 15c8 0000 2b90 0000 0572 4000 00ae .......+..r..@..
  66945. 8038d85: 8000 015c 9000 002b 7200 0005 e400 000a ..\...+..r......
  66946. 8038d95: 5c80 0001 2b90 0000 5720 0000 0ae4 8000 .\...+.. W......
  66947. 8038da5: 015c 0000 02b9 2000 0057 e400 000a c800 \...... W.......
  66948. 8038db5: 0015 b900 0002 5720 0000 eae4 c19f 5f6b ...... W......k_
  66949. 8038dc5: 96b7 8fdd bede 440d 3882 9a47 ff23 def3 .......D.8G.#...
  66950. 8038dd5: 3c96 d6df ed38 377d 7e56 009e c824 3375 .<..8.}7V~..$.u3
  66951. 8038de5: dae5 8c17 1304 5cc1 b4b0 de40 aa6e 138e .......\..@.n...
  66952. 8038df5: 4d23 0ae4 75c8 ca3f 4655 89a5 6192 2966 #M...u?.UF...af)
  66953. 8038e05: 3ad3 7532 44fc 1fdd 4522 80ae b75c ae56 .:2u.D.."E..\.V.
  66954. 8038e15: 8ab1 974e 202d 3b45 a644 15c8 eb90 c936 ..N.- E;D.....6.
  66955. 8038e25: 4655 8b8f a496 645a 3441 5c8b b901 ba6e UF....ZdA4.\..n.
  66956. 8038e35: bb5c d524 b4b2 08c1 22b9 4057 9bae d724 \.$......"W@..$.
  66957. 8038e45: a1d8 5530 2cc5 2450 231b e457 c801 cbb5 ..0U.,P$.#W.....
  66958. 8038e55: 9572 da97 0763 cdd1 edd5 1557 48ff 5db3 r...c.....W..H.]
  66959. 8038e65: 512b 9bb7 e63b 2364 0ae4 5c80 26bb bed7 +Q..;.d#...\.&..
  66960. 8038e75: 0a45 5320 ae05 47a1 45b1 78ea 8b13 844e E. S...G.E.x..N.
  66961. 8038e85: 3f6c bd16 2b90 d720 caee 6475 7971 54df l?...+ ...udqy.T
  66962. 8038e95: 2951 48b1 8c27 2b91 7200 5b6d 13ae a943 Q).H'..+.rm[..C.
  66963. 8038ea5: 95b6 ecdf 3c59 08d6 02b9 d720 e5a6 191a ....Y<.... .....
  66964. 8038eb5: 38e4 1d67 1a2a 0cf5 d922 7ef9 2c10 0572 .8g.*..."..~.,r.
  66965. 8038ec5: dae4 b91d 8aea b5d5 a9dd 9857 1023 9c7b ..........W.#.{.
  66966. 8038ed5: 302b ccd4 cec9 7db7 017e 0572 dae4 b90d +0.....}~.r.....
  66967. 8038ee5: 8aea 6675 a521 caa1 ce77 722c 63b8 c28b ..uf!...w.,r.c..
  66968. 8038ef5: a458 04ba 75f6 8b04 015c b6b9 572f b15d X....u..\.../W].
  66969. 8038f05: 86a6 9d42 faee ea5f 189a bd16 adf6 9160 ..B..._.......`.
  66970. 8038f15: 202b 4d57 06b9 ec14 53d4 532b d2a4 a105 + WM.....S+S....
  66971. 8038f25: 6f57 4a65 3af4 ec52 a46b e609 15c8 2b90 WoeJ.:R.k......+
  66972. 8038f35: f572 58cd 6443 8efd 892e 34cd 69a3 c11d r..XCd.....4.i..
  66973. 8038f45: 904e 202b e457 8bea 07a1 f6b1 2d03 f55f N.+ W........-_.
  66974. 8038f55: d4bd 4755 09b0 0572 8ae4 7d5c 59e4 4733 ..UG..r...\}.Y3G
  66975. 8038f65: 8eb1 bb76 b435 7525 6c14 4db6 041d 15c8 ..v.5.%u.l.M....
  66976. 8038f75: ab90 5c81 0a3d 2eb6 1acf 88d7 6279 9059 ...\=.......ybY.
  66977. 8038f85: 6b4a 0be6 e6ac 8c0a 872c d76e 122d 13a8 Jk......,.n.-...
  66978. 8038f95: 0cec 02b9 4572 a1ae 01d2 4f23 0c8b 4bf2 ....rE....#O...K
  66979. 8038fa5: 5d62 af1f e749 5d41 4007 f0e2 91fc 202b b]..I.A].@....+
  66980. 8038fb5: e457 56ba 8b8e e89a 87d2 2758 2e01 4db1 W..V......X'...M
  66981. 8038fc5: ba96 09d6 5c76 1e93 9088 202b 7dd7 5726 ....v\....+ .}&W
  66982. 8038fd5: c147 35a6 a185 51c8 f3ac 9606 eac4 752e G..5...Q.......u
  66983. 8038fe5: 13ad 7cec bb9b 9007 202b e6d7 5ae4 c457 ...|....+ ...ZW.
  66984. 8038ff5: 1d8a b472 8ba6 9a0c da9a af35 bfc9 dd56 ..r.......5...V.
  66985. 8039005: 87b6 015c eeb9 b933 0a5a b536 074c 01a4 ..\...3.Z.6.L...
  66986. 8039015: a5e6 9e46 0ae6 f6b8 8eb0 35b7 457a 80ae ..F........5zE..
  66987. 8039025: 9b5c 6b91 d45d abda dad8 c7c5 8322 2155 \..k].......".U!
  66988. 8039035: 6749 b5d8 f6e9 3ad9 1d82 7e7a 905d 202b Ig.....:..z~].+
  66989. 8039045: 6dd7 ab95 60a1 8b13 f9cb e2ba 8e97 2358 .m...`........X#
  66990. 8039055: fc75 376c 52ec 9d57 d61e 22c8 f732 ea91 u.l7.RW...."2...
  66991. 8039065: 0d58 f1ad 58c5 ae3d 2ab4 afda 6b91 8824 X....X=..*...k$.
  66992. 8039075: a905 2c60 8198 9277 6bc2 323e bdbc 07ae ..`,..w..k>2....
  66993. 8039085: de5c 1ebf 7572 ec17 22c2 ab3a 074b 1ac4 \...ru...":.K...
  66994. 8039095: 542d 52b6 19b5 5873 d827 4589 baf4 20f0 -T.R..sX'..E...
  66995. 80390a5: a6d7 a956 f38d 65ef 5c89 7523 cf82 4b05 ..V....e.\#u...K
  66996. 80390b5: ce08 f0a8 cffa 6e0c 2bab 89d7 63e5 04cb .......n.+...c..
  66997. 80390c5: 227d 7757 f6b9 842d 73d3 85ec 049d 4892 }"Ww..-..s.....H
  66998. 80390d5: 22dd c481 48b2 5a95 14a4 5f5c 50fb d7c8 ."...H.Z..\_.P..
  66999. 80390e5: ca3e b5c9 70e7 8212 713d 5ce1 0ccd 3b6e >....p..=q.\..n;
  67000. 80390f5: 280e c5d6 ac4a d5c8 b05d 4555 be9b 36c5 .(..J...].UE...6
  67001. 8039105: 332f 8b8f 6c0c 9377 2c8d 1b3b be6c 5c4c /3...lw..,;.l.L\
  67002. 8039115: 5b0a ddc3 e696 082d c6b9 24ea 7445 90ed .[....-....$Et..
  67003. 8039125: 473f 8e7b 6f51 0af1 f6c4 63ea 6eae ce4f ?G{.Qo.....c.nO.
  67004. 8039135: 93d5 1760 6d86 914a fae5 26fb aac4 5823 ..`..mJ....&..#X
  67005. 8039145: 22db b4d5 39e2 e887 0e2b 77ca e07c cb33 ."...9..+..w|.3.
  67006. 8039155: 5f0b 3177 6b92 4587 fce1 1d8c 5ea3 621f ._w1.k.E.....^.b
  67007. 8039165: 169d 8ac5 dd5c dae4 b8b3 1fb4 1659 7478 ....\.......Y.xt
  67008. 8039175: a897 3aae 7a01 8f25 6875 0ab8 a6cb 7607 ...:.z%.uh.....v
  67009. 8039185: 916c b052 185d dd31 716d cd98 bf99 07fd l.R.].1.mq......
  67010. 8039195: ae88 8a1d d339 f0d4 91f6 b167 e84e 7016 ....9.....g.N..p
  67011. 80391a5: ab6c 9430 cf4c d230 aaad 8fb8 fd76 892e l.0.L.0.....v...
  67012. 80391b5: 348d cd66 6dd6 bd97 8c30 a344 5d00 8b03 .4f..m..0.D..]..
  67013. 80391c5: e536 8cfa bd3f d10d 43b5 90ea 5d1f 9c94 6...?....C...]..
  67014. 80391d5: 7ddb 9cc3 6ead 018a 3ab9 7608 5862 ef05 .}...n...:.vbX..
  67015. 80391e5: 885b a7ac 06d1 5b65 8a14 3a35 fa0e 8b1e [.....e[..5:....
  67016. 80391f5: 3354 d3cf 5ab2 c51f a3f8 de87 ec85 679a T3...Z.........g
  67017. 8039205: 3858 e72f 510e 8baf 1358 5cfa ca3d 20b5 X8/..Q..X..\=..
  67018. 8039215: 45d8 915d f0a6 a9f7 a445 f13b c8b4 f7c0 .E].....E.;.....
  67019. 8039225: c098 a2c8 5548 fcf5 be6d 9018 feeb 5fa4 ....HU..m......_
  67020. 8039235: 2738 a36d d8de ac52 c959 4063 beae 7ae4 8'm...R.Y.c@...z
  67021. 8039245: fae0 4ee9 d4dd 57fd e9bc 45ad cf21 f2ea ...N...W...E!...
  67022. 8039255: 059b d719 6cb5 1af9 52e2 d827 61be 73ce .....l...R'..a.s
  67023. 8039265: 2161 d344 892f a2c4 accd 508a cd72 9537 a!D./......Pr.7.
  67024. 8039275: 102f f7a3 814e 65be 99b4 68f8 42b5 feae /...N..e...h.B..
  67025. 8039285: dae5 7213 891d 9c76 a4a5 144c eff2 72f2 ...r..v...L....r
  67026. 8039295: 2715 4ee1 ce5d dcf1 2e4b 8937 7d74 720f .'.N]...K.7.t}.r
  67027. 80392a5: 5919 a244 8255 0c8b dda3 7038 80a7 61af .YD.U.....8p...a
  67028. 80392b5: 3a35 cd72 8454 5654 8938 241d 6b1b 5a92 5:r.T.TV8..$.k.Z
  67029. 80392c5: 0de4 0363 ab4c b1e8 f267 e7af 22d0 b5ea ..c.L...g...."..
  67030. 80392d5: eb15 cd7c 8a7b 2b5c 845e 87fc 5532 881f ..|.{.\+^...2U..
  67031. 80392e5: b455 9b61 598f b90a ab66 88e3 7093 ab26 U.a..Y..f....p&.
  67032. 80392f5: dfcb d577 f7fb 2c84 795b 62f2 8f91 2563 ..w....,[y.b..c%
  67033. 8039305: 9cd7 8d60 5f8a f43f dff6 79da afe5 dc1c ..`.._?....y....
  67034. 8039315: c9f9 5e37 23ba 6bee 95e7 bfaf ef64 1e98 ..7^.#.k....d...
  67035. 8039325: 440a 4599 c4b7 593a 9e66 2cbe 8666 6b51 .D.E..:Yf..,f.Qk
  67036. 8039335: e388 7f2e cde2 56bf 0276 6af6 ba4e 52c8 .......Vv..jN..R
  67037. 8039345: b1b0 49e6 3a9d 8244 1a3b dd8f f8a5 9be4 ...I.:D.;.......
  67038. 8039355: e2d4 78f1 b56b ae42 27ff 9ed7 d6fa bb1a ...xk.B..'......
  67039. 8039365: d38a f217 14e4 9412 258f 2215 564c 1c97 .........%."LV..
  67040. 8039375: e235 8b4a 7d42 a5f9 bebf ae56 1fa2 e773 5.J.B}....V...s.
  67041. 8039385: 5ffc f64d e67e a970 f7dd cb24 2799 9ab9 ._M.~.p...$..'..
  67042. 8039395: fd2c 849d ab92 6443 fb13 4cae 98e7 563a ,.....Cd...L..:V
  67043. 80393a5: 7dcf ee3e b038 675c 9c0d 13a7 b706 cbd4 .}>.8.\g........
  67044. 80393b5: dd35 bc94 9092 5ce4 ba46 5fa7 e1fd 96bd 5......\F.._....
  67045. 80393c5: b29f 97e2 a894 5ca9 166b 4444 7d16 a6bb .......\k.DD.}..
  67046. 80393d5: 9cb2 8c5a 3465 9c79 e2ae 6ed6 92ef 8def ..Z.e4y....n....
  67047. 80393e5: 914d b2c3 6dca 0512 0c2e b223 9190 1462 M....m....#...b.
  67048. 80393f5: ae58 f3a1 c9d8 a980 db58 d725 08b2 ecf7 X.......X.%.....
  67049. 8039405: 8e2b 9dec 52d0 e72e 3c1d 2d64 9ad7 7608 +....R...<d-...v
  67050. 8039415: 49ee 3396 5cc3 2ce9 a760 1c40 b8e2 bce7 .I.3.\.,`.@.....
  67051. 8039425: 4af3 a89b f5d2 5692 b8e7 2f21 27db f281 .J.....V..!/.'..
  67052. 8039435: 55c4 9e44 ab9e 4769 3240 e460 b6a0 475c .UD...iG@2`...\G
  67053. 8039445: 52db 1531 9d72 890b 42a6 7da8 b91b dfca .R1.r....B.}....
  67054. 8039455: b619 f97e a592 b90f 169a 7c9e adcd 5ffd ..~........|..._
  67055. 8039465: 7d9e cddd 972e b6d6 98c5 c034 fb65 83b0 .}........4.e...
  67056. 8039475: e197 7a45 531e 3e2b bb87 d720 5c9c b9fb ..Ez.S+>.. ..\..
  67057. 8039485: d542 5738 4ac0 bf2d f351 9fb7 28f8 5982 B.8W.J-.Q....(.Y
  67058. 8039495: 10a6 4216 e3ae 6895 e575 26ba 9045 806e ...B...hu..&E.n.
  67059. 80394a5: 275c 9116 3aeb 3646 68cb 850b 91ac c9e5 \'...:F6.h......
  67060. 80394b5: 0717 ab90 2569 34dc d195 eb76 7155 6b86 ....i%.4..v.Uq.k
  67061. 80394c5: c8c8 4235 0dae 62b7 d019 2753 fc90 a7c0 ..5B...b..S'....
  67062. 80394d5: 70aa 0f35 5a2d d119 810a b6f6 ae58 36b3 .p5.-Z......X..6
  67063. 80394e5: 0e17 d214 4b01 ee8d 2680 3ae5 841e 14eb .....K...&.:....
  67064. 80394f5: b7e8 d620 c799 bae7 341c e9dc 5c80 621b .. ......4...\.b
  67065. 8039505: b425 07dc 1135 dbd2 5ceb 3108 4961 5cca %...5....\.1aI.\
  67066. 8039515: 2076 c954 44b5 33b0 82c3 1b53 ed72 5892 v T..D.3..S.r..X
  67067. 8039525: 0ee7 099f 28d3 e473 b2f9 167d 8d38 fa11 .....(s...}.8...
  67068. 8039535: 3cf2 8a74 39c2 457a edae 75c8 290f f93d .<t..9zE...u.)=.
  67069. 8039545: 14af ae60 79c1 b3e2 2a0a 9d8e 8949 68cb ..`..y...*..I..h
  67070. 8039555: 4cb6 9aae 7a4b 5b4d a6ab f386 756f dae5 .L..KzM[....ou..
  67071. 8039565: 436b 32aa 5ac7 d3d2 9aea 4b9b fe07 9adb kC.2.Z.....K....
  67072. 8039575: 524c 9352 8fc0 c437 038e cfb6 95b5 2bdc LRR...7........+
  67073. 8039585: 7572 e4bb 3a77 414e 65ae b1f7 5b27 4829 ru..w:NA.e..'[)H
  67074. 8039595: 3d5f 427b f1ae b91a ebf6 f496 e87a 982e _={B........z...
  67075. 80395a5: f639 36a2 203a b65b 95c1 ab44 f23e 36ad 9..6: [...D.>..6
  67076. 80395b5: 5791 145d ba15 7fc1 82da e35c f38a edaf .W].......\.....
  67077. 80395c5: 1a82 0d72 d724 62b4 b91d a8f7 1577 cad9 ..r.$..b....w...
  67078. 80395d5: aa7c bc8f caad c6ff b905 2d8e cb06 ee84 |..........-....
  67079. 80395e5: 6d8b 407d 5cb6 b74d 6a26 6d75 3792 c2f9 .m}@.\M.&jum.7..
  67080. 80395f5: 0c5c 6fda 6ff0 3663 d442 a742 8b00 5a08 \..o.oc6B.B....Z
  67081. 8039605: 6b96 586c 8824 7894 b927 84ee 50c8 7bae .klX$..x'....P.{
  67082. 8039615: 009d d2ea f7be 8b8a 1b2f 4929 16ba 620c ......../.)I...b
  67083. 8039625: 8dcb 6304 de8b 9b52 c37d 1f5a 2d90 d823 ...c..R.}.Z..-#.
  67084. 8039635: 8235 95b5 30eb 09c0 ba1e bfc1 1ded da07 5....0..........
  67085. 8039645: 514c 90f4 736b ed72 445b d904 0f9a f690 LQ..ksr.[D......
  67086. 8039655: 59e5 ae4e 423b 7bae d3b9 6895 225d 1fda .YN.;B.{...h]"..
  67087. 8039665: cb7f 4ce1 15e6 c50d 3a67 b042 a1e7 7fd1 ...L....g:B.....
  67088. 8039675: 56de ab31 dbd0 2aea d357 fc66 e7a1 6663 .V1....*W.f...cf
  67089. 8039685: 3b81 4c1b c187 d194 b00f e081 32dc 9f02 .;.L.........2..
  67090. 8039695: d720 0b66 a65a b879 a7a9 fa0f 391e eeb9 .f.Z.y......9..
  67091. 80396a5: 3ffd 8b97 6d4a e12f 7e64 30b1 a654 09aa .?..Jm/.d~.0T...
  67092. 80396b5: 6e7f 9c58 1c4a fd1b 1f5b 2d90 dcbe 2c7c .nX.J...[..-..|,
  67093. 80396c5: 348f 17cd 0166 b872 e9a6 d0ab b3fd cca6 .4..f.r.........
  67094. 80396d5: c52d 391a c54c 21ea e6d7 3ae4 5c33 9daf -..9L..!...:3\..
  67095. 80396e5: 4458 2326 bc75 d551 9b9b eb93 bbff bcf4 XD&#u.Q.........
  67096. 80396f5: f5e0 b66f 422a b9c8 6a06 c1a6 3578 a620 ..o.*B...j..x5 .
  67097. 8039705: 55d0 b7d0 cb58 363f 3b4c 2eb8 1d7b 1c56 .U..X.?6L;..{.V.
  67098. 8039715: 3527 fe1c c7b2 0ecb a6ff 6a8f 34f2 d450 '5.........j.4P.
  67099. 8039725: b214 1e0a 7fb2 67d6 a360 1afb 1236 22bd .......g`...6.."
  67100. 8039735: 7b57 86c6 4691 1964 2c49 690a b184 646e W{...Fd.I,.i..nd
  67101. 8039745: e420 8f9a 8d66 0e3a 9464 2226 54d9 faae ...f.:.d.&".T..
  67102. 8039755: 912a c4eb 8262 c2d6 6871 e98b ec80 c6be *...b...qh......
  67103. 8039765: 5792 4dd7 b309 11c0 6ea0 64c4 343b a77a .W.M.....n.d;4z.
  67104. 8039775: 5103 cfb1 9c94 14ae 26d3 57a2 6ae4 d0cf .Q.......&.W.j..
  67105. 8039785: ef22 b53a e378 15fa ff09 d14a b92a 4f16 ".:.x.....J.*..O
  67106. 8039795: a36e 6d6f a139 2e4b cdad b5c9 772a f0ba n.om9.K.....*w..
  67107. 80397a5: 53b8 136e b203 8ea7 3572 6969 d9b2 69af .Sn.....r5ii...i
  67108. 80397b5: 0832 2053 cd33 6715 0683 ebaa 9e81 7f6b 2.S 3..g......k.
  67109. 80397c5: a04d 8593 5e8e ab91 913d 65c5 6257 8df9 M....^..=..eWb..
  67110. 80397d5: 175f acf1 630a df5a a2ac 3580 8934 d446 _....cZ....54.F.
  67111. 80397e5: b20a e554 2746 b79e ef14 b6ed 2037 48db ..T.F'......7 .H
  67112. 80397f5: 15d8 badb 45d4 a382 91c0 9752 6406 7977 .....E....R..dwy
  67113. 8039805: 185b cb1f 6367 dae4 0acc 99ad 1145 6162 [...gc......E.ba
  67114. 8039815: 1559 189e 965c 3525 cd72 8157 0667 ec51 Y...\.%5r.W.g.Q.
  67115. 8039825: a2a2 a0ab 7b6a 85f0 be63 d435 ec80 d778 ....j{..c.5...x.
  67116. 8039835: 9edf 9359 89c2 b7d7 52b9 6cb0 eff2 80d2 ..Y......R.l....
  67117. 8039845: 2eec f731 5858 4e34 207b 3757 1646 ad79 ..1.XX4N{ W7F.y.
  67118. 8039855: 61c4 b33d 8449 a992 e76f 855e ad5c 2b24 .a=.I...o.^.\.$+
  67119. 8039865: abb7 2831 c564 5b16 bb8a 0a76 21a4 1ae4 ..1(d..[..v..!..
  67120. 8039875: 0662 8584 5c14 e7ab 07a1 7764 ba89 3ae7 b....\....dw...:
  67121. 8039885: 1909 22bd 70d7 81a9 6599 3af4 c8d5 6539 ...".p...e.:..9e
  67122. 8039895: 1f16 58b2 4a33 8ad1 64b4 9714 25db 2aa1 ...X3J...d...%.*
  67123. 80398a5: 9d6a faec f5d9 c435 6c80 e5a3 0db4 2109 j.....5..l.....!
  67124. 80398b5: 68b3 09fb ecb9 9375 9ae5 fc0e c716 a28c .h....u.........
  67125. 80398c5: e457 ceea e2d4 ae1b 292e d63f fa90 32c4 W........)?....2
  67126. 80398d5: d222 14a9 3a27 9702 9c91 01da b477 1ada "...':......w...
  67127. 80398e5: a07c 3dbf dcf8 df70 df2c b203 728d f2ae |..=..p.,....r..
  67128. 80398f5: a48b b121 03f6 b65f 0e9b 4ec8 5836 f1ae ..!..._....N6X..
  67129. 8039905: 6fc0 8427 b1d1 6b91 a5d8 33b0 3c87 8e99 .o'....k...3.<..
  67130. 8039915: 7b04 b24a 91a6 42ec 1073 5688 22d4 6ea7 .{J....Bs..V.".n
  67131. 8039925: 96c9 12ad 4eb9 862c b8c1 ceae 42ca d16c .....N,......Bl.
  67132. 8039935: bf2d 3a44 d628 1a26 7bfc 2c1b 5ed7 9cc0 -.D:(.&..{.,.^..
  67133. 8039945: 0cf2 36b9 7233 6170 0df1 d3a7 620e 0972 ...63rpa.....br.
  67134. 8039955: 1c37 dfac 36d9 edcb 30c0 5c34 de57 f9d3 7....6...04\W...
  67135. 8039965: 9776 5b2d e3ab f46a 6691 6286 e935 3573 v.-[..j..f.b5.s5
  67136. 8039975: 0d99 ed3b 5c88 0e17 9aab 7642 b40a bdb9 ..;..\....Bv....
  67137. 8039985: c84b 014e 435f 6269 1ae4 ae5e 6589 5675 K.N._Cib..^..euV
  67138. 8039995: 5be7 3273 bf08 a68b bcae bab3 b1d9 1252 .[s2..........R.
  67139. 80399a5: be2f daf2 d6ba d4a9 ae42 edba e358 00dd /.......B...X...
  67140. 80399b5: 1abb 9404 d4eb fdf1 a26d dfc1 47a6 6db7 ........m....G.m
  67141. 80399c5: 0d66 3ea4 c866 99b5 d961 cb0b 3408 ccd1 f..>f...a....4..
  67142. 80399d5: f695 203b 48d8 3fa3 1330 9d72 44d6 91ad ..; .H.?0.r..D..
  67143. 80399e5: 5ca5 8d23 3368 2109 35d7 5b83 a35c a1d5 .\#.h3.!.5.[\...
  67144. 80399f5: f787 a9a4 ff06 4b7e 0763 1a9b 9d74 8ef9 ......~Kc...t...
  67145. 8039a05: 915e 336b d7b9 5cba 6e97 7343 301a cd8a ^.k3...\.nCs.0..
  67146. 8039a15: 58e7 35a7 aaf9 aeda ef82 723d 75d4 5645 .X.5......=r.uEV
  67147. 8039a25: 0b5d 64d5 1e4d de36 b40d 971f e8a7 316d ]..dM.6.......m1
  67148. 8039a35: b0f0 736d 9d43 6502 919f 8a91 bad8 da2e ..msC..e........
  67149. 8039a45: a0d1 ae99 0588 6d72 b226 399b 9114 ab74 ......rm&..9..t.
  67150. 8039a55: 99ff c967 1546 07b3 eeaa 36a7 3d8a 8afb ..g.F......6.=..
  67151. 8039a65: ae23 021d 229d 9727 c5b9 3809 b1f6 057b #...."'....8..{.
  67152. 8039a75: 0e6c d5c8 f6ff 992f 0f43 c8eb 5f22 5897 l...../.C..."_.X
  67153. 8039a85: 768a d9a8 5069 f977 995a 958b 0c63 a32d .v..iPw.Z...c.-.
  67154. 8039a95: 2eca b5ca e5f8 ab12 2cf7 435d 91dc 397c .........,]C..|9
  67155. 8039aa5: d720 d8ad 30a0 cc75 0d7b 2f2d e73f 9db9 ....0u.{.-/?...
  67156. 8039ab5: 860e c325 d387 375c cd81 4fe5 26bf 9dfa ..%...\7...O.&..
  67157. 8039ac5: 08d5 3c76 df28 7671 e553 800a 5b5c fdd8 ..v<(.qvS...\[..
  67158. 8039ad5: 4eb5 8960 0446 ef3c ee48 a4ca b698 8bf6 .N`.F.<.H.......
  67159. 8039ae5: bce5 8783 ad8a c85a 9015 722b cab5 6663 ......Z...+r..cf
  67160. 8039af5: f703 0245 a0e9 16dd 9b18 4802 f15c f798 ..E........H\...
  67161. 8039b05: 8b04 015c 22b9 90d7 03dd f2ba 39ea 980c ..\..".......9..
  67162. 8039b15: d970 b2f1 f9a7 8cd8 6f22 d8b9 a1c0 0b15 p......."o......
  67163. 8039b25: 02b9 4572 daae ac3d bdba 3d87 3395 150d ..rE..=....=.3..
  67164. 8039b35: 66c9 5206 77cd ac37 e45b 3550 c0ff dfa8 .f.R.w7.[.P5....
  67165. 8039b45: b912 7202 ae45 fdb6 7373 49c3 8948 14ea ...rE...ss.IH...
  67166. 8039b55: 21f0 d35a 838e e2b2 5555 365e 16dd 22c1 .!Z.....UU^6..."
  67167. 8039b65: 400c ddae ab92 0f6e 666b f8d1 5abc 3339 .@....n.kf...Z93
  67168. 8039b75: f752 d551 bddc 2f9a c930 09b5 5cf9 9b02 R.Q..../0....\..
  67169. 8039b85: cc59 ddb0 c128 0c22 ae40 93dd e9ab 024e Y...(.".@.....N.
  67170. 8039b95: 8ebd 507d 037a 69fd 89f7 fae1 64f4 0453 ..}Pz..i.....dS.
  67171. 8039ba5: 308b b900 5376 a6ae 2203 1dc6 4068 0c8f .0..vS..."..h@..
  67172. 8039bb5: 163b 1ac6 7651 3ae6 1463 02b9 4572 d6ae ;...Qv.:c...rE..
  67173. 8039bc5: a883 3507 b55b 1034 9aa9 81b6 0625 9ec7 ...5[.4.....%...
  67174. 8039bd5: 98fb 8a65 015c 22b9 b2d7 ce08 9174 d4c0 ..e.\.."....t...
  67175. 8039be5: c0f3 aa8f b125 67a1 4691 cf25 617f a913 ....%..g.F%..a..
  67176. 8039bf5: 5723 ae40 d5c8 7c66 badf 7668 da25 87be #W@...f|..hv%...
  67177. 8039c05: 3508 d819 66ed 3ae0 b48b b04c f3b6 9146 .5...f.:..L...F.
  67178. 8039c15: 202b e457 bf6a 6029 174d b8c0 ae62 ac40 + W.j.)`M...b.@.
  67179. 8039c25: 9e7e 2f9f d2e0 e5c6 166b 9969 c760 c72e ~../....k.i.`...
  67180. 8039c35: ae44 5c80 6b91 96d7 b6ba ee31 9d70 8760 D..\.k....1.p.`.
  67181. 8039c45: 5e21 e463 c80a 7f75 d5ca 3aa6 c5df b125 !^c...u....:..%.
  67182. 8039c55: 043e 859b 94e8 ae40 5c80 aff7 8b5c 5d92 >.....@..\..\..]
  67183. 8039c65: 2474 6d52 5ba2 df21 35a6 7221 e405 5c8a t$Rm.[!..5!r...\
  67184. 8039c75: 3343 6834 f7e0 69b9 d25e 73c2 bbed 5ce6 C34h...i^..s...\
  67185. 8039c85: 2b91 5720 6ae4 cd13 5aae 7ca5 b447 750b .+ W.j...Z.|G..u
  67186. 8039c95: 64dc c5b0 f393 2b91 5720 aae4 db2b 0ed5 .d.....+ W..+...
  67187. 8039ca5: 7503 0573 12f2 a99d 74c8 59d5 dbd0 1f2f .us......t.Y../.
  67188. 8039cb5: e476 c80a 0015 9000 002b 7200 0005 ae40 v.......+..r..@.
  67189. 8039cc5: 0000 5c80 0001 2b90 0000 0572 0000 0ae4 ...\...+..r.....
  67190. 8039cd5: 8000 015c 9000 002b 2000 0057 e400 000a ..\...+.. W.....
  67191. 8039ce5: 5c80 0001 b900 0002 5720 0000 0ae4 0000 .\...... W......
  67192. 8039cf5: 15c8 0000 02b9 2000 0057 4000 00ae c800 ....... W..@....
  67193. 8039d05: 0015 b900 0002 7200 0005 ae40 0000 15c8 .......r..@.....
  67194. 8039d15: 0000 2b90 0000 0572 4000 00ae fb00 ae5c ...+..r..@....\.
  67195. 8039d25: f63f 6685 ca79 1883 db0e 3781 001f 6b90 ?..fy......7...k
  67196. 8039d35: b940 75b6 9aff 3f92 cb76 ad45 89c3 d002 @..u...?v.E.....
  67197. 8039d45: b96d 761e eb90 0433 0917 283e 82f8 41e0 m..v..3...>(...A
  67198. 8039d55: 49c1 23c1 7f82 dc13 7822 e087 0d79 f5cb .I.#...."x..y...
  67199. 8039d65: 824d 3af3 d72c 0b97 412e 00ae 2bdb 8bd7 M..:,....A...+..
  67200. 8039d75: 9905 5c85 2e9f 4cb8 9ff0 a582 2706 d704 ...\...L.....'..
  67201. 8039d85: be0b 01bb 1eb9 7c10 7045 60a7 83b7 dd72 .......|Ep.`..r.
  67202. 8039d95: dc15 f821 e09a c859 6015 e4fb 103a 213c ..!...Y..`..:.<!
  67203. 8039da5: d478 ae50 2c3f 27f8 a94d 7916 7058 6079 x.P.?,.'M..yXpy`
  67204. 8039db5: beb9 7727 077f 283b 37d7 9608 f78a 5722 ..'w..;(.7...."W
  67205. 8039dc5: ed80 eb92 054b 04c7 854b 5cae 417f 8df0 ....K...K..\.A..
  67206. 8039dd5: 3082 25bf bcf8 dde0 5f82 5c14 7820 e0b5 .0.%....._.\ x..
  67207. 8039de5: e0b0 2a13 5045 ec94 089f 169e ae40 122f ...*EP......@./.
  67208. 8039df5: cf1c cfdd 5557 db24 b915 101e 47fc ae4e ....WU$......GN.
  67209. 8039e05: 098f 40ce 00ae 21db d3d7 5f05 89ca 5755 ...@...!..._..UW
  67210. 8039e15: 03ae 13c1 4905 2ade a738 5446 11cf 255c .....I.*8.FT..\%
  67211. 8039e25: b478 db70 01a3 7ae4 8953 8fc8 4874 57ae x.p....zS...tH.W
  67212. 8039e35: c4e5 e2ba e466 b00a 72f9 76fd dfc1 c415 ....f....r.v....
  67213. 8039e45: 2dfa b90d 88ca bff0 390b 43d4 b206 a17a .-.......9.C..z.
  67214. 8039e55: cbe0 e225 d4bb 5ca3 57cf b4c5 7de2 571c ..%....\.W...}.W
  67215. 8039e65: bf8f b96d 40be bc70 ae44 0b92 2b91 e6c0 ..m..@p.D....+..
  67216. 8039e75: 75ca 7057 4163 92ac 35fb 7ae4 4e6b 3256 .uWpcA...5.zkNV2
  67217. 8039e85: fd7a 0359 9d51 f82e 35d7 d839 0baf ef9e z.Y.Q....59.....
  67218. 8039e95: ae41 c532 5770 ae45 93f7 901d c7eb 88d7 A.2.pWE.........
  67219. 8039ea5: 3255 3c17 b90d 6c02 5ca6 b77f ac44 a0b2 U2.<...l.\..D...
  67220. 8039eb5: 73f5 7235 141d f544 061b 9292 8129 162f .s5r..D.....)./.
  67221. 8039ec5: ff6e 42a1 f6de 1e03 fae4 dc96 bef1 7829 n..B..........)x
  67222. 8039ed5: b148 648a aa4f 705c 725b 4f3d 5270 5489 H..dO.\p[r=OpR.T
  67223. 8039ee5: fbfe e290 399b 1ec1 ae42 9b00 5727 72d9 .....9..B...'W.r
  67224. 8039ef5: b275 d620 ea93 75e7 088b 32fe ae27 5fbf u. ....u...2'.._
  67225. 8039f05: 885b 6f2a ba89 20b3 ebd6 efd4 277e 33f7 [.*o... ....~'.3
  67226. 8039f15: 8b99 cd3d ae41 12cf 2d7c bc77 723b 3bbf ..=.A...|-w.;r.;
  67227. 8039f25: fb96 5df9 8f06 a7dd 655c d5eb 399d 1e89 ...]....\e...9..
  67228. 8039f35: fdcb 8eee cfdc 13ef 8a9c 015c 4736 17ae ..........\.6G..
  67229. 8039f45: 08a8 18b5 1eb5 58d6 f5a1 155c ae09 f504 .......X..\.....
  67230. 8039f55: 9acb 7a72 e0a6 0573 7eb1 d724 1a77 ba15 ..rz..s..~$.w...
  67231. 8039f65: 2e08 9073 7beb f70b 4eb3 92ae 05a4 1eb9 ..s..{...N......
  67232. 8039f75: a42c d600 55c9 0d72 0572 0cd8 9eb9 72a5 ,....Ur.r......r
  67233. 8039f85: 45aa beb1 7347 ebf9 152f a3f2 d4cf d310 .E..Gs../.......
  67234. 8039f95: 8229 174f 76a4 fa8b fe79 feef f72c 4ffb ).O..v..y...,..O
  67235. 8039fa5: ca58 0cf5 63c1 7206 57bd ba45 c94d 3bf5 X....c.r.WE.M..;
  67236. 8039fb5: 5f05 9035 e3eb b382 2b90 3340 bd72 7f30 ._5......+@3r.0.
  67237. 8039fc5: 6ef9 73c0 f704 8894 a8f5 6cc1 7c81 fe43 .n.s.......l.|C.
  67238. 8039fd5: 68df 4948 a646 1637 f684 35d9 7e52 ee5b .hHIF.7....5R~[.
  67239. 8039fe5: fe6f 52d9 7fae 525e aabc ab92 f7e4 941b o..R..^R........
  67240. 8039ff5: 91eb e292 9555 255c e453 100a ae56 26df ....U.\%S...V..&
  67241. 803a005: 46b8 4ab5 171d 639c d620 0453 2f9f eb11 .F.J...c .S../..
  67242. 803a015: d467 74ef fae5 92e1 697c 4715 220b dbfb g..t....|i.G."..
  67243. 803a025: 268a 0bfe 510b a9b1 7f5c 4d6a 4067 5c9d .&...Q..\.jMg@.\
  67244. 803a035: 531f 6f11 b968 48be a8f0 5c85 0325 0ae4 .S.oh..H...\%...
  67245. 803a045: 4e10 b7ae c417 45f8 5c25 b91d 2d1e ab11 .N.....E%\...-..
  67246. 803a055: 6fec 603d 1538 7f2b 7ee9 8d75 ae90 482e .o=`8.+..~u....H
  67247. 803a065: 1fec b754 bac0 7fbf e169 4def 2ae4 530b ..T.....i..M.*.S
  67248. 803a075: 4b73 4ab9 d53e 5c80 b93f 9c46 723a 5bbd sK.J>..\?.F.:r.[
  67249. 803a085: 0a70 0572 2308 a4d7 9044 ac7f d621 9577 p.r..#..D...!.w.
  67250. 803a095: eedc 6a4b 9665 c8e9 7cc1 7ae4 8543 de8c ..Kje....|.zC...
  67251. 803a0a5: 905d 3dd7 bfaa 4ab5 7160 e661 8980 0f5c ]..=...J`qa...\.
  67252. 803a0b5: f455 eab4 75c8 eea9 943f 2f5c b5c8 d95e U....u..?.\/..^.
  67253. 803a0c5: 55c8 1872 02b9 9184 6cab fffa 495c d4fb .Ur......l..\I..
  67254. 803a0d5: 2a6b 7924 e091 92c9 0245 5967 73ce e7cd k*$y....E.gY.s..
  67255. 803a0e5: 6f5c 235b b7a2 a417 eff5 456a 9d56 df20 \o[#......jEV. .
  67256. 803a0f5: 996a 3d73 7055 079f ceb9 8a4b 3e6c 2ae4 j.s=Up....K.l>.*
  67257. 803a105: 0317 55dc 4d21 b95d 2fde 9088 402b 8298 ...U!M]../..+@..
  67258. 803a115: 19d6 8782 b20b 4fbc 3df0 c31a 9658 572a .......O.=..X.*W
  67259. 803a125: ae7b b0c3 7cec c0b7 3531 35bf a12f 8583 {....|..15.5/...
  67260. 803a135: a725 0472 59e1 c59a 8fa8 6ee5 9377 5c81 %.r..Y.....nw..\
  67261. 803a145: a9af bc99 2ba5 65d7 12e5 7b5e 26b9 c215 .....+.e..^{.&..
  67262. 803a155: 9134 e4ab e45a 100a 5bae 6de0 9725 b7f9 4...Z....[.m%...
  67263. 803a165: c8a9 f576 cf37 7c13 f0a5 4f37 48aa 65d6 ..v.7..|..7O.H.e
  67264. 803a175: 8227 3eaa d7d7 9e0a fdcc 01ee 4795 6dd5 '..>.........G.m
  67265. 803a185: fffc 45ba eb9f 0bf7 f71e d728 52ff b091 ...E......(..R..
  67266. 803a195: b92f 5b3e af70 b947 109e 04bc 02b9 9184 /.>[p.G.........
  67267. 803a1a5: 94ab 5fe8 0897 a476 7f7e 64a0 cb18 1653 ..._..v.~..d..S.
  67268. 803a1b5: 3809 f36c b652 eb42 8555 5909 6252 1ae7 .8l.R.B.U..YRb..
  67269. 803a1c5: fe34 5717 3d68 5357 53ae 998d 26b1 9572 4..Wh=WS.S...&r.
  67270. 803a1d5: a1fc b947 5d5e 4b23 b953 6e4a ae45 e100 ..G.^]#KS.JnE...
  67271. 803a1e5: 1116 5f3c 50f0 9e41 0b8f 447e 5370 5889 ..<_.PA...~DpS.X
  67272. 803a1f5: f3af 87b8 a0d6 3664 f1c0 d4c2 9fa9 1036 ......d6......6.
  67273. 803a205: 4beb ab0a 74b3 0b67 4abc 2073 a9b7 1f5c .K...tg..Js ..\.
  67274. 803a215: 1157 abb1 cf5c f350 7d59 55cb 6af2 0ae4 W...\.P.Y}.U.j..
  67275. 803a225: 6e10 d685 4b1b fa24 4988 ab2f 06c3 7f85 .n...K$..I/.....
  67276. 803a235: 46b5 324c fd7a 0379 cab1 b4bd a5fe dfd0 .FL2z.y.........
  67277. 803a245: 02fa b90d c2ca ddd3 729a e995 9b89 2715 .........r.....'
  67278. 803a255: 6f34 69f3 720f 94fd 28a6 a84f ae19 0792 4o.i.r...(O.....
  67279. 803a265: 6f34 8f73 e9e0 15c8 dc20 d7f2 28b2 cf35 4os..... ....(5.
  67280. 803a275: aabc d597 ae41 2e2f 73cc ed5d f040 0306 ....A./..s].@...
  67281. 803a285: feb1 daa0 70b4 9a59 ad6b eb96 cb61 656d .....pY.k...a.me
  67282. 803a295: f84c 0719 c6b9 929a e174 c89d 2015 5c9c L.......t.... .\
  67283. 803a2a5: 134f 797c 588d 4165 85eb b701 2ed6 89db O.|y.XeA........
  67284. 803a2b5: e640 cf40 28d6 fd5e c39e 044e c872 fdcb @.@..(^...N.r...
  67285. 803a2c5: 9206 57bc e4f5 50de 78f2 b8ab 6d5b 68bc ...W...P.x..[m.h
  67286. 803a2d5: d72a d453 563c 495d 213e 41b8 af71 edc1 *.S.<V]I>!.Aq...
  67287. 803a2e5: 141e 177c 0572 3708 65b8 3250 f03e d511 ..|.r..7.eP2>...
  67288. 803a2f5: b58a 5013 abae b43d 978e b044 0bb7 54ae ...P..=...D....T
  67289. 803a305: 3fbf ed5f 25a5 cda3 af8f 7bc9 6f5e 87b0 .?_..%.....{^o..
  67290. 803a315: b5d6 1186 69a8 35ce 61cf b90b 321e 408c .....i.5.a...2.@
  67291. 803a325: 726d 2bae 43ae 00ae a761 bd62 b6cf cae5 mr.+.C..a.b.....
  67292. 803a335: ae51 be92 eec3 8faf ee18 fafe 0603 d379 Q.............y.
  67293. 803a345: dcfc 33d6 0f15 de1b 01f6 2915 caeb 54f5 ...3.......)...T
  67294. 803a355: ecd5 226f 87c8 6705 ee2a bc32 1cad 7dae ..o"...g*.2....}
  67295. 803a365: 720e 0805 5727 6339 1fe0 5c95 f0af 9e31 .r..'W9c...\..1.
  67296. 803a375: 40d0 3bae f2ea f2f9 90c2 2aea a84e f568 .@.;.......*N.h.
  67297. 803a385: ed74 fd35 dd4f a65e c629 7206 a3fd 7206 t.5.O.^.)..r...r
  67298. 803a395: 45ad 8b3e 015c cec2 7d73 bad9 81f1 c80d .E>.\...s}......
  67299. 803a3a5: 3f35 fb14 9522 94df 5a83 541e fa82 5a86 5?.."....Z.T...Z
  67300. 803a3b5: fb06 8217 a877 012e 21b3 76d5 bfbb c3fa ....w....!.v....
  67301. 803a3c5: b0df 60ec a270 9800 3ff3 637f aecb 24e6 ...`p....?.c...$
  67302. 803a3d5: 24ed 0000 0000 4549 444e 42ae 8260 0000 .$....IEND.B`..
  67303. 0803a3e4 <file__favicon_ico>:
  67304. 803a3e4: 0000 0000 a3f8 0803 a408 0803 053c 0000 ............<...
  67305. 803a3f4: 0001 0000 ....
  67306. 0803a3f8 <data__favicon_ico>:
  67307. 803a3f8: 662f 7661 6369 6e6f 692e 6f63 0000 0000 /favicon.ico....
  67308. 803a408: 5448 5054 312f 312e 3220 3030 4f20 0d4b HTTP/1.1 200 OK.
  67309. 803a418: 530a 7265 6576 3a72 6c20 4977 2f50 2e31 .Server: lwIP/1.
  67310. 803a428: 2e33 2031 6828 7474 3a70 2f2f 6173 6176 3.1 (http://sava
  67311. 803a438: 6e6e 6861 6e2e 6e6f 6e67 2e75 726f 2f67 nnah.nongnu.org/
  67312. 803a448: 7270 6a6f 6365 7374 6c2f 6977 2970 0a0d projects/lwip)..
  67313. 803a458: 6f43 746e 6e65 2d74 654c 676e 6874 203a Content-Length:
  67314. 803a468: 3131 3035 0a0d 6f43 6e6e 6365 6974 6e6f 1150..Connection
  67315. 803a478: 203a 6c43 736f 0d65 430a 6e6f 6574 746e : Close..Content
  67316. 803a488: 742d 7079 3a65 6920 616d 6567 782f 692d -type: image/x-i
  67317. 803a498: 6f63 0d6e 430a 6361 6568 432d 6e6f 7274 con..Cache-Contr
  67318. 803a4a8: 6c6f 203a 7270 7669 7461 2c65 6d20 7861 ol: private, max
  67319. 803a4b8: 612d 6567 383d 3436 3030 0a0d 0a0d 0000 -age=86400......
  67320. 803a4c8: 0001 0001 1010 0000 0000 0020 0468 0000 .......... .h...
  67321. 803a4d8: 0016 0000 0028 0000 0010 0000 0020 0000 ....(....... ...
  67322. 803a4e8: 0001 0020 0000 0000 0440 0000 0000 0000 .. .....@.......
  67323. 803a4f8: 0000 0000 0000 0000 0000 0000 ffff 01ff ................
  67324. 803a508: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  67325. 803a518: ffff 01ff ffff 01ff d2d2 ffd2 d2d2 ffd2 ................
  67326. 803a528: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  67327. 803a538: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  67328. 803a548: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  67329. 803a558: 8d8d ff8d 8484 ff84 8989 ff89 8989 ff89 ................
  67330. 803a568: 8484 ff84 8d8d ff8d ffff 01ff ffff 01ff ................
  67331. 803a578: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  67332. 803a588: ffff 01ff ffff 01ff a4a4 ffa4 8484 ff84 ................
  67333. 803a598: aeae ffae ffff 01ff ffff 01ff ffff 01ff ................
  67334. 803a5a8: ffff 01ff aeae ffae 8484 ff84 a4a4 ffa4 ................
  67335. 803a5b8: ffff 01ff ffff 01ff 8181 ff81 ffff 01ff ................
  67336. 803a5c8: ffff 01ff a0a0 ffa0 9a9a ff9a ffff 01ff ................
  67337. 803a5d8: c7c7 ffc7 8f8f ff8f 8585 ff85 8585 ff85 ................
  67338. 803a5e8: 8f8f ff8f caca ffca ffff 01ff d5d5 ffd5 ................
  67339. 803a5f8: ffff 01ff 7777 ff77 ffff 01ff ffff 01ff ....www.........
  67340. 803a608: d5d5 ffd5 8484 ff84 ffff 01ff a8a8 ffa8 ................
  67341. 803a618: 8c8c ff8c bbbb ffbb ffff 01ff ffff 01ff ................
  67342. 803a628: baba ffba afaf ffaf ffff 01ff ffff 01ff ................
  67343. 803a638: 6465 ff5b ffff 01ff ffff 01ff ffff 01ff ed[.............
  67344. 803a648: 9898 ff98 b0b0 ffb0 d5d5 ffd5 8484 ff84 ................
  67345. 803a658: dada ffda 9595 ff95 8484 ff84 9d9d ff9d ................
  67346. 803a668: d7d7 ffd7 ffff 01ff 9898 ff97 7a7b ff73 ............{zs.
  67347. 803a678: cedb ff79 c0d2 ff55 ffff 01ff ffff 01ff ..y...U.........
  67348. 803a688: 9393 ff93 ffff 01ff a4a4 ffa4 bebe ffbe ................
  67349. 803a698: bdbd ffbd d1d1 ffd1 ffff 01ff ffff 01ff ................
  67350. 803a6a8: b4b5 ffae 5f5f ff5d 979d ff6b c0d2 ff55 ....__]...k...U.
  67351. 803a6b8: ffff 01ff b5c9 ff35 ffff 01ff ffff 01ff ......5.........
  67352. 803a6c8: f0f0 fff0 ffff 01ff f1f1 fff1 ffff 01ff ................
  67353. 803a6d8: d5d5 ffd5 cfd0 ffce 8585 ff85 6060 ff60 ............```.
  67354. 803a6e8: 9194 ff85 b5ca ff37 ffff 01ff b9cc ff41 ......7.......A.
  67355. 803a6f8: ffff 01ff b4c9 ff33 ffff 01ff 6262 ff62 ......3.....bbb.
  67356. 803a708: 5d5e ff5c 5c5c ff5c 5d5e ff5c 6161 ff60 ^]\.\\\.^]\.aa`.
  67357. 803a718: 6567 ff5b 8486 ff7b ffff 01ff ffff 01ff ge[...{.........
  67358. 803a728: ffff 01ff b5ca ff37 ffff 01ff b9cc ff41 ......7.......A.
  67359. 803a738: ffff 01ff b4c9 ff33 ffff 01ff ffff 01ff ......3.........
  67360. 803a748: b5c9 ff35 ffff 01ff c0d2 ff55 ffff 01ff ..5.......U.....
  67361. 803a758: c4d4 ff5e c3d4 ff5c ffff 01ff ffff 01ff ..^...\.........
  67362. 803a768: c3d4 ff5c c4d4 ff5e cedb ff79 c0d2 ff55 ..\...^...y...U.
  67363. 803a778: ffff 01ff b5c9 ff35 ffff 01ff ffff 01ff ......5.........
  67364. 803a788: c0d1 ff54 cfdc ff7d ffff 01ff b4c9 ff33 ..T...}.......3.
  67365. 803a798: ffff 01ff bed0 ff50 b4c9 ff33 b4c9 ff33 ......P...3...3.
  67366. 803a7a8: c0d2 ff55 ffff 01ff b4c9 ff33 ffff 01ff ..U.......3.....
  67367. 803a7b8: cedb ff79 c0d2 ff55 ffff 01ff ffff 01ff ..y...U.........
  67368. 803a7c8: ffff 01ff b4c9 ff33 ffff 01ff cad9 ff6f ......3.......o.
  67369. 803a7d8: b9cc ff41 d6e1 ff8f ffff 01ff ffff 01ff ..A.............
  67370. 803a7e8: d5e0 ff8c b9cc ff40 cedb ff79 ffff 01ff ......@...y.....
  67371. 803a7f8: b4c9 ff33 ffff 01ff ffff 01ff ffff 01ff ..3.............
  67372. 803a808: ffff 01ff c5d5 ff62 c1d2 ff58 ffff 01ff ......b...X.....
  67373. 803a818: ffff 01ff bbce ff46 b5c9 ff35 b5c9 ff35 ......F...5...5.
  67374. 803a828: bbce ff46 ffff 01ff ffff 01ff c0d2 ff55 ..F...........U.
  67375. 803a838: c5d5 ff62 ffff 01ff ffff 01ff ffff 01ff ..b.............
  67376. 803a848: ffff 01ff ffff 01ff c8d7 ff69 b4c9 ff33 ..........i...3.
  67377. 803a858: cedb ff79 ffff 01ff ffff 01ff ffff 01ff ..y.............
  67378. 803a868: ffff 01ff cedb ff79 b4c9 ff33 c8d7 ff69 ......y...3...i.
  67379. 803a878: ffff 01ff ffff 01ff ffff 01ff ffff 0dff ................
  67380. 803a888: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  67381. 803a898: b9cd ff42 b4c9 ff33 b7cb ff3b b7cb ff3b ..B...3...;...;.
  67382. 803a8a8: b4c9 ff33 b9cd ff42 ffff 01ff ffff 01ff ..3...B.........
  67383. 803a8b8: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  67384. 803a8c8: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  67385. 803a8d8: ffff 01ff ffff 01ff e4eb ffb5 e4eb ffb5 ................
  67386. 803a8e8: ffff 01ff ffff 01ff ffff 01ff ffff 01ff ................
  67387. 803a8f8: ffff 01ff ffff 01ff ffff 01ff 0000 ffff ................
  67388. 803a908: 0000 ffff 0000 ffff 0000 ffff 0000 ffff ................
  67389. 803a918: 0000 ffff 0000 ffff 0000 ffff 0000 ffff ................
  67390. 803a928: 0000 ffff 0000 ffff 0000 ffff 0000 ffff ................
  67391. 803a938: 0000 ffff 0000 ffff 0000 ffff ............
  67392. 0803a944 <file__rotek_png>:
  67393. 803a944: a958 0803 8bd5 0803 8be1 0803 1802 0000 X...............
  67394. 803a954: 0001 0000 ....
  67395. 0803a958 <file__main_js>:
  67396. 803a958: 7288 0803 4cf3 0803 4cff 0803 1f52 0000 .r...L...L..R...
  67397. 803a968: 0001 0000 5448 5054 312f 302e 3220 3030 ....HTTP/1.0 200
  67398. 803a978: 4f20 0d4b 430a 6e6f 6574 746e 542d 7079 OK..Content-Typ
  67399. 803a988: 3a65 6574 7478 682f 6d74 0d6c 0d0a 000a e:text/html.....
  67400. 803a998: 227b 4341 3a22 0022 2c22 4422 2243 223a {"AC":".","DC":"
  67401. 803a9a8: 2200 222c 6e69 665f 6572 2271 223a 2200 .","in_freq":"."
  67402. 803a9b8: 222c 756f 5f74 7266 7165 3a22 0022 2c22 ,"out_freq":".",
  67403. 803a9c8: 7022 7277 3a22 0022 2c22 6c22 6e69 5f65 "pwr":".","line_
  67404. 803a9d8: 6166 6c69 3a22 2c00 6c22 776f 625f 7461 fail":.,"low_bat
  67405. 803a9e8: 6574 7972 3a22 2c00 6222 7461 635f 7061 tery":.,"bat_cap
  67406. 803a9f8: 3a22 0022 2c22 6922 6e6e 7265 745f 6d65 ":".","inner_tem
  67407. 803aa08: 2270 223a 2200 222c 6162 5f74 6974 656d p":".","bat_time
  67408. 803aa18: 6c5f 6665 2274 223a 2200 222c 6f6c 6461 _left":".","load
  67409. 803aa28: 6d5f 6e6f 7469 726f 3a22 2c00 7422 6d65 _monitor":.,"tem
  67410. 803aa38: 5f70 6f6d 696e 6f74 2272 003a 222c 6f63 p_monitor":.,"co
  67411. 803aa48: 6e6e 6365 5f74 6f6d 696e 6f74 2272 003a nnect_monitor":.
  67412. 803aa58: 7d22 7b00 7222 6165 5f64 6f63 6d6d 6e75 "}.{"read_commun
  67413. 803aa68: 7469 2279 223a 2200 222c 7277 7469 5f65 ity":".","write_
  67414. 803aa78: 6f63 6d6d 6e75 7469 2279 223a 2200 222c community":".","
  67415. 803aa88: 616d 616e 6567 4972 2250 223a 2200 222c managerIP":".","
  67416. 803aa98: 616d 616e 6567 4972 3250 3a22 0022 2c22 managerIP2":".",
  67417. 803aaa8: 6d22 6e61 6761 7265 5049 2233 223a 2200 "managerIP3":"."
  67418. 803aab8: 222c 7069 6461 7264 3a22 0022 2c22 6722 ,"ipaddr":".","g
  67419. 803aac8: 2277 223a 2200 222c 616d 6b73 3a22 0022 w":".","mask":".
  67420. 803aad8: 2c22 6422 6368 2270 003a 227b 7075 6974 ","dhcp":.{"upti
  67421. 803aae8: 656d 3a22 0022 2c22 6d22 646f 6c65 3a22 me":".","model":
  67422. 803aaf8: 0022 2c22 7022 6f72 6164 6574 3a22 0022 ".","prodate":".
  67423. 803ab08: 2c22 6622 7677 7265 6973 6e6f 3a22 0022 ","fwversion":".
  67424. 803ab18: 2c22 6d22 6361 6461 7264 3a22 0022 2c22 ","macaddr":".",
  67425. 803ab28: 7322 7265 6f6e 3a22 0022 2c22 6f22 6e77 "serno":".","own
  67426. 803ab38: 7265 3a22 0022 2c22 7322 7379 6f4c 6163 er":".","sysLoca
  67427. 803ab48: 6974 6e6f 3a22 0022 2c22 6322 6d6f 656d tion":".","comme
  67428. 803ab58: 746e 3a22 0022 2c22 6e22 7465 6573 7474 nt":".","netsett
  67429. 803ab68: 6e69 7367 635f 6168 676e 6465 3a22 0022 ings_changed":".
  67430. 803ab78: 6425 5200 6265 6f6f 5474 7361 006b 6374 %d.RebootTask.tc
  67431. 803ab88: 6970 5f70 6874 6572 6461 0000 pip_thread..
  67432. 0803ab94 <memp_num>:
  67433. 803ab94: 0004 0006 000c 0005 0019 0010 0006 0008 ................
  67434. 803aba4: 0014 000a 001e 0032 0005 0009 0032 0019 ......2.....2...
  67435. 0803abb4 <memp_sizes>:
  67436. 803abb4: 001c 0020 0094 001c 0010 0010 002c 0014 .. .........,...
  67437. 803abc4: 0014 0010 0020 0010 0024 0080 0010 0614 .... ...$.......
  67438. 0803abd4 <tcp_pcb_lists>:
  67439. 803abd4: 0d80 2001 0d88 2001 0d78 2001 0d8c 2001 ... ... x.. ...
  67440. 0803abe4 <tcp_backoff>:
  67441. 803abe4: 0201 0403 0605 0707 0707 0707 0307 .............
  67442. 0803abf1 <tcp_persist_backoff>:
  67443. 803abf1: 0603 180c 6030 ff78 ....0`x
  67444. 0803abf8 <ip_addr_broadcast>:
  67445. 803abf8: ffff ffff ....
  67446. 0803abfc <ip_addr_any>:
  67447. 803abfc: 0000 0000 ....
  67448. 0803ac00 <syslocation_len_default>:
  67449. 803ac00: 0000 0000 ....
  67450. 0803ac04 <snmp_scalar>:
  67451. 803ac04: f595 0802 f049 0802 f5d9 0802 f15d 0802 ....I.......]...
  67452. 803ac14: 0001 0000 ....
  67453. 0803ac18 <udpentry_nodes>:
  67454. 803ac18: 163c 2000 163c 2000 <.. <..
  67455. 0803ac20 <attable>:
  67456. 803ac20: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67457. 803ac30: 0002 0001 ad50 0803 ae78 0803 ....P...x...
  67458. 0803ac3c <mib2_nodes>:
  67459. 803ac3c: b448 0803 b010 0803 1604 2000 b4ec 0803 H.......... ....
  67460. 803ac4c: ae10 0803 afe0 0803 b23c 0803 adac 0803 ........<.......
  67461. 0803ac5c <iprteentry_nodes>:
  67462. 803ac5c: 166c 2000 166c 2000 166c 2000 166c 2000 l.. l.. l.. l..
  67463. 803ac6c: 166c 2000 166c 2000 166c 2000 166c 2000 l.. l.. l.. l..
  67464. 803ac7c: 166c 2000 166c 2000 166c 2000 166c 2000 l.. l.. l.. l..
  67465. 803ac8c: 166c 2000 l..
  67466. 0803ac90 <iprouteinfo>:
  67467. 803ac90: 0002 0000 0000 0000 0000 0000 0000 0000 ................
  67468. 803aca0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67469. 803acb0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67470. 803acc0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67471. 803acd0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67472. 803ace0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67473. 803acf0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67474. 803ad00: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67475. 803ad10: 0000 0000 ....
  67476. 0803ad14 <sysname_default>:
  67477. 803ad14: 5146 4e44 752d 6b6e 0000 0000 FQDN-unk....
  67478. 0803ad20 <ipntomentry_ids>:
  67479. 803ad20: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  67480. 0803ad30 <interfaces_scalar>:
  67481. 803ad30: ec9d 0802 ecbd 0802 ebeb 0802 ebef 0802 ................
  67482. 803ad40: 0001 0000 ....
  67483. 0803ad44 <syslocation_default>:
  67484. 803ad44: 0000 0000 ....
  67485. 0803ad48 <interfaces_ids>:
  67486. 803ad48: 0001 0000 0002 0000 ........
  67487. 0803ad50 <attable_id>:
  67488. 803ad50: 0001 0000 ....
  67489. 0803ad54 <mgmt>:
  67490. 803ad54: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67491. 803ad64: 0002 0001 b444 0803 b238 0803 ....D...8...
  67492. 0803ad70 <mib2_ids>:
  67493. 803ad70: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  67494. 803ad80: 0005 0000 0006 0000 0007 0000 000b 0000 ................
  67495. 0803ad90 <mib2>:
  67496. 803ad90: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67497. 803ada0: 0002 0008 ad70 0803 ac3c 0803 ....p...<...
  67498. 0803adac <snmp>:
  67499. 803adac: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67500. 803adbc: 0002 001c b330 0803 b1c8 0803 ....0.......
  67501. 0803adc8 <tcp_scalar>:
  67502. 803adc8: f509 0802 ef41 0802 ebeb 0802 ebef 0802 ....A...........
  67503. 803add8: 0001 0000 ....
  67504. 0803addc <sys_tem_nodes>:
  67505. 803addc: af1c 0803 af1c 0803 af1c 0803 af1c 0803 ................
  67506. 803adec: af1c 0803 af1c 0803 af1c 0803 ............
  67507. 0803adf8 <snmpenableauthentraps_default>:
  67508. 803adf8: 0002 0000 ....
  67509. 0803adfc <udp_nodes>:
  67510. 803adfc: ae64 0803 ae64 0803 ae64 0803 ae64 0803 d...d...d...d...
  67511. 803ae0c: 1620 2000 ..
  67512. 0803ae10 <icmp>:
  67513. 803ae10: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67514. 803ae20: 0002 001a b0dc 0803 af6c 0803 ........l...
  67515. 0803ae2c <ip_scalar>:
  67516. 803ae2c: f41d 0802 ecd1 0802 ed91 0802 ebef 0802 ................
  67517. 803ae3c: 0001 0000 ....
  67518. 0803ae40 <udpentry_ids>:
  67519. 803ae40: 0001 0000 0002 0000 ........
  67520. 0803ae48 <ipntomentry>:
  67521. 803ae48: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67522. 803ae58: 0002 0004 ad20 0803 b000 0803 .... .......
  67523. 0803ae64 <udp_scalar>:
  67524. 803ae64: efe5 0802 f011 0802 ebeb 0802 ebef 0802 ................
  67525. 803ae74: 0001 0000 ....
  67526. 0803ae78 <attable_node>:
  67527. 803ae78: af00 0803 ....
  67528. 0803ae7c <ifspecific>:
  67529. 803ae7c: 0002 0000 0000 0000 0000 0000 0000 0000 ................
  67530. 803ae8c: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67531. 803ae9c: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67532. 803aeac: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67533. 803aebc: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67534. 803aecc: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67535. 803aedc: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67536. 803aeec: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67537. 803aefc: 0000 0000 ....
  67538. 0803af00 <atentry>:
  67539. 803af00: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67540. 803af10: 0002 0003 b060 0803 b158 0803 ....`...X...
  67541. 0803af1c <sys_tem_scalar>:
  67542. 803af1c: ebf1 0802 f851 0802 f381 0802 f621 0802 ....Q.......!...
  67543. 803af2c: 0001 0000 ....
  67544. 0803af30 <tcp_nodes>:
  67545. 803af30: adc8 0803 adc8 0803 adc8 0803 adc8 0803 ................
  67546. 803af40: adc8 0803 adc8 0803 adc8 0803 adc8 0803 ................
  67547. 803af50: adc8 0803 adc8 0803 adc8 0803 adc8 0803 ................
  67548. 803af60: 176c 2000 adc8 0803 adc8 0803 l.. ........
  67549. 0803af6c <icmp_nodes>:
  67550. 803af6c: b414 0803 b414 0803 b414 0803 b414 0803 ................
  67551. 803af7c: b414 0803 b414 0803 b414 0803 b414 0803 ................
  67552. 803af8c: b414 0803 b414 0803 b414 0803 b414 0803 ................
  67553. 803af9c: b414 0803 b414 0803 b414 0803 b414 0803 ................
  67554. 803afac: b414 0803 b414 0803 b414 0803 b414 0803 ................
  67555. 803afbc: b414 0803 b414 0803 b414 0803 b414 0803 ................
  67556. 803afcc: b414 0803 b414 0803 ........
  67557. 0803afd4 <sysdescr_len_default>:
  67558. 803afd4: 0004 0000 ....
  67559. 0803afd8 <interfaces_nodes>:
  67560. 803afd8: ad30 0803 180c 2000 0......
  67561. 0803afe0 <tcp>:
  67562. 803afe0: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67563. 803aff0: 0002 000f b18c 0803 af30 0803 ........0...
  67564. 0803affc <syscontact_default>:
  67565. 803affc: 0000 0000 ....
  67566. 0803b000 <ipntomentry_nodes>:
  67567. 803b000: 18d0 2000 18d0 2000 18d0 2000 18d0 2000 ... ... ... ...
  67568. 0803b010 <interfaces>:
  67569. 803b010: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67570. 803b020: 0002 0002 ad48 0803 afd8 0803 ....H.......
  67571. 0803b02c <iprteentry_ids>:
  67572. 803b02c: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  67573. 803b03c: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  67574. 803b04c: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  67575. 803b05c: 000d 0000 ....
  67576. 0803b060 <atentry_ids>:
  67577. 803b060: 0001 0000 0002 0000 0003 0000 ............
  67578. 0803b06c <tcpconnentry_nodes>:
  67579. 803b06c: 1794 2000 1794 2000 1794 2000 1794 2000 ... ... ... ...
  67580. 803b07c: 1794 2000 ...
  67581. 0803b080 <ip_nodes>:
  67582. 803b080: ae2c 0803 ae2c 0803 ae2c 0803 ae2c 0803 ,...,...,...,...
  67583. 803b090: ae2c 0803 ae2c 0803 ae2c 0803 ae2c 0803 ,...,...,...,...
  67584. 803b0a0: ae2c 0803 ae2c 0803 ae2c 0803 ae2c 0803 ,...,...,...,...
  67585. 803b0b0: ae2c 0803 ae2c 0803 ae2c 0803 ae2c 0803 ,...,...,...,...
  67586. 803b0c0: ae2c 0803 ae2c 0803 ae2c 0803 17c0 2000 ,...,...,......
  67587. 803b0d0: 1828 2000 15e8 2000 ae2c 0803 (.. ... ,...
  67588. 0803b0dc <icmp_ids>:
  67589. 803b0dc: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  67590. 803b0ec: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  67591. 803b0fc: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  67592. 803b10c: 000d 0000 000e 0000 000f 0000 0010 0000 ................
  67593. 803b11c: 0011 0000 0012 0000 0013 0000 0014 0000 ................
  67594. 803b12c: 0015 0000 0016 0000 0017 0000 0018 0000 ................
  67595. 803b13c: 0019 0000 001a 0000 ........
  67596. 0803b144 <udp_ids>:
  67597. 803b144: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  67598. 803b154: 0005 0000 ....
  67599. 0803b158 <atentry_nodes>:
  67600. 803b158: 17e0 2000 17e0 2000 17e0 2000 ... ... ...
  67601. 0803b164 <ipaddrentry_nodes>:
  67602. 803b164: 173c 2000 173c 2000 173c 2000 173c 2000 <.. <.. <.. <..
  67603. 803b174: 173c 2000 <..
  67604. 0803b178 <ipaddrentry_ids>:
  67605. 803b178: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  67606. 803b188: 0005 0000 ....
  67607. 0803b18c <tcp_ids>:
  67608. 803b18c: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  67609. 803b19c: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  67610. 803b1ac: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  67611. 803b1bc: 000d 0000 000e 0000 000f 0000 ............
  67612. 0803b1c8 <snmp_nodes>:
  67613. 803b1c8: ac04 0803 ac04 0803 ac04 0803 ac04 0803 ................
  67614. 803b1d8: ac04 0803 ac04 0803 ac04 0803 ac04 0803 ................
  67615. 803b1e8: ac04 0803 ac04 0803 ac04 0803 ac04 0803 ................
  67616. 803b1f8: ac04 0803 ac04 0803 ac04 0803 ac04 0803 ................
  67617. 803b208: ac04 0803 ac04 0803 ac04 0803 ac04 0803 ................
  67618. 803b218: ac04 0803 ac04 0803 ac04 0803 ac04 0803 ................
  67619. 803b228: ac04 0803 ac04 0803 ac04 0803 ac04 0803 ................
  67620. 0803b238 <mgmt_nodes>:
  67621. 803b238: ad90 0803 ....
  67622. 0803b23c <udp>:
  67623. 803b23c: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67624. 803b24c: 0002 0005 b144 0803 adfc 0803 ....D.......
  67625. 0803b258 <iprteentry>:
  67626. 803b258: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67627. 803b268: 0002 000d b02c 0803 ac5c 0803 ....,...\...
  67628. 0803b274 <ifentry>:
  67629. 803b274: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67630. 803b284: 0002 0016 b3bc 0803 b494 0803 ............
  67631. 0803b290 <udpentry>:
  67632. 803b290: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67633. 803b2a0: 0002 0002 ae40 0803 ac18 0803 ....@.......
  67634. 0803b2ac <ip_ids>:
  67635. 803b2ac: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  67636. 803b2bc: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  67637. 803b2cc: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  67638. 803b2dc: 000d 0000 000e 0000 000f 0000 0010 0000 ................
  67639. 803b2ec: 0011 0000 0012 0000 0013 0000 0014 0000 ................
  67640. 803b2fc: 0015 0000 0016 0000 0017 0000 ............
  67641. 0803b308 <sysdescr_default>:
  67642. 803b308: 776c 5049 0800 lwIP.
  67643. 0803b30d <sysname_len_default>:
  67644. 803b30d: 0008 e300 ...
  67645. 0803b310 <tcpconnentry>:
  67646. 803b310: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67647. 803b320: 0002 0005 b480 0803 b06c 0803 ........l...
  67648. 0803b32c <syscontact_len_default>:
  67649. 803b32c: 0000 0000 ....
  67650. 0803b330 <snmp_ids>:
  67651. 803b330: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  67652. 803b340: 0005 0000 0006 0000 0008 0000 0009 0000 ................
  67653. 803b350: 000a 0000 000b 0000 000c 0000 000d 0000 ................
  67654. 803b360: 000e 0000 000f 0000 0010 0000 0011 0000 ................
  67655. 803b370: 0012 0000 0013 0000 0014 0000 0015 0000 ................
  67656. 803b380: 0016 0000 0018 0000 0019 0000 001a 0000 ................
  67657. 803b390: 001b 0000 001c 0000 001d 0000 001e 0000 ................
  67658. 0803b3a0 <sys_tem_ids>:
  67659. 803b3a0: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  67660. 803b3b0: 0005 0000 0006 0000 0007 0000 ............
  67661. 0803b3bc <ifentry_ids>:
  67662. 803b3bc: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  67663. 803b3cc: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  67664. 803b3dc: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  67665. 803b3ec: 000d 0000 000e 0000 000f 0000 0010 0000 ................
  67666. 803b3fc: 0011 0000 0012 0000 0013 0000 0014 0000 ................
  67667. 803b40c: 0015 0000 0016 0000 ........
  67668. 0803b414 <icmp_scalar>:
  67669. 803b414: ee19 0802 ee45 0802 ebeb 0802 ebef 0802 ....E...........
  67670. 803b424: 0001 0000 ....
  67671. 0803b428 <internet>:
  67672. 803b428: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67673. 803b438: 0002 0002 17b4 2000 b508 0803 ....... ....
  67674. 0803b444 <mgmt_ids>:
  67675. 803b444: 0001 0000 ....
  67676. 0803b448 <sys_tem>:
  67677. 803b448: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67678. 803b458: 0002 0007 b3a0 0803 addc 0803 ............
  67679. 0803b464 <ipaddrentry>:
  67680. 803b464: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67681. 803b474: 0002 0005 b178 0803 b164 0803 ....x...d...
  67682. 0803b480 <tcpconnentry_ids>:
  67683. 803b480: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  67684. 803b490: 0005 0000 ....
  67685. 0803b494 <ifentry_nodes>:
  67686. 803b494: 1694 2000 1694 2000 1694 2000 1694 2000 ... ... ... ...
  67687. 803b4a4: 1694 2000 1694 2000 1694 2000 1694 2000 ... ... ... ...
  67688. 803b4b4: 1694 2000 1694 2000 1694 2000 1694 2000 ... ... ... ...
  67689. 803b4c4: 1694 2000 1694 2000 1694 2000 1694 2000 ... ... ... ...
  67690. 803b4d4: 1694 2000 1694 2000 1694 2000 1694 2000 ... ... ... ...
  67691. 803b4e4: 1694 2000 1694 2000 ... ...
  67692. 0803b4ec <mib2_ip>:
  67693. 803b4ec: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67694. 803b4fc: 0002 0017 b2ac 0803 b080 0803 ............
  67695. 0803b508 <internet_nodes>:
  67696. 803b508: ad54 0803 b5a4 0803 T.......
  67697. 0803b510 <prefix>:
  67698. 803b510: 0001 0000 0003 0000 0006 0000 0001 0000 ................
  67699. 0803b520 <snmp_version>:
  67700. 803b520: 0000 0000 ....
  67701. 0803b524 <snmp_publiccommunity>:
  67702. 803b524: 7570 6c62 6369 ff00 public.
  67703. 0803b52b <ethbroadcast>:
  67704. 803b52b: ffff ffff ffff ......
  67705. 0803b531 <ethzero>:
  67706. 803b531: 0000 0000 0000 7445 5f68 6669 2000 7325 ......Eth_if. %s
  67707. 803b541: 0d0a 4400 4348 4350 696c 6e65 0074 6577 ...DHCPClient.we
  67708. 803b551: 5262 6965 696e 0074 6552 6e69 7469 6557 bReinit.ReinitWe
  67709. 803b561: 0062 7c00 b..
  67710. 0803b564 <mib_pivate_nodes>:
  67711. 803b564: b67c 0803 |...
  67712. 0803b568 <bt6701_nodes>:
  67713. 803b568: b5dc 0803 ....
  67714. 0803b56c <signals_nodes>:
  67715. 803b56c: b698 0803 b698 0803 b698 0803 b698 0803 ................
  67716. 803b57c: b698 0803 b698 0803 b698 0803 b698 0803 ................
  67717. 803b58c: b698 0803 b698 0803 b698 0803 b698 0803 ................
  67718. 803b59c: b698 0803 ....
  67719. 0803b5a0 <rotek_ids>:
  67720. 803b5a0: 038f 0000 ....
  67721. 0803b5a4 <mib_private>:
  67722. 803b5a4: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67723. 803b5b4: 0002 0001 b670 0803 b564 0803 ....p...d...
  67724. 0803b5c0 <bt6701>:
  67725. 803b5c0: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67726. 803b5d0: 0002 0001 b66c 0803 b568 0803 ....l...h...
  67727. 0803b5dc <signals>:
  67728. 803b5dc: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67729. 803b5ec: 0002 000d b600 0803 b56c 0803 ........l...
  67730. 0803b5f8 <swt_ids>:
  67731. 803b5f8: 0001 0000 ....
  67732. 0803b5fc <enterprises_ids>:
  67733. 803b5fc: a318 0000 ....
  67734. 0803b600 <signals_ids>:
  67735. 803b600: 0001 0000 0002 0000 0003 0000 0004 0000 ................
  67736. 803b610: 0005 0000 0006 0000 0007 0000 0008 0000 ................
  67737. 803b620: 0009 0000 000a 0000 000b 0000 000c 0000 ................
  67738. 803b630: 000d 0000 0000 0000 0000 0000 0000 0000 ................
  67739. 803b640: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67740. 803b650: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  67741. 803b660: 0000 0000 0000 0000 0000 0000 ............
  67742. 0803b66c <bt6701_ids>:
  67743. 803b66c: 0001 0000 ....
  67744. 0803b670 <mib_private_ids>:
  67745. 803b670: 0001 0000 ....
  67746. 0803b674 <rotek_nodes>:
  67747. 803b674: b6b0 0803 ....
  67748. 0803b678 <enterprises_nodes>:
  67749. 803b678: b6cc 0803 ....
  67750. 0803b67c <enterprises>:
  67751. 803b67c: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67752. 803b68c: 0002 0001 b5fc 0803 b678 0803 ........x...
  67753. 0803b698 <signals_var>:
  67754. 803b698: 2f25 0803 2ee9 0803 2ed1 0803 3015 0803 %/...........0..
  67755. 803b6a8: 0001 0000 ....
  67756. 0803b6ac <swt_nodes>:
  67757. 803b6ac: b5c0 0803 ....
  67758. 0803b6b0 <swt>:
  67759. 803b6b0: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67760. 803b6c0: 0002 0001 b5f8 0803 b6ac 0803 ............
  67761. 0803b6cc <rotek>:
  67762. 803b6cc: ebe3 0802 ebe9 0802 ebeb 0802 ebef 0802 ................
  67763. 803b6dc: 0002 0001 b5a0 0803 b674 0803 666e 0000 ........t...nf..
  67764. 803b6ec: 6e69 7469 0079 0000 6e61 0000 4241 4443 inity...an..ABCD
  67765. 803b6fc: 4645 0000 6261 6463 6665 0000 3130 3332 EF..abcdef..0123
  67766. 803b70c: 3534 3736 3938 0000 0043 0000 4f50 4953 456789..C...POSI
  67767. 803b71c: 0058 0000 0000 0000 002e 0000 X...........
  67768. 0803b728 <_init>:
  67769. 803b728: b5f8 push {r3, r4, r5, r6, r7, lr}
  67770. 803b72a: bf00 nop
  67771. 803b72c: bcf8 pop {r3, r4, r5, r6, r7}
  67772. 803b72e: bc08 pop {r3}
  67773. 803b730: 469e mov lr, r3
  67774. 803b732: 4770 bx lr
  67775. 0803b734 <_fini>:
  67776. 803b734: b5f8 push {r3, r4, r5, r6, r7, lr}
  67777. 803b736: bf00 nop
  67778. 803b738: bcf8 pop {r3, r4, r5, r6, r7}
  67779. 803b73a: bc08 pop {r3}
  67780. 803b73c: 469e mov lr, r3
  67781. 803b73e: 4770 bx lr